Страница 1 из 1
Чтение метки меню или пункта
Добавлено: 10 Август 2012, 15:42
slav95211
Помогите, пожалуйста в следующем Есть меню некоторого окошка. Необходимо читать метки меню или их пунктов. Пробовал использовать PROP:USE:
A = -2
TXT_NAME = A{PROP:TEXT}
TXT_USE = A{PROP:USE}
TXT_NAME дает наименование, а TXT_USE - пустую строку. Использую Clarion v6.3. Как быть, подскажи, пожалуйста.
Re: Чтение метки меню или пункта
Добавлено: 10 Август 2012, 21:13
Дед Пахом
метки не хранятся в скомпилированном коде.
Re: Чтение метки меню или пункта
Добавлено: 11 Август 2012, 17:44
Admin
Для чего вам чтение меток, может подскажем как без этого обойтись!?
Re: Чтение метки меню или пункта
Добавлено: 12 Август 2012, 19:13
Губин Игорь
Если во время исполнения нужны названия меток, то лучше это сделать через шаблон. У меня так построена локализация приложений.
Re: Чтение метки меню или пункта
Добавлено: 15 Август 2012, 9:46
slav95211
Метки необходимы вот для чего. В системе сохраняется текущее меню для того, чтобы можно было любой пункт меню настроить для конкретного пользователя (разрешить, запретить, открыть, закрыть). Так вот, если выводить на экран список наименований меню и пунктов меню, то невозможно различить, где меню, а где пункт этого меню. Например, есть меню Выход, которое включает пункт Выход. При отображении в списке оба они идут друг за другом, у меню, например, код -50, а у пункта -51. Хотелось бы в списке отличать меню от пунктов и отображать их разным цветом. Может есть какой-нибудь отличительный признак у них?
Re: Чтение метки меню или пункта
Добавлено: 15 Август 2012, 10:46
Дед Пахом
Судя по всему, ?Menu{prop:type} вернёт CREATE:menu, а ?Item{prop:type} вернёт CREATE:item
Re: Чтение метки меню или пункта
Добавлено: 15 Август 2012, 10:49
Admin
Самый простой вариант сделать шаблон который будет заточен под это дело...
к примеру:
Код: Выделить всё
#TEMPLATE (MENU_TEST, 'MENU_TEST'),FAMILY('ABC')
#CODE (MENU_TEST, 'MENU_TEST')
#FOR(%Control)
#IF(%ControlType = 'MENU')
!MENU %Control
#ENDIF
#IF(%ControlType = 'ITEM')
!ITEM %Control
#ENDIF
#ENDFOR
к примеру прицепив его на кнопку на фрейме получаем в коде
Код: Выделить всё
OF ?Button4
! Start of "Control Event Handling"
!MENU ?FileMenu
!ITEM ?PrintSetup
!ITEM
!ITEM ?Exit
!MENU ?EditMenu
!ITEM ?Cut
!ITEM ?Copy
!ITEM ?Paste
!MENU
!ITEM ?Tile
!ITEM ?Cascade
!ITEM ?Arrange
!MENU
!ITEM ?Helpindex
!ITEM ?HelpSearch
!ITEM ?HelpOnHelp
Далее все зависит от твоей фантазии.
Ну типа
Код: Выделить всё
controls.use = '%Control'
controls.ctrltype = 'menu'
add(controls)
и т.д.
Название пункта тоже можно взять из символа
%ControlStatement
Читай про шаблоны...
P.S. В коде видим пункты без USE метки... Кларион любит "непоставить" метки некоторым пунктам. Сам туда их запиши.
Re: Чтение метки меню или пункта
Добавлено: 15 Август 2012, 10:56
Admin
Дед Пахом писал(а):Судя по всему, ?Menu{prop:type} вернёт CREATE:menu, а ?Item{prop:type} вернёт CREATE:item
Да... если есть желание можно и в коде перебрать все контролы...
Ток без USE метки.
Код: Выделить всё
LOOP
ThisField=SELF.Window{Prop:NextField,ThisField}
IF ~ThisField BREAK END
MESSAGE(ThisField{PROP:Text},ThisField{PROP:Type})
END
Был один хак одно время для получения метки недокументированной функцией, но я бы не советовал пользоваться.
Если метки нужны 100% то через шаблон или руками...
Re: Чтение метки меню или пункта
Добавлено: 15 Август 2012, 23:51
Shur
...А не через шаблон можно вязаться к полному пути элемента меню (...<прародитель>.<родитель>.<элемент>). На прежней работе мне хватало даже одного родителя (<родитель>.<элемент>).
Посидев сейчас в мыслях над subj, я немного развил цикл прохода по меню.
Код: Выделить всё
GLO:MenuQueue QUEUE,PRE(GMQ)
Eq LONG
Name CSTRING(256)
Level LONG
FullName CSTRING(1024)
DotNotation CSTRING(256)
Hidden BYTE
Disabled BYTE
Type BYTE
END
CODE
free(GLO:MenuQueue)
Loop
ThisField# = AppFrame{Prop:NextField,ThisField#}
If ThisField#
clear(GLO:MenuQueue)
if ThisField#{PROP:Text} = ''
if ThisField# = -1
GMQ:Name = 'Menu'
GMQ:FullName = 'Menu'
ELSE
GMQ:Name = '---------'
GMQ:FullName = '-'
end
else
GMQ:Name = ThisField#{PROP:Text}
GMQ:FullName = ThisField#{PROP:Text}
end
GMQ:Eq = ThisField#
GMQ:DotNotation = format(ThisField#,@n-04)
GMQ:Hidden = ThisField#{PROP:Hide}
GMQ:Disabled = ThisField#{PROP:Disable}
GMQ:Type = ThisField#{PROP:Type}
GMQ:Level = 1
Parent# = ThisField#
loop
Parent# = Parent#{PROP:Parent}
if Parent#
GMQ:FullName = choose(Parent#{PROP:Text}='','Menu',Parent#{PROP:Text}) & '|' & GMQ:FullName
GMQ:DotNotation = format(Parent#,@n-04) & '.' & GMQ:DotNotation
GMQ:Level += 1
ELSE
break
end
end
add(GLO:MenuQueue,+GMQ:DotNotation)
ELSE
BREAK
END
end
start(ShowMenuTree,35000)
Посмотреть результат можно, выполнив процедуру ShowMenuTree, которую я приложил в зазипованом TXA-формате.
Re: Чтение метки меню или пункта
Добавлено: 17 Август 2012, 10:33
slav95211
Большое спасибо за рекомендации.