:: Visual Foxpro, Foxpro for DOS
Определить объект и его форму (Thisform) под With
Ydin
Автор

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
Здесь решение, а не вопрос. Вдруг кому-то пригодится.
Итак, вызов функции (prg), выше кот. стоит With Something
Надо определить объект, заданный с помощью With. И форму этого объекта

Цитата:
loForm = CREATEOBJECT("Test")
loForm.VISIBLE = .T.

DEFINE CLASS Test AS FORM
ADD OBJECT LabelTest AS LABEL
NAME='FormTest'
FUNCTION INIT
LOCAL loForm, loThis
THIS.VISIBLE = .T.
WITH THIS
m.loThis =GetWithObj()
m.loForm = ObjForm(m.loThis)
MESSAGEBOX( m.loThis.NAME,'1. Объект под With')
MESSAGEBOX( m.loForm.NAME,'1. Форма объекта под With')
ENDWITH

WITH THIS.LabelTest
m.loThis =GetWithObj()
m.loForm = ObjForm(m.loThis)
MESSAGEBOX( m.loThis.NAME,'2. Объект под With')
MESSAGEBOX( m.loForm.NAME,'2. Форма объекта под With')

ENDWITH
ENDDEFINE

*
* Ссылка на объект, заданный WITH
*
FUNCTION GetWithObj
RETURN IIF(TYPE('.Parent') = 'U', .OBJECTS(1).PARENT, EVALUATE('.Parent.' + .NAME))

*
* Для заданого объекта формы объект формы
*
FUNCTION ObjForm
LPARAMETERS loObj

LOCAL lnLine
IF TYPE('loObj.Name')#'C' OR UPPER(m.loObj.BASECLASS)='FORM'
RETURN m.loObj
ENDIF
FOR m.lnLine=1 TO 20
IF TYPE('loObj.PARENT')='U'
RETU m.loObj
ENDIF
m.loObj=m.loObj.PARENT
IF UPPER(m.loObj.BASECLASS)='FORM'
EXIT
ENDIF
NEXT
RETURN m.loObj



Исправлено 2 раз(а). Последнее : Ydin, 03.09.22 20:45
Ratings: 0 negative/0 positive
Re: Определить объект и его форму (Thisform) под With
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Не совсем понял назначение этого кода.

Когда мне нужно было одновременно и использовать WITH, и где-то внутри WITH иметь ссылку на WITH-объект, я сначала получал ссылку на объект, а потом использовал её в WITH.
И никакая функция для этого не нужна.
Или я чего-то не понял?

loForm = CREATEOBJECT("Test")
loForm.Visible = .T.
DEFINE CLASS Test AS FORM
ADD OBJECT LabelTest AS LABEL
Name = 'FormTest'
FUNCTION Init
LOCAL oThis
this.Visible = .T.
oThis = this.LabelTest
WITH oThis
MESSAGEBOX( '.name = '+.name,'1-й вариант обращения к объекту под With')
MESSAGEBOX( 'oThis.name = '+oThis.name,'2-й вариант обращения к объекту под With')
ENDWITH
ENDPROC
ENDDEFINE

Вторую функцию можно упростить и не привязываться к уровню вложенности объекта:
FUNCTION ObjForm
LPARAMETERS loObj
DO WHILE loObj.baseclass!='Form' AND TYPE('loObj.parent')='O'
loObj = loObj.parent
ENDDO
RETURN loObj



Исправлено 2 раз(а). Последнее : akvvohinc, 04.09.22 01:32
Ratings: 0 negative/0 positive
Re: Определить объект и его форму (Thisform) под With
Ydin
Автор

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
Это реальная ситуация, с кот. столкнулся пару дней назад.
Мне нужно было на смене строки грида обращаться к объектам формы Фреймворка.
Смена строки в этой форме - событие.
И вызывается в разных местах, тоже событиях.
При этом код этих событий везде обрамляется With/Endwith, но с разными объектами этой формы.
Мне важно определить сам объект форму.

У нас все формы в Фрейворке, программисты вообще не используют Modi Form, т.к. все программирование происходит в Рантайме.
Ratings: 0 negative/0 positive
Re: Определить объект и его форму (Thisform) под With
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Ydin
При этом код этих событий везде обрамляется With/Endwith, но с разными объектами этой формы.
Мне важно определить сам объект форму.
Ну, вот как я понимаю эту проблему:

Где-то в коде формы стояло
WITH this.labelform
...
ENDWITH

Внутри WITH понадобилось получить ссылку на WITH-объект (например, для передачи объекта в какую-то функцию или для получения ссылки на его родительскую форму).

Есть по крайней мере 3 способа как этого достичь:

1) вы добавляете строку с вызовом вашей функции
WITH this.labelform
m.loThis = GetWithObj()
ENDWITH

2) просто повторить внутри WITH ссылку на объект, заданную в WITH (функция не требуется)
WITH this.labelform
m.loThis = this.labelform
ENDWITH

3) сначала присвоить ссылку на WITH-объект переменной, а затем просто ею пользоваться (функция не требуется)
m.loThis = this.labelform
WITH m.loThis
* m.loThis уже готова
ENDWITH

Третий вариант (наиболее предпочтительный, на мой взгляд) отличается от второго только тем, что в нём не приходится дублировать ссылку на WITH-объект, которая может быть достаточно длинной, - она пишется только 1 раз.

Поэтому я и спросил, почему вы выбрали 1-й вариант с вызовом UDF - наиболее сложный из этих трёх и требующий написания функции?

Что же касается функции определения ссылки на родительскую форму некоторого объекта, то она вообще никак не связана с WITH - она работает для любого переданного объекта, каким бы способом он не был определён.
Ratings: 0 negative/0 positive
Re: Определить объект и его форму (Thisform) под With
Ydin
Автор

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
akvvohinc
Ydin
При этом код этих событий везде обрамляется With/Endwith, но с разными объектами этой формы.
Мне важно определить сам объект форму.
Ну, вот как я понимаю эту проблему:

Где-то в коде формы стояло
WITH this.labelform
...
ENDWITH

Внутри WITH понадобилось получить ссылку на WITH-объект (например, для передачи объекта в какую-то функцию или для получения ссылки на его родительскую форму).

Есть по крайней мере 3 способа как этого достичь:

Нет, не понадобилось получить ссылку на WITH-объект. Это по-детски, у нас программисты работают больше 20 лет с моим Framework'ом. А я лет 30
Там куски программы, где они знают и объект и форму. Все они знают. У них есть "Thisform" и есть "This" моими средствами!!

Только одна из стандартных форм - работа с первичными документами не очень стандартная. Она работает через Pageframe с разными формами и ее объектами.
А вот тут и понадобилось это...
Akvvohinc, я тут на Форуме самый старый, мне 73 года.
В сентябре 1988 года Ashton-Tate подала в суд иск о нарушении её авторских прав на язык dBase в продуктах Fox Software.
Я из того времени, чуть раньше. Мне приятно, что Вы предлагаете решения.
И так жалко, что я это уже знал... Но мне трогательно, и большое спасибо!
Я очень рад, что Вы любите VFP!



Исправлено 2 раз(а). Последнее : Ydin, 04.09.22 16:48
Ratings: 0 negative/0 positive
Re: Определить объект и его форму (Thisform) под With
Ydin
Автор

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
Я может там не совсем прав!



Исправлено 5 раз(а). Последнее : Ydin, 04.09.22 20:27
Ratings: 0 negative/0 positive
Re: Определить объект и его форму (Thisform) под With
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Ydin
Akvvohinc, я тут на Форуме самый старый, мне 73 года.
В сентябре 1988 года Ashton-Tate подала в суд иск о нарушении её авторских прав на язык dBase в продуктах Fox Software.
Я из того времени, чуть раньше.
Я помоложе, но тоже из того времени - начал работать с FoxBase в 1989.

Цитата:
У них есть "Thisform"
В общем случае объект не обязан находиться на форме, ссылку на которую можно получить по Thisform.



Исправлено 1 раз(а). Последнее : akvvohinc, 04.09.22 20:32
Ratings: 0 negative/0 positive
Re: Определить объект и его форму (Thisform) под With
Ydin
Автор

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
В том и дело, что нет там Thisform!Нет THIS!
Это код, кот. выполняется по Execscript или как .fxp файл.
Не в самом методе



Исправлено 2 раз(а). Последнее : Ydin, 04.09.22 22:15
Ratings: 0 negative/0 positive
Re: Определить объект и его форму (Thisform) под With
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Ydin
В том и дело, что нет там Thisform!Нет THIS!
Ну, и отлично - код, который я приводил выше, из этого и исходит.
Ratings: 0 negative/0 positive
Re: Определить объект и его форму (Thisform) под With
Ydin
Автор

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
Если учесть, что я могу только, условно говоря, писать prg, не трогая исходники Framework (это exe-файл), то ...
Одна команда всего!



Исправлено 1 раз(а). Последнее : Ydin, 05.09.22 10:41
Ratings: 0 negative/0 positive
Re: Определить объект и его форму (Thisform) под With
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Ydin
Если учесть, что я могу только, условно говоря, писать prg, не трогая исходники Framework
У тех, кому, как написано в первом сообщении, это может пригодиться, вашего фреймворка нет, а следовательно, нет и таких ограничений - поэтому они могут достичь той же цели проще.
Ratings: 0 negative/0 positive
Re: Определить объект и его форму (Thisform) под With
Ydin
Автор

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
akvvohinc
они могут достичь той же цели проще.
Какой цели? В этой ветке, вообще, цели нет...
Так, пообщаться...
В курилке ремонт
Ratings: 0 negative/0 positive
Re: Определить объект и его форму (Thisform) под With
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Ydin
Какой цели? В этой ветке, вообще, цели нет...

Я понял, что цель есть:
Ydin
Надо определить объект, заданный с помощью With. И форму этого объекта
Ratings: 0 negative/1 positive
Re: Определить объект и его форму (Thisform) под With
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
"" Мне важно определить сам объект форму.

№ синтаксических понятия вспоvgнил - This, ThisForm, WITH обьект ... что еще забыл...

> Надо определить объект, заданный с помощью With. И форму этого объекта
К сожалению, указатель из верхушки стека (WITH обьект ...ENDWITH) разрабы фокса не сделали возможности считать
Ratings: 0 negative/0 positive
Re: Определить объект и его форму (Thisform) под With
Ydin
Автор

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
of63
К сожалению, указатель из верхушки стека (WITH обьект ...ENDWITH) разрабы фокса не сделали возможности считать

* Ссылка на объект, заданный WITH
EVALUATE('.Parent.' + .NAME)



Исправлено 3 раз(а). Последнее : Ydin, 10.09.22 03:02
Ratings: 0 negative/0 positive
Re: Определить объект и его форму (Thisform) под With
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
К сожалению, указатель из верхушки стека (WITH обьект ...ENDWITH) разрабы фокса не сделали возможности считать
Потому что в нём обычно нет необходимости.
А если такая необходимость появилась, то ничто не мешает сначала сохранить ссылку на объект в переменной, а потом написать эту переменную в WITH:
loObject = <ссылка на WITH-объект>
WITH loObject
* здесь loObject и есть тот указатель
ENDWITH



Исправлено 1 раз(а). Последнее : akvvohinc, 10.09.22 00:53
Ratings: 0 negative/0 positive
Re: Определить объект и его форму (Thisform) под With
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Ydin
of63
К сожалению, указатель из верхушки стека (WITH обьект ...ENDWITH) разрабы фокса не сделали возможности считать

* Ссылка на объект, заданный WITH
EVALUATE('.Parent.' + .NAME)

"Parent"-обьект может отсутствовать принципиально, и часто отсутствует. Это CREATEOBJECT("Empty"), или SCATTER NAME переменная-обьект

Да, в переменную можно записать [копию] указателя

Пива, давно, такой пример привел, в котором и переменной нет с обьектом, чтобы с ней обратиться в какую-то функцию. В фоксе не хватает (забыли скорее всего) оператора "точка", например, было бы GETPEM(. , свойство):
WITH CREATEOBJECT(чего-то)
? .свойство
? GETPEM(. , свойство)
ENDWITH



Исправлено 1 раз(а). Последнее : of63, 10.09.22 18:50
Ratings: 0 negative/0 positive
Re: Определить объект и его форму (Thisform) под With
Ydin
Автор

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
"Parent"-обьект может отсутствовать принципиально, и часто отсутствует. Это CREATEOBJECT("Empty"), или SCATTER NAME переменная-обьект
Ydin
IIF(TYPE('.Parent') = 'U', .OBJECTS(1).PARENT, EVALUATE('.Parent.' + .NAME))
Ratings: 0 negative/0 positive
Re: Определить объект и его форму (Thisform) под With
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
.objects(1) - на что указывает? в обьекте "Empty" ?
Ratings: 0 negative/0 positive
Re: Определить объект и его форму (Thisform) под With
Ydin
Автор

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
Для Empty - не пиши. Можешь проверить на класс или еще на что-то
Писал для адекватных, но ты проверь на всяк



Исправлено 1 раз(а). Последнее : Ydin, 13.09.22 21:29
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 25 (Гостей: 25)

© 2000-2024 Fox Club 
Яндекс.Метрика