Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Как изменить свойство класса ?  [new]
И_Я_хочу_Знать
Guest
Есть некий класс использующий меню. Для меню нельзя употреблять this и thisform. Как изменить при выборе в меню свойство класса?
21 июл 05, 18:03    [1725436]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить свойство класса ?  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
В начале кода определите переменную и присвойте ей значение ссылки на объект (форму). Например:
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

С уважением, Алексей
21 июл 05, 18:35    [1725602]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить свойство класса ?  [new]
И_Я_хочу_Знать
Guest
Спасибо. Идея насчет переменной хороша. Я буду объявлять в load класса, что-бы класс был независим от формы.
21 июл 05, 19:13    [1725729]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить свойство класса ?  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Делать косвенную ссылку через переменную имеет смысл, только в том случае, если экземпляр класса вызывается непосредственно из метода формы и уничтожается ДО уничтожения формы. В противном случае проблемы обеспечены.

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

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 для таких пунктов меню. Это условие вызывает функцию, которая делает примерно такую проверку

* 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)

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

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
21 июл 05, 21:26    [1725921]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить свойство класса ?  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
Для ВладимирМ
ВладимирМ
Делать косвенную ссылку через переменную имеет смысл, только в том случае, если экземпляр класса вызывается непосредственно из метода формы и уничтожается ДО уничтожения формы. В противном случае проблемы обеспечены.

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

Есть некий класс использующий меню. Для меню нельзя употреблять this и thisform

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

С уважением, Алексей
22 июл 05, 09:06    [1726370]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить свойство класса ?  [new]
И_Я_хочу_Знать
Guest
Спасибо Всем !!!
Aleksey-K
вопрос "И_Я_хочу_Знать" задавал об использовании меню, инкапсулированного в классе (форме)

Да это правда и я ответ ВладимирМ пока использовать не буду, но запишу в записную книжку на будующее.
22 июл 05, 11:55    [1727197]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить свойство класса ?  [new]
И_Я_хочу_Знать
Guest
Проверил - не получается в случае, если у меня formset.
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.
22 июл 05, 18:28    [1729379]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить свойство класса ?  [new]
И_Я_хочу_Знать
Guest
Нифига не получается.

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

Хочу доработать класс до уровня бросил на форму и забыл.
22 июл 05, 20:18    [1729627]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить свойство класса ?  [new]
ВладимирМ
Member

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

MyFullPuth = SYS(1272,this)

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

IF TYPE("This.Parent") = "O"
	* есть объект parent
ENDIF
22 июл 05, 21:47    [1729733]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить свойство класса ?  [new]
glamis
Member

Откуда:
Сообщений: 603
ВладимирМ


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()")
23 июл 05, 08:50    [1730049]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить свойство класса ?  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
glamis
Обрати внимание что skip отработает только на момент определения bar.

Нет.

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

Я привел пример из работающей программы. Можешь сам сделать тестовый примерчик и проверить.
23 июл 05, 10:57    [1730107]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить свойство класса ?  [new]
И_Я_хочу_Знать
Guest
Спасибо за ответ.

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

MyFullPuth = SYS(1272,this)


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

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

Как это получить?
25 июл 05, 12:38    [1731914]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить свойство класса ?  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
И_Я_хочу_Знать

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

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


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

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

PS: А какой глубокий смысл давать свойству Name формы значение отличное от имени файла SCX? Ну, кроме горячего желания создать себе дополнительные проблемы? Измени значение свойства Name на имя файла - и все!
25 июл 05, 12:47    [1731954]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить свойство класса ?  [new]
И_Я_хочу_Знать
Guest
ВладимирМ

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

Да спасибо из этой функции я смогу получить имя.


ВладимирМ
PS: А какой глубокий смысл давать свойству Name формы значение отличное от имени файла SCX? Ну, кроме горячего желания создать себе дополнительные проблемы? Измени значение свойства Name на имя файла - и все!
Никакого. Обычно дают осмысленное имя файлу, а об имени формы обычно не заботятся. По умолчанию - Form1.
25 июл 05, 13:15    [1732127]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить свойство класса ?  [new]
Igor Korolyov
Member

Откуда: Гомель, Беларусь
Сообщений: 2512

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

26 июл 05, 04:38    [1734486]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить свойство класса ?  [new]
И_Я_хочу_Знать
Guest
Спасибо за совет. Попробовал. Да здесь есть над чем подумать. Возможно я жеско программирую, но у меня невозможно в запустить программу 2 раза(mutex.prg) также как и форму(недоступно меню после входа в форму).
26 июл 05, 12:58    [1735892]     Ответить | Цитировать Сообщить модератору
 Re: Как изменить свойство класса ?  [new]
Igor Korolyov
Member

Откуда: Гомель, Беларусь
Сообщений: 2512

Hi И_Я_хочу_Знать!

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

Posted via ActualForum NNTP Server 1.2

26 июл 05, 23:12    [1738093]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить