powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как изменить свойство класса ?
17 сообщений из 17, страница 1 из 1
Как изменить свойство класса ?
    #33178792
Есть некий класс использующий меню. Для меню нельзя употреблять this и thisform. Как изменить при выборе в меню свойство класса?
...
Рейтинг: 0 / 0
Как изменить свойство класса ?
    #33178857
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В начале кода определите переменную и присвойте ей значение ссылки на объект (форму). Например:
Код: 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.
LPARAMETERS loTextBox
LOCAL loForm
loForm = THISFORM

DEFINE POPUP f_menu SHORTCUT RELATIVE FROM MROW(),MCOL()
DEFINE BAR  1  OF f_menu PROMPT "Добавить" ;
	PICTURE "bitmaps\new.bmp"
DEFINE BAR  2  OF f_menu PROMPT "Удалить" ;
	SKIP FOR EOF("ListFasovka") ;
	PICTURE "bitmaps\delete.bmp"
DEFINE BAR  3  OF f_menu PROMPT "Редактировать" ;
	SKIP FOR EOF("ListFasovka") ;
	PICTURE "bitmaps\wzedit.bmp"
DEFINE BAR  4  OF f_menu PROMPT "Напечатать" ;
	SKIP FOR EOF("ListFasovka") ;
	PICTURE "bitmaps\print.bmp"
ON SELECTION BAR  1  OF f_menu loForm.AddNew()
ON SELECTION BAR  2  OF f_menu loForm.Delete()
ON SELECTION BAR  3  OF f_menu loForm.Edit()
ON SELECTION BAR  4  OF f_menu loForm.PReport()

ACTIVATE POPUP f_menu
RELEASE POPUPS f_menu

С уважением, Алексей
...
Рейтинг: 0 / 0
Как изменить свойство класса ?
    #33178919
Спасибо. Идея насчет переменной хороша. Я буду объявлять в load класса, что-бы класс был независим от формы.
...
Рейтинг: 0 / 0
Как изменить свойство класса ?
    #33179033
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делать косвенную ссылку через переменную имеет смысл, только в том случае, если экземпляр класса вызывается непосредственно из метода формы и уничтожается ДО уничтожения формы. В противном случае проблемы обеспечены.

Обычно в таких случаях делают ссылку на метод активной в данный момент формы. Примерно так:

Код: plaintext
1.
2.
3.
4.
ON SELECTION BAR  1  OF f_menu _VFP.ActiveForm.AddNew()
ON SELECTION BAR  2  OF f_menu _VFP.ActiveForm.Delete()
ON SELECTION BAR  3  OF f_menu _VFP.ActiveForm.Edit()
ON SELECTION BAR  4  OF f_menu _VFP.ActiveForm.PReport()

Кроме этого обязательно устанавливают условие SKIP FOR для таких пунктов меню. Это условие вызывает функцию, которая делает примерно такую проверку

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
* ExistsInActiveForm
*
LPARAMETERS tcName
IF TYPE("tcName")<>"C"
	tcName=""
ENDIF

LOCAL llReturnValue
llReturnValue=.F.

* Есть ли активная в данный момент форма и существует ли у нее
* метод или свойство с указанным именем
IF TYPE("_VFP.ActiveForm")="O" AND PemStatus(_VFP.ActiveForm,m.tcName, 5 )=.T.
	* Если в качестве имени указано свойство, то необходимо убедится, 
	* что это свойство имеет не пустое значение
	IF UPPER(PemStatus(_VFP.ActiveForm,m.tcName, 3 ))<>"PROPERTY" OR EMPTY(_VFP.ActiveForm.&tcName)=.F.
		llReturnValue=.T.
	ENDIF
ENDIF

RETURN (m.llReturnValue)

Т.е. пункт меню определяется примерно так:

Код: plaintext
1.
2.
3.
4.
5.
DEFINE BAR  1  OF f_menu PROMPT "Добавить" ;
	PICTURE "bitmaps\new.bmp" ;
	SKIP FOR ExistsInActiveForm("AddNew")=.F.

ON SELECTION BAR  1  OF f_menu _VFP.ActiveForm.AddNew()

Если процесс построения меню происходит в событии ACTIVATE-формы, а уничтожение по DEACTIVATE-формы, то функция в SKIP FOR не обязательна, поскольку меню будет обслуживать только и исключительно _VFP.ActiveForm
...
Рейтинг: 0 / 0
Как изменить свойство класса ?
    #33179313
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для ВладимирМ
ВладимирМДелать косвенную ссылку через переменную имеет смысл, только в том случае, если экземпляр класса вызывается непосредственно из метода формы и уничтожается ДО уничтожения формы. В противном случае проблемы обеспечены.

Я привел пример контекстного меню класса (формы, ... ). Это же ясно из: RELEASE POPUPS f_menu. Какие могут быть тут последствия ?
Очевидно, что вопрос "И_Я_хочу_Знать" задавал об использовании меню, инкапсулированного в классе (форме)
И_Я_хочу_Знать
Есть некий класс использующий меню. Для меню нельзя употреблять this и thisform

Ваш же пример, ВладимирМ, скорее относится к построению меню, код которого выполнятся за пределами класса, например, главное меню приложения.

С уважением, Алексей
...
Рейтинг: 0 / 0
Как изменить свойство класса ?
    #33179789
Спасибо Всем !!!
Aleksey-Kвопрос "И_Я_хочу_Знать" задавал об использовании меню, инкапсулированного в классе (форме)

Да это правда и я ответ ВладимирМ пока использовать не буду, но запишу в записную книжку на будующее.
...
Рейтинг: 0 / 0
Как изменить свойство класса ?
    #33180831
Проверил - не получается в случае, если у меня formset.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Local ii, err, OldError 

On Error err=.F. 
err=.T.
MyFullPuth = 'this'
Do While err
	MyFullPuth = MyFullPuth + '.parent'
	ii=MyFullPuth 
	ii=&ii
Enddo  

On Error

MyFullPuth = Substr(MyFullPuth, 1 ,Len(MyFullPuth)- 7 )+".name"
Стоит ли применять этот код или есть путь проще? Нужно имя для thisform или thisformset.
...
Рейтинг: 0 / 0
Как изменить свойство класса ?
    #33180968
Нифига не получается.

Имя *.prg не совпадает thisformset.name. Как найти полный путь до класса ?

Хочу доработать класс до уровня бросил на форму и забыл.
...
Рейтинг: 0 / 0
Как изменить свойство класса ?
    #33181012
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то я не понял смысла твоего кода. Если нужна ссылка с полной иерархией от текущего объекта, то это

Код: plaintext
MyFullPuth = SYS( 1272 ,this)

Если надо определить есть ли у данного объекта объект-контейнер (parent), то это

Код: plaintext
1.
2.
IF TYPE("This.Parent") = "O"
	* есть объект parent
ENDIF
...
Рейтинг: 0 / 0
Как изменить свойство класса ?
    #33181103
glamis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ

Код: plaintext
1.
2.
3.
4.
5.
DEFINE BAR  1  OF f_menu PROMPT "Добавить" ;
	PICTURE "bitmaps\new.bmp" ;
	SKIP FOR ExistsInActiveForm("AddNew")=.F.

ON SELECTION BAR  1  OF f_menu _VFP.ActiveForm.AddNew()



Обрати внимание что skip отработает только на момент определения bar. Я бы описал функцию, определяющую доступен пункт меню в момент вызова и после этого вызывал метод. f("AddNew", "_VFP.ActiveForm.AddNew()")
...
Рейтинг: 0 / 0
Как изменить свойство класса ?
    #33181139
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
glamisОбрати внимание что skip отработает только на момент определения bar.
Нет.

SKIP вычисляется каждый раз в момент активизации того POPUP-меню в котором прописан этот BAR-пункт. Т.е. в момент раскрытия выпадающего меню.

Я привел пример из работающей программы. Можешь сам сделать тестовый примерчик и проверить.
...
Рейтинг: 0 / 0
Как изменить свойство класса ?
    #33182372
Спасибо за ответ.

ВладимирМЧто-то я не понял смысла твоего кода. Если нужна ссылка с полной иерархией от текущего объекта, то это

Код: plaintext
MyFullPuth = SYS( 1272 ,this)


Да код был предназначен для определения полного пути. Спасибо за функцию. Но эта функция как и мой код не работает, если название файла формы не совпадает с именем формы. Как узнать название файла формы? А что будет после компиляции? Стартовый файл main.prg.

Например MyForm.scx содержит форму Form1.
Полный путь по SYS(1272,this) = "Form1.MyButton", а надо "MyForm.MyButton"

Как это получить?
...
Рейтинг: 0 / 0
Как изменить свойство класса ?
    #33182397
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И_Я_хочу_Знать
Например MyForm.scx содержит форму Form1.
Полный путь по SYS(1272,this) = "Form1.MyButton", а надо "MyForm.MyButton"

Как это получить?

Получить имя файла можно из функции SYS(16), но это не имеет смысла. Ты же обращаешся к методу не файла, а той формы, с которой работаешь.

По SYS(1272) использовано свойство Name. Но обращение к форме идет через переменную, содержащую ссылку на эту форму. В общем случае эта переменная может и НЕ совпадать ни со свойством Name, ни с именем файла scx. Все зависит от способа вызова этой формы.

PS: А какой глубокий смысл давать свойству Name формы значение отличное от имени файла SCX? Ну, кроме горячего желания создать себе дополнительные проблемы? Измени значение свойства Name на имя файла - и все!
...
Рейтинг: 0 / 0
Как изменить свойство класса ?
    #33182499
ВладимирМ
Получить имя файла можно из функции SYS(16), но это не имеет смысла. Ты же обращаешся к методу не файла, а той формы, с которой работаешь.
Да спасибо из этой функции я смогу получить имя.


ВладимирМPS: А какой глубокий смысл давать свойству Name формы значение отличное от имени файла SCX? Ну, кроме горячего желания создать себе дополнительные проблемы? Измени значение свойства Name на имя файла - и все! Никакого. Обычно дают осмысленное имя файлу, а об имени формы обычно не заботятся. По умолчанию - Form1.
...
Рейтинг: 0 / 0
Как изменить свойство класса ?
    #33183852
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi И_Я_хочу_Знать!

Сделай форму, и затем из командного окна выполни (именно так - запусти 3
формы!)

DO FORM Form1
DO FORM Form1
DO FORM Form1

потом напиши

Form1.Backcolor = 0

И попробуй поменять цвет ДРУГОЙ запущенной формы Form1. Ради смеха можешь
даже закрыть "уже перекрашенную" форму.
Думаю после этого охота обращаться к форме по имени НЕЯВНО создаваемой
переменной-ссылки заметно поубавится. А когда ты запишешь данный код в prg,
а код Form1.Backcolor поместишь скажем в кнопку на этой форме и всё это
запустишь (и выяснишь что такая неявная переменная ещё и PRIVATE, и к
моменту нажатия на кнопку уже давно как уничтожена) - то твоё желание
пользовать такие приёмы и вовсе исчезнет - и
ты найдёшь таки более правильные и стабильные способы обращаться к
разнообразным формам :)

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
Как изменить свойство класса ?
    #33184730
Спасибо за совет. Попробовал. Да здесь есть над чем подумать. Возможно я жеско программирую, но у меня невозможно в запустить программу 2 раза(mutex.prg) также как и форму(недоступно меню после входа в форму).
...
Рейтинг: 0 / 0
Как изменить свойство класса ?
    #33185883
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi И_Я_хочу_Знать!

Теперь пробуй второй пример :) Там не надо 3 раза запускать - достаточно
всего одной формы - а ссылка всё равно теряется.

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как изменить свойство класса ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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