powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Добавление окна в систюменю и его выбор
20 сообщений из 20, страница 1 из 1
Добавление окна в систюменю и его выбор
    #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
Добавление окна в систюменю и его выбор
    #34160583
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я при каждом запуске такой формы, добавляю к ее имени довесок типа " #1", " #2" и т.к., Сам номер запоминаю в форме и соответственно THIS.frmSprMain.caption будет у всех форм разный.
Вместо номера можно придумать что-то свое, например, заголовок FormSet + "|" + заголовок самой формы.
С уважением, Алексей
...
Рейтинг: 0 / 0
Добавление окна в систюменю и его выбор
    #34160658
MikeLed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При чем тут заголовок формы - Capture?
Capture я меняю программно - они разные.
А вот Name - одинаковый.
Или есть способ активизировать окно по Capture?
...
Рейтинг: 0 / 0
Добавление окна в систюменю и его выбор
    #34160675
MikeLed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В предыдущем вмесето Capture читать Caption!! :)
...
Рейтинг: 0 / 0
Добавление окна в систюменю и его выбор
    #34161402
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikeLedПри чем тут заголовок формы - Capture?
Capture я меняю программно - они разные.
А вот Name - одинаковый.
Или есть способ активизировать окно по Capture?
Так меняй Name формы динамически! Приписывай номер к имени
С уважениеми, Алексей.
...
Рейтинг: 0 / 0
Добавление окна в систюменю и его выбор
    #34161465
MikeLed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Класс формсет состоит из классов форм.
Form.Name не меняется ни в конструкторе, ни программно.
Могу поменять только formset.name, но это не решает проблемы - фктвизироваать надо форму, а не формсет.
...
Рейтинг: 0 / 0
Добавление окна в систюменю и его выбор
    #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
Добавление окна в систюменю и его выбор
    #34161828
MikeLed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulWist , Вы о чем?
У меня 10 formset на базе класса, в который включены 4 класса форм.
Какая разница между formset1.form1.name и formset1.forms(1).name
Любые попытки переименовать - Property Name is read only !!!
...
Рейтинг: 0 / 0
Добавление окна в систюменю и его выбор
    #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
Добавление окна в систюменю и его выбор
    #34162088
MikeLed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В принципе я и так практически веду свою коллекцию окон.
Приведенный вначале код добавляет новое окно в список (в классе).
Остается только в коменде
ON SELECTION BAR lnBar OF Window ACTIVATE Window &lcFormName
заменить ACTIVATE Window &lcFormName
DO MyActivForm(<заголовок_окна>)

Но я думал,что для формсет что-то упустил.
...
Рейтинг: 0 / 0
Добавление окна в систюменю и его выбор
    #34162705
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MikeLedКласс формсет состоит из классов форм.
Form.Name не меняется ни в конструкторе, ни программно.
Могу поменять только formset.name, но это не решает проблемы - фктвизироваать надо форму, а не формсет.
Ну так меняйте в INIT Name формы!
Зто же ваш код, как я понимаю?
С уважением, Алексей.
...
Рейтинг: 0 / 0
Добавление окна в систюменю и его выбор
    #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
Добавление окна в систюменю и его выбор
    #34163205
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Паш, ты не понимаешь. Речь идет о FormSet, а не об одиночной форме. В данном случае форма - это не объект-контейнер верхнего уровня (у него действительно можно менять Name), а вложенный объект. У таких объектов свойство Name - Read Only. Разумеется, когда речь идет о классах.

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

В отношении FormSet то же самое касается входящих в него форм. Изменить свойство Name можно только у самого FormSet, как контейнера верхнего уровня, но не у вложенных в него объектов. Ведь "вложены" они были не у него, а у его родителя.
...
Рейтинг: 0 / 0
Добавление окна в систюменю и его выбор
    #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
Добавление окна в систюменю и его выбор
    #34163479
MikeLed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как я понимаю. Вы имя меняете в момент определения класса, а не формы.
Это можно сделать, но это не то.
Менять надо (хотелось) для ofs.forms(1).
...
Рейтинг: 0 / 0
Добавление окна в систюменю и его выбор
    #34163523
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может имеет смысл в классе формы, которая используется в FormSet, сразу предусмотреть в init смену имени с учетом, например имени контейнера (FormSet)?

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

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

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

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

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

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

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

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


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