Чтение метки меню или пункта

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
slav95211
Новичок
Сообщения: 8
Зарегистрирован: 10 Август 2012, 15:27

Чтение метки меню или пункта

Сообщение slav95211 »

Помогите, пожалуйста в следующем Есть меню некоторого окошка. Необходимо читать метки меню или их пунктов. Пробовал использовать PROP:USE:
A = -2
TXT_NAME = A{PROP:TEXT}
TXT_USE = A{PROP:USE}
TXT_NAME дает наименование, а TXT_USE - пустую строку. Использую Clarion v6.3. Как быть, подскажи, пожалуйста.
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Re: Чтение метки меню или пункта

Сообщение Дед Пахом »

метки не хранятся в скомпилированном коде.
С уважением, ДП
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Re: Чтение метки меню или пункта

Сообщение Admin »

Для чего вам чтение меток, может подскажем как без этого обойтись!?
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Губин Игорь
Шубуршун
Сообщения: 2584
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Благодарил (а): 3 раза
Поблагодарили: 26 раз

Re: Чтение метки меню или пункта

Сообщение Губин Игорь »

Если во время исполнения нужны названия меток, то лучше это сделать через шаблон. У меня так построена локализация приложений.
Это я только кажусь дураком! На самом деле я полный идиот!
slav95211
Новичок
Сообщения: 8
Зарегистрирован: 10 Август 2012, 15:27

Re: Чтение метки меню или пункта

Сообщение slav95211 »

Метки необходимы вот для чего. В системе сохраняется текущее меню для того, чтобы можно было любой пункт меню настроить для конкретного пользователя (разрешить, запретить, открыть, закрыть). Так вот, если выводить на экран список наименований меню и пунктов меню, то невозможно различить, где меню, а где пункт этого меню. Например, есть меню Выход, которое включает пункт Выход. При отображении в списке оба они идут друг за другом, у меню, например, код -50, а у пункта -51. Хотелось бы в списке отличать меню от пунктов и отображать их разным цветом. Может есть какой-нибудь отличительный признак у них?
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Re: Чтение метки меню или пункта

Сообщение Дед Пахом »

Судя по всему, ?Menu{prop:type} вернёт CREATE:menu, а ?Item{prop:type} вернёт CREATE:item
С уважением, ДП
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Re: Чтение метки меню или пункта

Сообщение 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 метки... Кларион любит "непоставить" метки некоторым пунктам. Сам туда их запиши.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Re: Чтение метки меню или пункта

Сообщение 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% то через шаблон или руками...
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Shur
Ветеран
Сообщения: 384
Зарегистрирован: 02 Июль 2011, 18:49

Re: Чтение метки меню или пункта

Сообщение 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-формате.
Вложения
ShowMenu.zip
(2.11 КБ) 198 скачиваний
slav95211
Новичок
Сообщения: 8
Зарегистрирован: 10 Август 2012, 15:27

Re: Чтение метки меню или пункта

Сообщение slav95211 »

Большое спасибо за рекомендации.
Ответить