Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Добавление окна в систюменю и его выбор / 20 сообщений из 20, страница 1 из 1
28.11.2006, 11:03
    #34159955
MikeLed
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление окна в систюменю и его выбор
Всем доброго дня.

Всегда использовал сл. код для добавления окна в системное меню:

*-- Добавление наименования окна в меню
LOCAL lnBar
IF TYPE("oApp") == "O" AND RIGHT(ALLTRIM(.CAPTION),7)<>'(выбор)'
*-- Определение следующего пункта меню для внесения имени окна
IF CNTBAR("Window") = 0 OR GETBAR("Window", CNTBAR("Window")) < 0
lnBar = CNTBAR("Window") + 1
ELSE
lnBar = GETBAR("Window", CNTBAR("Window")) + 1
ENDIF
DEFINE BAR lnBar OF Window PROMPT THIS.frmSprMain.caption AFTER _MLAST
lcFormName = THIS.frmSprMain.Name
ON SELECTION BAR lnBar OF Window ACTIVATE Window &lcFormName
ENDIF
ACTIVATE MENU _MSYSMENU NOWAIT

Создал класс formset c несколькими формами.
Главную форму добавляю в сист. меню.
На базе данного класса создано несколько формсетов.
При одновременном открытии нескольких форм в системное меню заголовки форм добавляются правильно, но главная форма в формсете всегда имеет одинаковое имя, поэтому выбрать нужную форму через меню не могу (осужествляется последовательный переход между одноименными формами)
Подскажите правильное решение проблемы.
...
Рейтинг: 0 / 0
28.11.2006, 13:16
    #34160583
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление окна в систюменю и его выбор
А я при каждом запуске такой формы, добавляю к ее имени довесок типа " #1", " #2" и т.к., Сам номер запоминаю в форме и соответственно THIS.frmSprMain.caption будет у всех форм разный.
Вместо номера можно придумать что-то свое, например, заголовок FormSet + "|" + заголовок самой формы.
С уважением, Алексей
...
Рейтинг: 0 / 0
28.11.2006, 13:30
    #34160658
MikeLed
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление окна в систюменю и его выбор
При чем тут заголовок формы - Capture?
Capture я меняю программно - они разные.
А вот Name - одинаковый.
Или есть способ активизировать окно по Capture?
...
Рейтинг: 0 / 0
28.11.2006, 13:32
    #34160675
MikeLed
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление окна в систюменю и его выбор
В предыдущем вмесето Capture читать Caption!! :)
...
Рейтинг: 0 / 0
28.11.2006, 16:15
    #34161402
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление окна в систюменю и его выбор
MikeLedПри чем тут заголовок формы - Capture?
Capture я меняю программно - они разные.
А вот Name - одинаковый.
Или есть способ активизировать окно по Capture?
Так меняй Name формы динамически! Приписывай номер к имени
С уважениеми, Алексей.
...
Рейтинг: 0 / 0
28.11.2006, 16:26
    #34161465
MikeLed
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление окна в систюменю и его выбор
Класс формсет состоит из классов форм.
Form.Name не меняется ни в конструкторе, ни программно.
Могу поменять только formset.name, но это не решает проблемы - фктвизироваать надо форму, а не формсет.
...
Рейтинг: 0 / 0
28.11.2006, 16:51
    #34161581
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление окна в систюменю и его выбор
MikeLedКласс формсет состоит из классов форм.
Form.Name не меняется ни в конструкторе, ни программно.
Могу поменять только formset.name, но это не решает проблемы - фктвизироваать надо форму, а не формсет.

А попробовать

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  PUBLIC ofs 
  ofs = CREATEOBJECT('FormSet')
  WITH ofs
   .addobject('form1','form')
   .addobject('form2','form')
   .show()
   .form1.show()
   .form2.show()
   .form1.AutoCenter = .t.
   ?.forms( 1 ).Name
   .forms( 1 ).Name = 'А_вот_новое_имя'
   ?.forms( 1 ).Name
  ENDWITH 

Обращаться надо через коллекцию Forms()
...
Рейтинг: 0 / 0
28.11.2006, 17:39
    #34161828
MikeLed
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление окна в систюменю и его выбор
PaulWist , Вы о чем?
У меня 10 formset на базе класса, в который включены 4 класса форм.
Какая разница между formset1.form1.name и formset1.forms(1).name
Любые попытки переименовать - Property Name is read only !!!
...
Рейтинг: 0 / 0
28.11.2006, 18:00
    #34161926
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление окна в систюменю и его выбор
Если "по простому", то сканируйте коллекцию форм, пока не найдете нужный заголовок

Код: plaintext
1.
2.
3.
4.
5.
6.
LOCAL loForm
FOR EACH loForm IN _SCREEN.Forms()
	IF m.loForm.Caption = ...
		m.loForm.ZOrder( 0 )
	ENDIF
ENDFOR

В более сложном варианте, надо создавать собственную коллекцию открытых форм и работать через нее. В данном случае "закрепить" за каждым пунктом меню ссылку на нужный объект.

Хотя есть еще один вариант. Использовать стандартное меню FoxPro

Как добавить в меню список открытых окон
...
Рейтинг: 0 / 0
28.11.2006, 18:58
    #34162088
MikeLed
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление окна в систюменю и его выбор
В принципе я и так практически веду свою коллекцию окон.
Приведенный вначале код добавляет новое окно в список (в классе).
Остается только в коменде
ON SELECTION BAR lnBar OF Window ACTIVATE Window &lcFormName
заменить ACTIVATE Window &lcFormName
DO MyActivForm(<заголовок_окна>)

Но я думал,что для формсет что-то упустил.
...
Рейтинг: 0 / 0
29.11.2006, 08:29
    #34162705
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление окна в систюменю и его выбор
MikeLedКласс формсет состоит из классов форм.
Form.Name не меняется ни в конструкторе, ни программно.
Могу поменять только formset.name, но это не решает проблемы - фктвизироваать надо форму, а не формсет.
Ну так меняйте в INIT Name формы!
Зто же ваш код, как я понимаю?
С уважением, Алексей.
...
Рейтинг: 0 / 0
29.11.2006, 09:15
    #34162800
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление окна в систюменю и его выбор
MikeLedPaulWist , Вы о чем?
У меня 10 formset на базе класса, в который включены 4 класса форм.
Какая разница между formset1.form1.name и formset1.forms(1).name
Любые попытки переименовать - Property Name is read only !!!

Покажите свой код, как у formset1.forms(1).name переименовывается Name?
В какой момент вылетает ошибка?

Вы запускали приведенный код? Тоже выскакивает ошибка?
...
Рейтинг: 0 / 0
29.11.2006, 11:07
    #34163205
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление окна в систюменю и его выбор
Паш, ты не понимаешь. Речь идет о FormSet, а не об одиночной форме. В данном случае форма - это не объект-контейнер верхнего уровня (у него действительно можно менять Name), а вложенный объект. У таких объектов свойство Name - Read Only. Разумеется, когда речь идет о классах.

Чтобы было понятно о чем речь - положи на обычный класс формы любой объект. Создай собственно форму от этого класса или класс-наследник. А теперь попробуй в любом методе этой созданной формы изменить свойство Name вложенного объекта. Получишь "облом", поскольку недопустимо из класса-наследника менять некоторые свойства вложенных объектов созданных в родителе.

В отношении FormSet то же самое касается входящих в него форм. Изменить свойство Name можно только у самого FormSet, как контейнера верхнего уровня, но не у вложенных в него объектов. Ведь "вложены" они были не у него, а у его родителя.
...
Рейтинг: 0 / 0
29.11.2006, 11:50
    #34163424
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление окна в систюменю и его выбор
ВладимирМПаш, ты не понимаешь. Речь идет о FormSet, а не об одиночной форме. В данном случае форма - это не объект-контейнер верхнего уровня (у него действительно можно менять Name), а вложенный объект. У таких объектов свойство Name - Read Only. Разумеется, когда речь идет о классах.

Чтобы было понятно о чем речь - положи на обычный класс формы любой объект. Создай собственно форму от этого класса или класс-наследник. А теперь попробуй в любом методе этой созданной формы изменить свойство Name вложенного объекта. Получишь "облом", поскольку недопустимо из класса-наследника менять некоторые свойства вложенных объектов созданных в родителе.

В отношении FormSet то же самое касается входящих в него форм. Изменить свойство Name можно только у самого FormSet, как контейнера верхнего уровня, но не у вложенных в него объектов. Ведь "вложены" они были не у него, а у его родителя.

Так-с, проверяем (что-то я не понимаю), вроде все предложенные условия выполнены.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
PUBLIC ofs
* формсет
ofs = CREATEOBJECT('MyFormset')
* показываем пару форм 
WITH ofs
	.show()
	.forms( 1 ).show()
	.forms( 2 ).show()
	.forms( 2 ).AutoCenter = .t.
ENDWITH 


define CLASS MyFormSet as FormSet 
PROCEDURE init
* вложили пару форм в формсет в классе
this.addobject('form1','MyForm')
this.addobject('form2','MyForm')
ENDPROC 
ENDDEFINE 

DEFINE CLASS MyForm as Form 
PROCEDURE init
WITH this
	.addobject('cmd','MyCmd')
	.cmd.visible = .t.
	.cmd.top =  50 
	.cmd.left =  100 
ENDWITH 
ENDPROC 
ENDDEFINE 

DEFINE CLASS MyCmd as CommandButton 
Caption = 'Click Me'
PROCEDURE click()
LOCAL ofsl
? 'вот ссылка на FormSet'
m.ofsl = this.Parent.parent
? 'Вот имя первой формы СТАРОЕ'
? 'First Name = ' + m.ofsl.forms( 1 ).Name
? 'Меняем имя первой формы НОВОЕ'
m.ofsl.forms( 1 ).Name = 'MyFormNEW'
? 'Вот имя стало'
? 'Second Name = ' + m.ofsl.forms( 1 ).Name
* Здесь меняем имя самой кнопки
? '--------'
? 'Меняем имя самой кнопки'
? 'Имя кнопки старое' + this.Name 
this.Name = 'NameCmdNew'
? 'Имя кнопки новое ' + this.Name 


ENDPROC 
ENDDEFINE 
...
Рейтинг: 0 / 0
29.11.2006, 12:01
    #34163479
MikeLed
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление окна в систюменю и его выбор
Как я понимаю. Вы имя меняете в момент определения класса, а не формы.
Это можно сделать, но это не то.
Менять надо (хотелось) для ofs.forms(1).
...
Рейтинг: 0 / 0
29.11.2006, 12:08
    #34163523
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление окна в систюменю и его выбор
Может имеет смысл в классе формы, которая используется в FormSet, сразу предусмотреть в init смену имени с учетом, например имени контейнера (FormSet)?

С уважением, Алексей
...
Рейтинг: 0 / 0
29.11.2006, 12:18
    #34163562
MikeLed
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление окна в систюменю и его выбор
Пробовал, правда не совсем так (генерировал имя) и точно не помню какой ошибкой это закончилось. Кажется связь с классом была потеряна. Нодо будет посторить эксперимент.
...
Рейтинг: 0 / 0
29.11.2006, 12:30
    #34163611
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление окна в систюменю и его выбор
PaulWistТак-с, проверяем (что-то я не понимаю), вроде все предложенные условия выполнены.

А теперь проделай все то же самое, но с ВИЗУАЛЬНЫМИ библиотеками. НЕ через код. Файлы VCX и SCX.

Как вариант, сделай завершающий FormSet файлом SCX. Хотя это не принципиально... Вполне достаточно одной кнопки на одной форме и попытки изменить Name кнопки в экземпляре класса.

Похоже, программное создание объектов принципиально отличается от визуального создания в VCX.
...
Рейтинг: 0 / 0
29.11.2006, 13:20
    #34163861
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление окна в систюменю и его выбор
ВладимирМПохоже, программное создание объектов принципиально отличается от визуального создания в VCX.

А-ааа, Семён Семёныч !!! (с)

Действительно, если в vcx в run-time добавить обьект, то его зменить можно, а так облом-с.
...
Рейтинг: 0 / 0
29.11.2006, 14:16
    #34164117
MikeLed
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление окна в систюменю и его выбор
У-уууу, Семёны Семёнычы !!! (с)

Много полезного почерпнул. Спасибо

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


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