Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Имя и номер элемента меню / 4 сообщений из 4, страница 1 из 1
31.07.2007, 11:01
    #34694798
shanton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя и номер элемента меню
Доступность или не доступность элемнта меню определяется в процедуре CheckMenu_ArchArt, входными параметрами которой есть номер элемента меню и имя меню:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
PROCEDURE CheckMenu_ArchArt
	LPARAMETERS tnBar, tcMenu

	DO CASE
	CASE tcMenu=[arc_pad01_popup]
		DO CASE
		CASE tnBar= 1 
			......
		CASE tnBar= 2  OR tnBar= 3  OR tnBar= 4 
			......
		ENDCASE
	CASE tcMenu=[arc_pad02_popup]
		DO CASE
		CASE tnBar= 1 
			......
		CASE tnBar= 2 
			......
		ENDCASE
	ENDCASE
ENDPROC

определение меню:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
#DEFINE C_MENU_ARCH	"ArchMenu"

DEFINE MENU (C_MENU_ARCH) BAR

DEFINE PAD pad01 OF (C_MENU_ARCH) PROMPT 'Äîêóìåíò'
DEFINE PAD pad02 OF (C_MENU_ARCH) PROMPT 'Îáüåêò'

ON PAD pad01 OF (C_MENU_ARCH) ACTIVATE POPUP arc_pad01_popup
ON PAD pad02 OF (C_MENU_ARCH) ACTIVATE POPUP arc_pad02_popup

DEFINE POPUP arc_pad01_popup MARGIN RELATIVE
DEFINE POPUP arc_pad02_popup MARGIN RELATIVE

DEFINE BAR  1  OF arc_pad01_popup PROMPT 'Íîâûé' SKIP FOR CheckMenu_ArchArt( 1 ,'arc_pad01_popup')
DEFINE BAR  2  OF arc_pad01_popup PROMPT 'Âçÿòè íà ðåäàêòèðîâàíèå' SKIP FOR CheckMenu_ArchArt( 2 ,'arc_pad01_popup')
DEFINE BAR  3  OF arc_pad01_popup PROMPT 'Âåðíóòü â àðõèâ' SKIP FOR CheckMenu_ArchArt( 3 ,'arc_pad01_popup')
DEFINE BAR  4  OF arc_pad01_popup PROMPT 'Óäàëèòü' SKIP FOR CheckMenu_ArchArt( 4 ,'arc_pad01_popup')
DEFINE BAR  5  OF arc_pad01_popup PROMPT '\-'
DEFINE BAR  6  OF arc_pad01_popup PROMPT 'Êàðòî÷êà'

DEFINE BAR  1  OF arc_pad02_popup PROMPT 'Íîâûé' SKIP FOR CheckMenu_ArchArt( 1 ,'arc_pad02_popup')
DEFINE BAR  2  OF arc_pad02_popup PROMPT 'Íîâîå èñïîíåíèå' SKIP FOR CheckMenu_ArchArt( 2 ,'arc_pad02_popup')
DEFINE BAR  3  OF arc_pad02_popup PROMPT '\-'
DEFINE BAR  4  OF arc_pad02_popup PROMPT 'Êàðòî÷êà'

как видете всегда когда я вызываю процедуру CheckMenu_ArchArt я указываю номер элемента меню и имя меню. А нельзя чтобы эти параметры получать через функции а не явно, например:
Код: plaintext
CheckMenu_ArchArt(BAR(),POPUP())
функции BAR(),POPUP() не подойдут так как возвращают последнее выбраное меню.
...
Рейтинг: 0 / 0
31.07.2007, 14:33
    #34695645
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя и номер элемента меню
Насколько я знаю, ничего подобного для данной задачи нет.

Если основная цель - это не зависеть от конкретного номера BAR-пункта, то, единственный путь, дающий гарантированный результат - это метаданные. Т.е. структуру меню хранить в таблицах базы данных, а само меню строить динамически, на основе данных из этих таблиц.

Ну, простейший вариант, чтобы показать общий принцип.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE CURSOR test (BarNum I, PromptName V( 50 ))
INSERT INTO test values ( 1 , "Вход")
INSERT INTO test values ( 2 , "Выход")

DEFINE MENU (C_MENU_ARCH) BAR
...

select test
SCAN
	DEFINE BAR test.BarNum OF arc_pad01_popup PROMPT test.PromptName ;
		SKIP FOR CheckMenu_ArchArt(test.BarNum,'arc_pad01_popup')
ENDSCAN

Собственно, все меню целиком заносить в таблицу метаданных смысла нет. В данном случае достаточно только собственно BAR пунктов со ссылкой на соответсвующее выпадающее POPUP-меню.

Хотя, разумеется, можно "забить" все номера в файл #INCLUDE или же вместо номеров в процедуре CheckMenu_ArchArt использовать какие-либо символьные идентификаторы, более менее осмысленно звучащие. Вроде Bar1, Bar2 и т.п.
...
Рейтинг: 0 / 0
31.07.2007, 14:52
    #34695736
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя и номер элемента меню
shanton

посмотрите в сторону
http://www.codeplex.com/VFPX/Release/ProjectReleases.aspx?ReleaseId=61

и

* Program....: FoxMenu.prg
* Notice.....: Copyright (c) 2002 Microsoft Corp.
* Compiler...: Visual FoxPro 8.0
* Abstract...:
* Wraps context-sensitive (right-click) menu functionality in an object.
* Changes....:
...
Рейтинг: 0 / 0
31.07.2007, 15:24
    #34695887
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя и номер элемента меню
2 прошелмимо

Объектная обертка меню не решает описанной проблемы, а всего-лишь "переводит" ее в другую плоскость. Те же "грабли", но вид сбоку. У него ведь проблема не в способе формирования пунктов, а в способе анализа пунктов.

Он знает, как надо анализировать некий пункт меню, но не знает, какой именно идентификатор получит этот пункт меню. Пока он строит анализ, исходя из предположения , что у каждого пункта меню будет некий фиксированный идентификатор. Поскольку, вероятно, этот идентификатор присваивает не он сам, а, например, дизайнер меню, то он и не уверен, что индентификатор не изменится.

Единственный разумный выход из это ситуации - присваивать идентификатор самостоятельно. "Вручную". А как именно это будет сделано - через прямые команды DEFINE BAR или через объектную обертку - уже не важно.

Хотя, возможно, для shanton будет интересен сам подход.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Имя и номер элемента меню / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]