Комментарии по Alt-A
Select messages from
# through # FAQ
[/[Print]\]

-> Программирование в БЭСТ-4

#1: Комментарии по Alt-A Author: Дениска PostPosted: 11 Aug 2007 09:09
    —
Делаю свой InitList. Хочу выводить на просмотр и редактировать мемо-поле, при этом чтобы вызов был стандартный по Alt-A, со стандартным окном (как в БЭСТ-е).
Пытаюсь так:
Code:

 #define K_ALT_A 286
...
 SETKEY(K_ALT_A, {||MemoEdit(F_files->MemoField), 2})

В принципе работает, но окно на весь экран и цвет не тот.

Если сделать, так:
Code:

  SETKEY(K_ALT_A, {||MemoEdit(F_files->MemoField, nRow+1,nCol+1,nRow+11, nCol+49,,,200), 2})

То окно видимо не на весь экран, но так как цвет такой же как и у основного экрана, то получается еще хуже

В Уроке 201 Событие "Прайс-лист" вижу текст:
Code:

SetKey(K_ALT_A,{|lAdd|  lAdd := .F.,pSclads := IF("│││" $ MLABEL->SCLADS,(lAdd := .T.,BEFORATNUM("│││",MLABEL->Sclads)),MLABEL->Sclads),MLABEL->(Comment()),IF(MLABEL->(RecLock()),(MLABEL->SCLADS := pSclads+IF(lAdd,"│││"+AFTERATNUM("│││",MLABEL->SCLADS,1),""),MLABEL->(dbUnLock())),NIL),pSclads := "" })

Это то, что надо? Если да, то мне не понятно как с этим работать

#2:  Author: Дениска PostPosted: 11 Aug 2007 09:46
    —
Наверно правильней через HotKey, а не через SETKEY.
Но это похоже принципиально ситуацию не меняет
Code:

  aHotKey:={{},{},{{'A - Комментарий', K_ALT_A,{||MemoEdit(F_files->MemoField)},1}}}

#3:  Author: Дениска PostPosted: 11 Aug 2007 15:23
    —
И еще проблемка. MemoEdit читает не все мемо-поля, он не читает мемо-поле, если у него тип "A".

#4:  Author: Andr_VLocation: Andr_V PostPosted: 11 Aug 2007 16:12
    —
Чтоб по Alt-A как в БЭСТе я пользую функцию COMMENTPART(p1,p2,p3)
как я понял:p1<>nil -разрешает запись в мемо
p2<>nil -вообще не дает вводить че-либо
p3 - имя мемо без "" (если отличное от SCLADS)
Но у меня не получилось сохранить, если имя мемо не SCLADS (показывать показывает, но не сохраняет). Может уважаемый nordk что прояснит?

#5: Re: Комментарии по Alt-A Author: nordkLocation: Горбунов Константин PostPosted: 13 Aug 2007 00:01
    —
Дениска wrote:
Делаю свой InitList. Хочу выводить на просмотр и редактировать мемо-поле, при этом чтобы вызов был стандартный по Alt-A, со стандартным окном (как в БЭСТ-е).
В Уроке 201 Событие "Прайс-лист" вижу текст:
Code:

SetKey(K_ALT_A,{|lAdd|  lAdd := .F.,pSclads := IF("│││" $ MLABEL->SCLADS,(lAdd := .T.,BEFORATNUM("│││",MLABEL->Sclads)),MLABEL->Sclads),MLABEL->(Comment()),IF(MLABEL->(RecLock()),(MLABEL->SCLADS := pSclads+IF(lAdd,"│││"+AFTERATNUM("│││",MLABEL->SCLADS,1),""),MLABEL->(dbUnLock())),NIL),pSclads := "" })

Это то, что надо? Если да, то мне не понятно как с этим работать

Это именно так организовано в БЭСТе чтение мемо-поля номенклатурного справочника. Что конкретно в этой записи Вам непонятно ?
Что касается memoedit, то там есть параметры отвечающие за размер.
Посмотрительно внимательно NG идущий в поставке с БЭСТ-4+

#6:  Author: nordkLocation: Горбунов Константин PostPosted: 13 Aug 2007 00:15
    —
Если посмотрите внимательно, то для просмотра мемополя в данной ситуации используется функция
Code:
FUNCTION Comment(lWrite,lView)

В ней в итоге работает memoedit вот так:
Code:
pSclads:=MEMOEDIT(pSclads,nTop+1,nLeft+1,nBottom-1,nRight-1,(lView==NIL),'FunBook',100)

Если говорить о функции
Code:
                  FUNCTION CommentPart(lWrite,lView,cComm)
//--------------------------------------------------------------------------//
// cComm - начальный текст комментария, передается по ссылке

То как видите у нее отличие в третьем параметре и в вызове Memoedit
вот так:
Code:
cSclads:=MEMOEDIT(cSclads,nTop+1,nLeft+1,nBottom-1,nRight-1,(lView==NIL),'FunBook',100)


Как видите и в том и в другом случае мы приходим к использованию
функции MemoEdit.
Что касается типа А это уже означает что у Вас в memo-поле лежат массивы, а не символьные строки т стало быть Вам наверно правильнее
memo-поле изначально скинуть в массив все содержимое преобразовать в форматированную текстовую строку и вот тогда это дело через MemoEdit.
Инными словами не пытайтесь ничего толкать кроме символьной строки.
Просто в отдельных случаях разработчик уверен что там не будет
ничего другого и потому применяет сразу Memoedit.
Вы же задаете вопрос в общем виде, не конкретизируя что надо именно Вам,а стало быть получайте и решение в общем виде.....

#7:  Author: Дениска PostPosted: 13 Aug 2007 08:27
    —
Вопрос был в оформлении. Сделал пока примерно так:

Code:

#define K_ALT_A 286
NETUSE("F_Var",LOADPATH() + "var.dbf")
...
aHotKey:={{},{},{{'A - Комментарий', K_ALT_A,{||MyMemoEdit(F_Var->Var_Mem)},2}}}
....
Function MyMemoEdit(aMemoField)
  Local nRow:=04, nCol:=14
  Local aNewColor, aOldColor

  aNewColor := "14/9, 0/7, 0/0, 0/0, 15/1"

  aOldColor := SetColor(aNewColor)

  DISPBOX(nRow,nCol,nRow+16,nCol+50,( CHR( 201 ) + CHR( 205 ) + CHR( 187 ) + CHR( 186 ) + CHR( 188 ) + CHR( 205 ) + CHR( 200 ) + CHR( 186 )+' ' ),;
  "14/9")

  IF ValType(aMemoField) = "A"
    SayAndWait("Массивы пока не поддерживаются")
  Else
    MemoEdit(aMemoField, nRow+1,nCol+1,nRow+15, nCol+49,.T.,,254)
  EndIf

  SetColor(aOldColor)
Return


Проблема: "Изменение по Ctrl-W не сохраняются."

#8:  Author: Дениска PostPosted: 13 Aug 2007 08:32
    —
nordk wrote:

Что касается типа А это уже означает что у Вас в memo-поле лежат массивы, а не символьные строки т стало быть Вам наверно правильнее
memo-поле изначально скинуть в массив все содержимое преобразовать в форматированную текстовую строку и вот тогда это дело через MemoEdit.
Инными словами не пытайтесь ничего толкать кроме символьной строки.
Просто в отдельных случаях разработчик уверен что там не будет
ничего другого и потому применяет сразу Memoedit.


Как memo-поле в котором лежит массив преобразовать в форматированную текстовую строку?

#9:  Author: nordkLocation: Горбунов Константин PostPosted: 13 Aug 2007 11:03
    —
Дениска wrote:
nordk wrote:

Что касается типа А это уже означает что у Вас в memo-поле лежат массивы, а не символьные строки т стало быть Вам наверно правильнее
memo-поле изначально скинуть в массив все содержимое преобразовать в форматированную текстовую строку и вот тогда это дело через MemoEdit.
Инными словами не пытайтесь ничего толкать кроме символьной строки.
Просто в отдельных случаях разработчик уверен что там не будет
ничего другого и потому применяет сразу Memoedit.


Как memo-поле в котором лежит массив преобразовать в форматированную текстовую строку?

Изучаете структуру массива:
1. Какой он одномерный или многомерный
2.Какие значения могут лежат только ли символьные (нужно ли преобразовывать)
3.Дальше путем перебора в цикле или через AEVAL
создаете символьную стро

#10:  Author: nordkLocation: Горбунов Константин PostPosted: 13 Aug 2007 11:07
    —
Дениска wrote:

Проблема: "Изменение по Ctrl-W не сохраняются."


Выложил описание функции Comment().
Там увидите ответ на Ваш вопрос и собственно образец решения

#11:  Author: Дениска PostPosted: 20 Aug 2007 06:38
    —
nordk wrote:
Дениска wrote:

Проблема: "Изменение по Ctrl-W не сохраняются."


Выложил описание функции Comment().
Там увидите ответ на Ваш вопрос и собственно образец решения


Изменения теперь сохраняются. Функция теперь примерно такая:
Code:

Function Main()
...
  NETUSE("F_Var",LOADPATH() + "var.dbf")
...
  aHotKey:={{},{},{{'A - Комментарий', K_ALT_A,{||MyMemoEdit(F_Var->Var_mem)},2}}}
...
Return

Function MyMemoEdit(aMemoField)
...
  IF ValType(aMemoField) = "A"
    SayAndWait("Массивы пока не поддерживаются")
  Else
    aMemoField := MemoEdit(aMemoField, nRow+1,nCol+1,nRow+15, nCol+49,.T.,,254)
  EndIf

  If !aMemoField == aMemoFieldOld
   altd()
    select F_Var
    RecLock()
    REPLACE Var_Mem WITH aMemoField
    F_dbUnlock()
    COMMIT
  EndIf
...
Return


Но мне не нравится, что функция Comment() и моя функция привязаны к конкретному файлу, к конкретному полю. В моей функции (аналогичная ситуация и в функции Comment()) это происходит из-за этого куска кода:
Code:

    select F_Var
    RecLock()
    REPLACE Var_Mem WITH aMemoField


Как изменить функцию, чтобы она была универсальной? Можно ли сделать примерно так:
Code:

...
  aHotKey:={{},{},{{'A - Комментарий', K_ALT_A,{||MyMemoEdit(F_Var->Var_mem, FileName, FieldName)},2}}}
...
Function MyMemoEdit(aMemoField, FileName, FieldName)
...
    select FileName
    RecLock()
    REPLACE FieldName WITH aMemoField

?
Или может можно или лучше сделать как-то по-другому?

#12:  Author: Дениска PostPosted: 20 Aug 2007 08:43
    —
nordk wrote:

Что касается типа А это уже означает что у Вас в memo-поле лежат массивы, а не символьные строки т стало быть Вам наверно правильнее
memo-поле изначально скинуть в массив все содержимое преобразовать в форматированную текстовую строку и вот тогда это дело через MemoEdit.

...

Изучаете структуру массива:
1. Какой он одномерный или многомерный
2.Какие значения могут лежат только ли символьные (нужно ли преобразовывать)
3.Дальше путем перебора в цикле или через AEVAL
создаете символьную строку


Понятно, что зная структуру массива можно перебором преобразовать его в текстовый вид, но хочется более простой и универсальный способ. Скажем просмоторщик dbf файлов bdbfs, показывает такие поля как текстовые в виде с фигурными скобками (правда исправлять он их похоже не умеет), при этом он естественно не знает структуру массива. В нем или куча проверок или есть какая-то "хитрушка", с помощью которой это делается проще

Вообщем, если этой "хитрушки" нет, то делаю в лоб и вопрос снят

P.S. Есть функция, которая переводит одномерный массив в строк

#13:  Author: nordkLocation: Горбунов Константин PostPosted: 20 Aug 2007 11:58
    —
Code:
c:=""
AEVAL(a,{|x|c+=x+";"})

А преобразователь типов смотрите в уроке про Excel и вроде в событии
прайс_лист (урок 201) тоже есть.
Функция XXTOC()



-> Программирование в БЭСТ-4


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Page 1 of 1

Powered by phpBB © 2001, 2005 phpBB Group