Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Макроподстановка  [new]
Valerii
Member

Откуда:
Сообщений: 749
Народ,
Есть ситуация:
Присвоил форме свойство Thisform.m1
Его значение в окне свойства присвоены как:
'Внимание - Ошибка работы приложения!!!!!!',8+48+256,'Внимание' - точь в точь без дополнительных кавычек как символьное значение.
теперь хочу отобразить в MessageBox() это сообщение в стиле и с кнопками как 8+48+256 ....
если это делать сразу как
MessageBox(&Thisform.m1) происходить ошибка: Function name is missing ).
Но если сделать это иначе:

x= Thisform.m1
MessageBox(&x)

все отрабатывается прекрасно. Кто даст намек из=за чего и как этот случай настроить чтобы все работало как
MessageBox(&Thisform.m1)
Всем спасибо!!!!!

К сообщению приложен файл. Размер - 5Kb
15 мар 18, 16:54    [21259473]     Ответить | Цитировать Сообщить модератору
 Re: Макроподстановка  [new]
Valerii
Member

Откуда:
Сообщений: 749
Valerii
Народ,
Есть ситуация:
Присвоил форме свойство Thisform.m1
Его значение в окне свойства присвоены как:
'Внимание - Ошибка работы приложения!!!!!!',8+48+256,'Внимание' - точь в точь без дополнительных кавычек как символьное значение.
теперь хочу отобразить в MessageBox() это сообщение в стиле и с кнопками как 8+48+256 ....
если это делать сразу как
MessageBox(&Thisform.m1) происходить ошибка: Function name is missing ).
Но если сделать это иначе:

x= Thisform.m1
MessageBox(&x)

все отрабатывается прекрасно. Кто даст намек из=за чего и как этот случай настроить чтобы все работало как
MessageBox(&Thisform.m1)
Всем спасибо!!!!!



EVALUATE('MESSAGEBOX('+.m1+')')
это не предлагать ... ;-)
15 мар 18, 17:04    [21259536]     Ответить | Цитировать Сообщить модератору
 Re: Макроподстановка  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1547
Valerii
MessageBox(&Thisform.m1) происходить ошибка: Function name is missing ).
Но если сделать это иначе:

x= Thisform.m1
MessageBox(&x)

все отрабатывается прекрасно. Кто даст намек из=за чего
В выражении &Thisform.m1 у точки совсем не тот смысл, который вы ожидаете. Внимательно почитайте хелп про макроподстановку и особенно про её ограничители.
15 мар 18, 17:19    [21259621]     Ответить | Цитировать Сообщить модератору
 Re: Макроподстановка  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Valerii,

Вам сюда Макроподстановка

Насчет указанной ошибки - это раздел в этой статье "Особенности использования макроподстановки"

Насчет Evaluate(), если результат вычисления записанного выражения - это символьная строка, то использовать надо так

MessageBox(Evaluate(ThisForm.m1))
16 мар 18, 09:20    [21260431]     Ответить | Цитировать Сообщить модератору
 Re: Макроподстановка  [new]
Valerii
Member

Откуда:
Сообщений: 749
ВладимирМ
Valerii,

Вам сюда Макроподстановка

Насчет указанной ошибки - это раздел в этой статье "Особенности использования макроподстановки"

Насчет Evaluate(), если результат вычисления записанного выражения - это символьная строка, то использовать надо так

MessageBox(Evaluate(ThisForm.m1))


MessageBox(Evaluate(ThisForm.m1)) - не работает ... Syntax Error
16 мар 18, 09:32    [21260473]     Ответить | Цитировать Сообщить модератору
 Re: Макроподстановка  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Valerii,

А пример того, что записано в Thisform.m1 можете привести? Если там просто текст, то макроподстановка вообще не нужна

MessageBox(Thisform.m1)
16 мар 18, 09:44    [21260523]     Ответить | Цитировать Сообщить модератору
 Re: Макроподстановка  [new]
Valerii
Member

Откуда:
Сообщений: 749
Valerii
ВладимирМ
Valerii,

Вам сюда Макроподстановка

Насчет указанной ошибки - это раздел в этой статье "Особенности использования макроподстановки"

Насчет Evaluate(), если результат вычисления записанного выражения - это символьная строка, то использовать надо так

MessageBox(Evaluate(ThisForm.m1))


MessageBox(Evaluate(ThisForm.m1)) - не работает ... Syntax Error


thisform.m1 = 'Нет выбранных значений!!!',8+48+256,'Внимание'

НО .... 'Нет выбранных значений!!!',8+48+256,'Внимание' записано в окне свойств формы для этого свойства m1.
Я грешу и на этот момент ...

Это сделано для многоязычной поддержки. То есть - есть на форме класс который при запуске формы переопределят свойства текста и объектов на форме. Если в базе нужному свойству или объекту есть значение для перевода, тогда выполняется подмена, если нет остается то что заложено по умолчанию этому свойству на форме. Сначала для MessageBox я использовал два свойства , str1 str2 но потом подумал что это изврат забивать память переменными (этих свойств столько, сколько уникальных сообщений MessageBox-ов ) и решил впихнуть все в одну переменную исключая дополнительные изменения в коде приложения.

Дергать постоянно переводы из удаленного сервера БД по-моему некрасивое/неправильное решение, так как при работе mеsagebox ы выскакивают постоянно...
Конечно я могу пойти по пути x = thisform.m1 или EVALUATE('MESSAGEBOX('+.m1+')') ...но хотелось бы разобраться с этой ситуацией...
Спасибо заранее.
16 мар 18, 10:31    [21260667]     Ответить | Цитировать Сообщить модератору
 Re: Макроподстановка  [new]
Valerii
Member

Откуда:
Сообщений: 749
Valerii
Valerii
пропущено...


MessageBox(Evaluate(ThisForm.m1)) - не работает ... Syntax Error


thisform.m1 = 'Нет выбранных значений!!!',8+48+256,'Внимание'

НО .... 'Нет выбранных значений!!!',8+48+256,'Внимание' записано в окне свойств формы для этого свойства m1.
Я грешу и на этот момент ...

Это сделано для многоязычной поддержки. То есть - есть на форме класс который при запуске формы переопределят свойства текста и объектов на форме. Если в базе нужному свойству или объекту есть значение для перевода, тогда выполняется подмена, если нет остается то что заложено по умолчанию этому свойству на форме. Сначала для MessageBox я использовал два свойства , str1 str2 но потом подумал что это изврат забивать память переменными (этих свойств столько, сколько уникальных сообщений MessageBox-ов ) и решил впихнуть все в одну переменную исключая дополнительные изменения в коде приложения.

Дергать постоянно переводы из удаленного сервера БД по-моему некрасивое/неправильное решение, так как при работе mеsagebox ы выскакивают постоянно...
Конечно я могу пойти по пути x = thisform.m1 или EVALUATE('MESSAGEBOX('+.m1+')') ...но хотелось бы разобраться с этой ситуацией...

Спасибо заранее.



Thisform.m1 = []'Нет выбранных значений!!!']+',8+48+256,'+[Внимание!'] и даже так тоже ошибку выдает.
Но достаточно сделать еще x= Thisform.m1
и
MessageBox(&x) - oK!!!!
16 мар 18, 10:48    [21260734]     Ответить | Цитировать Сообщить модератору
 Re: Макроподстановка  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Да. Выбранный Вами способ реализации предполагает только макроподстановку. Без вариантов. Либо через & с дополнительной точкой, либо evaluate('messageBox()')

В выбранной Вами реализации без макроподстановки, теоретически, можно обойтись, только если предварительно "распарсить" строку на 3 отдельных параметра. Да и то, числовое значение все-равно придется через макроподстановку вычислять. Кроме того, для парсинга будут проблемы, если сам текст содержит запятые

PS: Только непонятно, почему для хранения текста выбрали свойства формы, а не поля таблицы, что для СУБД было бы логичнее. Тогда и вопроса бы не стояло. Ну, или хотя бы структурированный текстовый файл. XML, например, или INI.
16 мар 18, 10:54    [21260754]     Ответить | Цитировать Сообщить модератору
 Re: Макроподстановка  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Valerii
Thisform.m1 = []'Нет выбранных значений!!!']+',8+48+256,'+[Внимание!'] и даже так тоже ошибку выдает.
Но достаточно сделать еще x= Thisform.m1
и
MessageBox(&x) - oK!!!!


Т.е. статью по ссылке Вы так и не прочитали. И то, что проблема решается дополнительной точкой - не в курсе. Что ж. Ваш выбор...
16 мар 18, 10:55    [21260761]     Ответить | Цитировать Сообщить модератору
 Re: Макроподстановка  [new]
Valerii
Member

Откуда:
Сообщений: 749
ВладимирМ
Valerii
Thisform.m1 = []'Нет выбранных значений!!!']+',8+48+256,'+[Внимание!'] и даже так тоже ошибку выдает.
Но достаточно сделать еще x= Thisform.m1
и
MessageBox(&x) - oK!!!!


Т.е. статью по ссылке Вы так и не прочитали. И то, что проблема решается дополнительной точкой - не в курсе. Что ж. Ваш выбор...


Почитал от корочки до корочки. Пробовал - не работает. Сильно не напрягался - с лету не вышло - бросил. Да и усложнять формат записи переводов в БД не хочется...

Теперь про вопрос:
PS: Только непонятно, почему для хранения текста выбрали свойства формы, а не поля таблицы, что для СУБД было бы логичнее. Тогда и вопроса бы не стояло. Ну, или хотя бы структурированный текстовый файл. XML, например, или INI.

Свойства формы я выбрал для того - чтобы:
1. Так как помимо MessageBox-ов переводятся caption классов label, commandbuton, grid..header, optionGroup..option, pageframe..page, tooltips и еще парочку , не стану все перечислять, то есть все то где есть тексты сообщений, и то что я выдернул скриптом из всех форм - их около 175 ... получилось около 3500 наименований переводов...
Это все было загнано в таблицу БД.. (я использую в качестве хранилища MS SQL Server)....!!!! Про это я забыл сказать.. настолько у меня все это по умолчанию ;-) Поэтому эта технология диктует свои условия и требования к приложению в части производительности и минимальных нагрузок.
А так как мне также не очень хочется перепахивать весь код - я дернул MessageBox скриптом и тоже вогнал их в БД, вернее то что в "()"
Теперь это значение мне нужно подставить в код форм - там где есть эти информационные сообщения. Текст очень разношерстный и нельзя как-то это все привести к парочкам фраз в добавок не только ОК или Да, нет на кнопках. То есть поэтому сот всем этим хотелось взлететь на макроподстановках. Я конечно максимально приблизился к цели - но, придется руцями вставить в код x = Thisfom.mxxx
перед самим MessageBox(&x).
INI файл - понятно - огромный , локально его потом всем обновлять - поэтому сразу отпало. потом перебор элементов формы из ини-шного файла - целый гемор, в принципе как и XML который тоже нужно парсить.
Поэтому остановился на конструкции uid,frmname,objname,objvalue,objleft,objtop,language и теперь кол-во языков в принципе неограниченно. Легко править переводы для отдельных формы .. короче преимуществ мне кажется больше.

Кстати не искал , но наверняка кто-то реализовывал эту задачу - переделать проект под много языковую поддержку ...
Тем не менее Владимир, Вам спасибо. На Ваши советы всегда можно спокойно положиться как на самые верные.
16 мар 18, 13:36    [21261440]     Ответить | Цитировать Сообщить модератору
 Re: Макроподстановка  [new]
Dima T
Member

Откуда:
Сообщений: 15294
Valerii
ВладимирМ
пропущено...


Т.е. статью по ссылке Вы так и не прочитали. И то, что проблема решается дополнительной точкой - не в курсе. Что ж. Ваш выбор...


Почитал от корочки до корочки. Пробовал - не работает. Сильно не напрягался - с лету не вышло - бросил. Да и усложнять формат записи переводов в БД не хочется...

Жмем F1 и читаем
HELP
& Command

& VarName[.cExpression]
...

[. cExpression]
The optional period (.) delimiter and .cExpression are used to append additional characters to a macro. cExpression appended to the macro with .cExpression can also be a macro. If cExpression is a property name, include an extra period (cExpression..PropertyName).
16 мар 18, 13:56    [21261504]     Ответить | Цитировать Сообщить модератору
 Re: Макроподстановка  [new]
Valerii
Member

Откуда:
Сообщений: 749
Dima T
Valerii
пропущено...


Почитал от корочки до корочки. Пробовал - не работает. Сильно не напрягался - с лету не вышло - бросил. Да и усложнять формат записи переводов в БД не хочется...

Жмем F1 и читаем
HELP
& Command

& VarName[.cExpression]
...

[. cExpression]
The optional period (.) delimiter and .cExpression are used to append additional characters to a macro. cExpression appended to the macro with .cExpression can also be a macro. If cExpression is a property name, include an extra period (cExpression..PropertyName).

И добавлял ... и что ... ничего .. тоже самое.
16 мар 18, 14:02    [21261517]     Ответить | Цитировать Сообщить модератору
 Re: Макроподстановка  [new]
Dima T
Member

Откуда:
Сообщений: 15294
Valerii
Я конечно максимально приблизился к цели - но, придется руцями вставить в код x = Thisfom.mxxx
перед самим MessageBox(&x).

Можно сделать обертку
MyMsgBox
lpara x
MessageBox(&x)

И автозаменой все MessageBox заменить на MyMsgBox
16 мар 18, 14:08    [21261537]     Ответить | Цитировать Сообщить модератору
 Re: Макроподстановка  [new]
Valerii
Member

Откуда:
Сообщений: 749
Dima T
Valerii
Я конечно максимально приблизился к цели - но, придется руцями вставить в код x = Thisfom.mxxx
перед самим MessageBox(&x).

Можно сделать обертку
MyMsgBox
lpara x
MessageBox(&x)

И автозаменой все MessageBox заменить на MyMsgBox


Кстати да ... :-)
Я открываю форму как таблицу и и перебираю все методы и в строке где есть MessageBox $ xLine (xLine = MEMLINES(ObjProp))
меняю эту строку на свою Поэтому хотел одним заходом ...
16 мар 18, 14:22    [21261584]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить