:: Visual Foxpro, Foxpro for DOS
PRG классы в SCX/VCX пожелание
Андрей Давыдов
Автор

Сообщений: 1411
Дата регистрации: 08.02.2003
LOCAL lcText
TEXT TO lcText
DEFINE CLASS cmd AS CommandButton
Visible=.T.
PROCEDURE Click
=MESSAGEBOX("You are welcome!")
ENDPROC
ENDDEFINE
ENDTEXT
=STRTOFILE(lcText,"MyPrgClass.prg")
COMPILE MyPrgClass.prg
SET PROCEDURE TO MyPrgClass
CREATE FORM MyTempForm NOWAIT
LOCAL ARRAY laObj(1)
=ASELOBJ(laObj,1)
laObj(1).AddObject("MyCmd","cmd") && Добавляем PRG Defined Class на форму в Конструкторе
laObj(1).MyCmd.SaveAsClass("MyVcxClass","cmd")
Метод выдает ошибку:
ERROR 1965 One of the members of this class is based on a nonvisual class. Cannot write .VCX file.
Так же не работает:
CREATE CLASS .... AS cmd FROM MyPrgClass
Но !Можно через меню File/Save As Class ... Сохранить его как визуальный класс в vcx
и спокойно вставлять в формы / классы без потери функциональности и без эффекта переопределения свойств
(выставленных в PRG) при вставке контролв в scx/vcx в конструкторе (описано несколькими топиками ниже,
посмотрите на свойство Visible в окне свойств для кнопки)

Мой пост адресован прежде всего к Aleksey Tsingauz (боюсь исковеркать фамилию на русском)
Хотя ваш профиль в fox team, если не ошибаюсь, не связан с контролами.

Пожелание:

Дать разработчикам возможность писать визуальные классы в PRG и вставлять их в Scx/Vcx в конструкторе,
хотя такая (недокументированная) возможность есть и сейчас, но есть при этом неприятный эффект описанный выше,
который (эффект) лечится имменно субклассированием PRG классов в Vcx, а только затем их использование в формах/классах.

В идеале - возможность визуального редактирования PRG классов. И инструкции типа DEFINE FORM ...

Пожелание минимум:

Понимаю что в этой (vfp9) версии - реализоновно не будет.
Хотя бы не убирайте в релизе VFP9 возможность сохранения (пусть и извращенным способом) и функциональность PRG классов в VCX,
которая (возможность) есть vfp9public beta (09.00.0000.1720)




------------------
Ratings: 0 negative/0 positive
Re: PRG классы в SCX/VCX пожелание
Aleksey Tsingauz [MSFT]
Здравствуйте, Андрей!

Цитата:
Мой пост адресован прежде всего к Aleksey Tsingauz (боюсь исковеркать фамилию на русском)
Хотя ваш профиль в fox team, если не ошибаюсь, не связан с контролами.
Фамилия моя на русском пишется Цингауз и произносится с ударением на 'а'. А по поводу профиля вы не ошиблись, в основном я занимаюсь вещами, которые не связаны с UI напрямую. Но бывают и исключения.

Цитата:
Но !Можно через меню File/Save As Class ... Сохранить его как визуальный класс в vcx
и спокойно вставлять в формы / классы без потери функциональности и без эффекта переопределения свойств
(выставленных в PRG) при вставке контролв в scx/vcx в конструкторе (описано несколькими топиками ниже,
посмотрите на свойство Visible в окне свойств для кнопки)
Не очень понял, что это за "эффект переопределения свойств", о котором вы говорите? А вот заключение о том, что полученный класс можно спокойно вставлять в формы / классы без потери функциональности, немного преждевременно. SaveAsClass недаром возвращает ошибку, VCX не поддерживает базовые классы из PRG. Класс, который вы сохранили только кажется в порядке, на самом деле VCX содержит только имя класса (CMD), а имя библиотеки, в данном случае PRG, пусто. Когда придет время создать объект, VFP не будет знать где определен класс.

Простой тест в 09.00.0000.1720:
1) Сохраняем кнопку через File/Save As Class.
2) Создаем новую форму и добавляем новоиспеченную кнопку.
3) Сохраняем и запускаем новую форму - работает.
4) Закрываем VFP.
5) Запускаем VFP.
6) Запускаем новую форму - не работает, класс CMD не найден.
7) SET PROCEDURE TO MyPrgClass
8) Запускаем новую форму - не работает, класс CMD не найден.
9) dummy=createobject("CMD")
10) Запускаем новую форму - работает.

Дальше - хуже, таким образом можно подстелить любой другой суб-класс CommandButton с именем CMD. Какой класс будет первым найден в памяти, тот и будет испрользован. Это больше похоже на хождение по минному полю, не знаешь когда и где рванет.

А теперь еще хуже или лучше, в зависимости как посмотреть, в 09.00.0000.1913 никак не работает. Ни SET PROCEDURE TO, ни createobject("CMD") не помогают. Как не крути, а класс не найден. Я считаю, что, с точки зрения языка, это лучше. Потому что язык программирования не должен позволять подмену базового класса, а какой класс правильный неизвестно.


Цитата:
Пожелание:

Дать разработчикам возможность писать визуальные классы в PRG и вставлять их в Scx/Vcx в конструкторе,
хотя такая (недокументированная) возможность есть и сейчас, но есть при этом неприятный эффект описанный выше,
который (эффект) лечится имменно субклассированием PRG классов в Vcx, а только затем их использование в формах/классах.

В идеале - возможность визуального редактирования PRG классов. И инструкции типа DEFINE FORM ...

Очень хорошее пожелание и оно имеет больше шансов быть принято, если исходит непосредстаенно от пользователей. Так что, пожалуйста, найдите время и пошлите его на VFPFEED.

Цитата:
Пожелание минимум:

Понимаю что в этой (vfp9) версии - реализоновно не будет.
Хотя бы не убирайте в релизе VFP9 возможность сохранения (пусть и извращенным способом) и функциональность PRG классов в VCX,
которая (возможность) есть vfp9public beta (09.00.0000.1720)


Сохранение-то пока работает, но, как я уже сказал, дальше уже не работает. Да и в VFP8 не работало, форма наглухо виснет если класс не загружен в память.

Aleksey Tsingauz
Visual FoxPro Dev Team

Ratings: 0 negative/0 positive
Re: PRG классы в SCX/VCX пожелание
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Я так понял что убрали старую баго-фичу когда можно было "якобы
субклассировать" базовый класс? Ну т.е.
Имеем prg c описанием такого хитрого класса:
DEFINE CLASS DEHook AS DataEnvironment
Name = "DataEnvironment"
* Самое важное - свойсто Name класса!
PROCEDURE BeforeOpenTables
MESSAGEBOX("BeforeOpenTables")
ENDPROC
ENDDEFINE
и потом делаем так:
SET PROCEDURE TO DEHook.prg
PUBLIC o1
o1 = CREATEOBJECT("DEHook")
DO FORM SomeForm
Наблюдаем как отрабатывает наш хук.
снять его можно так:
RELEASE o1
RELEASE CLASS DataEnvironment

Пожалуйста проверьте не эту ли полезную (не возражаю против того чтб её
называть опасной и малопонятной новичку возможность убрали Ибо без
этого жизнь станет значительно тяжелее - субклассировать DE так чтобы иметь
только 1 свой базовый класс, и чтоб все имеющиеся в формы свои DE
наследовали от него - IMHO невозможно. Описывать все возможные DE как
отдельные классы (с курсорами и реляциями), а потом их уже прицеплять в
формам через DEClass и DEClassLibrary крайне утомительно (да и удвоение
числа классов несёт мало приятного) - а для отчётов там и вовсе невозможно

Конечно если бы можно было как-то BINDEVENTS() на это событие - но
оно то раньше всех других для форм отрабатывает (ну из тех что можно
сукбклассировать - т.е. событий самой формы) и негде делать привязку




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: PRG классы в SCX/VCX пожелание
Aleksey Tsingauz [MSFT]
Здравствуйте, Игорь!

Цитата:
Пожалуйста проверьте не эту ли полезную (не возражаю против того чтб её
называть опасной и малопонятной новичку возможность убрали

Это не что иное как часный случай одного и того же бага, пофиксили. Этот hook тоже где-то в документации упомянут?

Aleksey Tsingauz
Visual FoxPro Dev Team
Ratings: 0 negative/0 positive
Re: PRG классы в SCX/VCX пожелание
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Цитата:
Это не что иное как часный случай одного и того же бага,
пофиксили.
Очень жаль Даже не представляю как же теперь это
переписать Ручками то делать для каждой формы и отчёта совершенно не
хочется
Цитата:
Этот hook тоже где-то в документации упомянут?
Нет.



------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: PRG классы в SCX/VCX пожелание
Aleksey Tsingauz [MSFT]
Цитата:
Очень жаль Даже не представляю как же теперь это
переписать Ручками то делать для каждой формы и отчёта совершенно не
хочется

Игорь, что конкретно вы хотите сделать? Какая конечная цель, перехватить BeforeOpenTables или что-то еще?
Ratings: 0 negative/0 positive
Re: PRG классы в SCX/VCX пожелание
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Цитата:
Игорь, что конкретно вы хотите сделать? Какая конечная цель,
перехватить
BeforeOpenTables или что-то еще?
Да, именно его родимого и
перехватить. Дабы установить мои SET-ы для PDS и поменять пути к
табличкам/базам - как в принципе и рекомендует MSKB статья "How to
generically assign path in dataenvironment", только сделать это без
утомительного прописывания чего-либо в DE форм и отчётов. Даже смена
AutoOpenTables (с последующим переносом нужного кода в Load формы) может
утомить, если форм за сотню




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: PRG классы в SCX/VCX пожелание
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Кстати вот ещё какая идея возникла. Если в фоксе была недокументированная
возможность "субклассировать" базовый класс - т.е. создать свой
класс-хук, который "втёрся" бы перед любым другим определением класса
(т.е. стал родительским для тех классов, которые были производными от
базовых VFP классов), то возможно стоит это упорядочить и сделать штатной
фишкой? Ну например командой SET BASECLASSLIB TO MyBase.VCX/MyBase.prg (а
там по одному классу на те базовые что нужно субклассировать) ну и
соответственно RELEASE BASECLASSLIB или SET BASECLASSLIB TO без параметра.
Я понимаю что применимость (т.е. реальная полезность) этого будет
ограниченной, но уверен что она всё-же будет (полезность), и наверняка не
меньшая чем от того-же BINDEVENTS() - иного средства реализации (реально -
замещения ибо они вскоре перестали работать ) хуков.




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: PRG классы в SCX/VCX пожелание
Aleksey Tsingauz [MSFT]
Здравствуйте, Игорь!

Цитата:
Кстати вот ещё какая идея возникла. Если в фоксе была недокументированная
возможность "субклассировать" базовый класс - т.е. создать свой
класс-хук, который "втёрся" бы перед любым другим определением класса
(т.е. стал родительским для тех классов, которые были производными от
базовых VFP классов), то возможно стоит это упорядочить и сделать штатной
фишкой? Ну например командой SET BASECLASSLIB TO MyBase.VCX/MyBase.prg (а
там по одному классу на те базовые что нужно субклассировать) ну и
соответственно RELEASE BASECLASSLIB или SET BASECLASSLIB TO без параметра.
Я понимаю что применимость (т.е. реальная полезность) этого будет
ограниченной, но уверен что она всё-же будет (полезность), и наверняка не
меньшая чем от того-же BINDEVENTS() - иного средства реализации (реально -
замещения ибо они вскоре перестали работать ) хуков.

Базовый класс определяется в момент определения суб-класса. Разработчик класса, а не пользователь класса должен быть здесь главный. Так что лично я считаю, что возможности подмены базового класса быть не должно ни в каком виде. А вот разрешить использования своих cуб-классов везде и всюду было бы действительно хорошо.

Aleksey Tsingauz
Visual FoxPro Dev Team

Ratings: 0 negative/0 positive
Re: PRG классы в SCX/VCX пожелание
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Возможно что вы и правы... Только не в таком убогом виде как сделаны DEClass
сейчас...

Кстати саму идею хуков это то не отменяет. Тот-же BINDEVENTS() это
вмешательство "извне" - разработчик класса то не предполагал что кто-то там
станет вмешиваться в работу его методов. Так что возможно всё-же стоит и
такой трюк "натурализовать" в фоксе




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: PRG классы в SCX/VCX пожелание
Mitchman

Сообщений: 9978
Откуда: Николаев
Дата регистрации: 24.05.2002
Присоединяюсь к просьбе функции для подмены базового класса - нужная штучка - все равно поддерживается, но извините через задний проход.
Однажды даже сам делал.
Ratings: 0 negative/0 positive


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

On-line: 21 alex; alextash Baga akvvohinc  (Гостей: 17)

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