:: Visual Foxpro, Foxpro for DOS
Re: Как добавить метод к пользовательскому объекту
akvvohinc
Автор

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
of63
SET PROC TO prg1 ADDI испортит Ф своими ф-иями, точнее, может испортить (смотря какую ф-ию фокс найдет первее)

Ты хочешь сказать, что заранее нельзя предвидеть, из какого процедурного файла будет вызвана одноименная функция в варианте:
SET PROCEDURE TO proclib1
SET PROCEDURE TO proclib2 ADDITIVE
?

Ведь есть же вполне определенные правила, по которым Фокс ищет вызываемую функцию:
- сначала пытается найти ее в том же самом PRG, что и вызывающая;
- затем - в подключенных с помощью SET PROCEDURE "библиотеках", причем, если их несколько, то в порядке "слева направо" если смотреть на строку, возвращаемую SET('PROCEDURE');
- и так далее.

Поэтому, если порядок, получаемый по
SET PROCEDURE TO proclib1
SET PROCEDURE TO proclib2 ADDITIVE

тебя не устраивает, то несложно добавить proclib2 перед proclib1:
oldproc = SET('PROCEDURE')
SET PROCEDURE TO proclib2, &oldproc

Исчезла надобность в функциях из proclib2 - отключаем ее:
RELEASE PROCEDURE proclib2

PS
А в целом, ты меня "запутал".
Начал с того, что SET PROC prg1 ADDITIVE тебе, якобы, мешала вызывать одноименные функции фреймворка (я так понял). А позже выяснилось, что функции prg1 и должны были иметь более высокий приоритет. Тогда требовалось лишь подключить prg1 в начало списка подключенных процедур, и все - можно вызывать функции prg1 "как функции".



Исправлено 4 раз(а). Последнее : akvvohinc, 27.04.17 22:28
Ratings: 0 negative/1 positive
Re: Как добавить метод к пользовательскому объекту
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Можно воспользоваться гарантией от VFP, что первее, та которая левее в списке от SET('PROCEDURE'), мне показалось это чересчур уж зависимой от какой то "макро" зависимости (на самом деле, я даже не предполагал такого использования возврата от SET('PROCEDURE') Ты первый открыл такой макрос? Сам придумал только что, или давно использовал?

> функции prg1 и должны были иметь более высокий приоритет
> Тогда требовалось лишь подключить prg1 в начало списка подключенных процедур, и все - можно вызывать функции "как функции".
Зря ты пристал к этому SET PROCEDURE, не только в нем счастье. Я уже говорил - недостаток его глобальный - подключаются ВСЕ процедуры этого файла в общее поле зрения. Это надо не всегда. Путь обхода этого свойства - DO proc IN pror1.prg. Нюансы разруливания одноименных процедур фреймверка и DO IN ты уже назвал неоднократно, но, видно выбранный вариант понимания/использования не сложил в систему, и не вшил в генетический код программы и в себя )
Ratings: 0 negative/1 positive
Re: Как добавить метод к пользовательскому объекту
ssa

Сообщений: 13008
Откуда: Москва
Дата регистрации: 23.03.2005
of63
Я уже говорил - недостаток его глобальный - подключаются ВСЕ процедуры этого файла в общее поле зрения. Это надо не всегда.
Как обычно: сначала создаем себе проблемы, потом героически их преодолеваем и сетуем, что разрабы фокса не создали средства обхода нами придуманных проблем. Зачем пихать не всегда нужные модули в один файл? Что мешает их разложить по файлам в соответствии с их нужностью? Боимся за разрастающийся список в set procedure?

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/1 positive
Re: Как добавить метод к пользовательскому объекту
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Видимо имелось в виду что можно вообще "забыть" отключить эту prg (и "всё пропало"), либо же она такая хитрая, что в какой-то момент отдаёт управление "внешним" функциям, а они (т.к. ещё не было отключения prg1 - и это логично/правильно) начав вызывать всякие funcN попадут во "временно подключенный prg1".

В общем ересь всё это. "Суета сует и томление духа" - а всё от того что процедурный подход в общем случае не имеет адекватных механизмов разграничения для "одноимённых" процедур. Т.е. по сути ОБЯЗЫВАЕТ использовать абсолютно уникальные имена процедур в рамках ВСЕЙ системы (естественно, это крайне затруднительно обеспечить в большом проекте с использованием "чужого" кода).

ssa
Зачем пихать не всегда нужные модули в один файл?
Да не, они "нужные". Только называются DoWork() - и так во всех 100500 процедурных файлах
Вот в каждом фоксовом классе есть метод-обработчик Init. Но Init одного класса никак не мешает и не пересекается с Init другого. А с процедурами это по большому счёту нельзя реализовать. Ну да, частично решает "вместо подключения использовать DO ... IN ...".
Но полностью эту проблему может решить только уникальное именование ВСЕХ процедур в проекте - что IMHO крайне сложно реализуемо в мало-мальски большом приложении.


------------------
WBR, Igor
Ratings: 0 negative/1 positive
Re: Как добавить метод к пользовательскому объекту
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Сергей, чего мы боимся? ...

> Зачем пихать не всегда нужные модули в один файл? Что мешает их разложить по файлам в соответствии с их нужностью? Боимся за разрастающийся список в set procedure?
> подключаются ВСЕ процедуры этого файла в общее поле зрения

Мне сделать 100 файлов, в разных категориях нужности ? 1000 процедур. В 10тке файлов PRG. Все нужны. Зря процедуры не делаюются, или делаются, но не запросто переделываются. И что? Это разложение поможет мне свободно подключить процедуру дворника дяди Васи в рантайме проги? Или свободно исполнить программу "Уборко" в модуле:

DO Уборко IN УборкоПро.prg
* или
SET PROC УборкоПро.prg ADDI
DO Уборко
немного разные вещи, Сергей, о чем мы и говорим. "Зачем пихать не всегда нужные модули в один файл" - кто-то что-то написал, и напихал. К перепихону, конечно, можно относиться лояльно, но, буквально, на это может не хватить времени, возможностей. Проще выполнить прогу в первозданом виде, в DO.. IN...
Ratings: 0 negative/1 positive
Re: Как добавить метод к пользовательскому объекту
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Игорь, наверняка и ты это просчитываешь, когда добавляешь PUBLIC-переменную, или в goApp свою ссылку, переменную, метод, PROCEDURE-функцию:

> Т.е. по сути ОБЯЗЫВАЕТ использовать абсолютно уникальные имена процедур в рамках ВСЕЙ системы (естественно, это крайне затруднительно обеспечить в большом проекте с использованием "чужого" кода).
Ratings: 0 negative/1 positive
Re: Как добавить метод к пользовательскому объекту
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Дело в том что классов на порядок меньше чем процедур (т.к. класс это и есть 10-20 процедур "в одном флаконе"). Поэтому управится с ними гораздо проще.
Да, если разраб дурак, тут ничего не поможет - он так же замечательно соорудит 100 одноимённых классов, подключит их все через SET CLASS и будет потом вопрошать "а чего это оно так странно работает"...

Даже в дотнете, где поверх имени класса есть ещё и namespace (откуда у классов и получаются такие "километровые" полные имена System.Windows.Forms.Textbox) - чтобы ну уж совсем избежать проблемы "одноимённых сущностей". Да ещё и сам компилятор следит за "возмножной неоднозначностью" при разрешении имени... Идиоты умудряются выстрелить себе в ногу. Что уж говорить про фокс, где вообще контроля по сути никакого...

P.S.
of63
поможет мне свободно подключить процедуру дворника дяди Васи в рантайме проги?
Именно это лично я считаю НАИХУДШЕЙ из возможностей фокса. Дать элементарную возможность выполнять абсолютно произвольный код, абы кем и абы как написанный...

------------------
WBR, Igor
Ratings: 0 negative/1 positive
Re: Как добавить метод к пользовательскому объекту
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
"свободно подключить процедуру дворника дяди Васи" - это нормально, и далеко не наихудшая возможность фокса, скорее приятная

> получаются такие "километровые" полные имена System.Windows.Forms.Textbox
в шарпе, в фрейверке его, наплодили этой иерархичности, что ... мата не хватает. С таким же успехом я себе написал бы нужных мне компонентов, чем выучить ихний набор функций

> классов на порядок меньше чем процедур
Игорь, классов, например с 100, в каждом по 10ку всяких функций (ВИДИМЫХ) - это ужасно, но таковы реалии. Ни одну "функцию" не выкинуть, она типа "нужна" людям. Посмотри листочек за любой месяц оплаты за проживание в квартире - там куча чисел, в проге - там еще на порядок больше чисел/человека, отчетность - еще на порядок больще...
Ratings: 0 negative/0 positive
Re: Как добавить метод к пользовательскому объекту
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Igor Korolyov
если разраб дурак


Мда... Надо бы усилить эту сентенцию: "если ты дурак, иди в разрабы"
Ratings: 0 negative/1 positive
Re: Как добавить метод к пользовательскому объекту
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
В разрабы идут, кому это положено, всякое го..но разрабатывать, авто всякие, которыми все засирают город, ракеты, заряды, которыми люди швыряюится друг в друга. Дело нехорошее, явно. Вобще, цивилизация резко скакнула "вперед" в технике, в физике, первые, кстати, были математики (Лаградж, Гамильтон, современные Гильберт (это фактически соавтор ОТО), Риман, Пуанкаре (Анри, и брат еще у него математик))... Отскок, наверное, будет, ну, типа скученность в городах, болезни, рак, психи, терроризм. Что-то может другое придумают, стартаперы, кроме доставки на дом, например "герыча", чем-то другим озаботятся...

... Игорь навеял, без поллитры, де, или герыча, он чужой код разбирать не согласен... )
Ratings: 0 negative/1 positive
Re: Как добавить метод к пользовательскому объекту
akvvohinc
Автор

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
of63
Ты первый открыл такой макрос? Сам придумал только что, или давно использовал?

Думаю, этот "макрос" многие открывали для себя сами и независимо друг от друга.

А вот то, что я открыл не сам, а где-то подсмотрел в свое время, было гораздо менее очевидно:
в FPD не было возможности подцепить несколько процедурных файлов командой SET PROCEDURE. А потребность в чем-то подобном имелась - например, один такой процедурный файл имелся во "фреймворке", а другой (другие) - в каждом приложении.
Вот все процедурные файлы, начиная со второго (первый подключался по SET PROC), "грузились" в память по такой схеме "холостого цикла":

main вызывала proclib1('proclib2, proclib3, main01')
proclib1 вызывал процедуру, переданную первой в списке, передавая ей остаток параметра - proclib2('proclib3, main01')
proclib2 вызывал процедуру, переданную первой в списке, передавая ей остаток параметра - proclib3('main01')
А вызываемая в конце main01 - это процедура головной программы main, с которой следовало продолжить ее работу.

При этом все процедуры/функции всех процедурных файлов - proclib1, proclib2 и proclib3 становились постоянно доступны всему приложению, так как все эти процедуры в результате такого циклического вызова:
main -> proclib1 -> proclib2 -> proclib3 -> main
не были завершены по RETURN.



Исправлено 1 раз(а). Последнее : akvvohinc, 28.04.17 01:03
Ratings: 0 negative/1 positive
Re: Как добавить метод к пользовательскому объекту
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
т.е не было, или была неизвестна, якобы, опция ADDITIVE при SET PROCEDURE, а также предзнание алгоритма искалки фокса процедур. Ну и нормально, Сергей. Решил, получилось, и это достойно уважения, если прога работает.
Ratings: 0 negative/1 positive
Re: Как добавить метод к пользовательскому объекту
akvvohinc
Автор

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
т.е не было, или была неизвестна, якобы, опция ADDITIVE при SET PROCEDURE, а также предзнание алгоритма искалки фокса процедур.

В DOSе синтаксис был таким:
SET PROCEDURE TO [<filename>]

то есть, никаких тебе списков, никаких ADDITIVE.

Что же касается "предзнания алгоритма искалки фокса процедур", то как ты выполнишь функцию "как функцию" из не подключенного процедурного файла? Этот файл должен быть уже загружен, что показанный "холостой цикл" и обеспечивал.



Исправлено 1 раз(а). Последнее : akvvohinc, 28.04.17 02:32
Ratings: 0 negative/1 positive
Re: Как добавить метод к пользовательскому объекту
AdamAry

Сообщений: 843
Дата регистрации: 14.12.2015
of63
Берешь и пишешь в Click кнопки
LPARAMETERS m.par1
IF PCOUNT()=0 && штатный обработчик Click
...
ELSE && нештатный код, выполняется при "нелегальном" вызове: ThisForm.кнопка.Click(1)
...
ENDIF
Да, круто.
Ratings: 0 negative/0 positive
Re: Как добавить метод к пользовательскому объекту
AdamAry

Сообщений: 843
Дата регистрации: 14.12.2015
Berloga
Единственное, что к сожалению не сделано в Фоксе - нельзя добавлять свои методы к объектам формы.
Можно поменять класс формы на свой класс из своей библиотеки с помощью Redefine в Class Browser, предварительно нажав на кнопку View Additional File. И далее работать с формой как с формой, но при этом на форме свои фичи. Вполне легальное действие.

Как использовать Redefine и в чём его принципиальный смысл?
Можно какой либо пример.
Ratings: 0 negative/0 positive
Re: Как добавить метод к пользовательскому объекту
AdamAry

Сообщений: 843
Дата регистрации: 14.12.2015
Igor Korolyov
Решение - разместим метод "спецдействия" на каждой кнопке. Как добавить метод? Конечно, создав класс "кнопкаСспецдействием".
И это разумно. При том в классе можно описать "стандартное" поведение (если таковое имеется), а на самой форме, для пары кнопок переписать это "стандартное" на своё "особо хитрое".
Это логично, понятно и достаточно красиво.

Как это сделать, можно пример?
Ratings: 0 negative/0 positive
Re: Как добавить метод к пользовательскому объекту
AdamAry

Сообщений: 843
Дата регистрации: 14.12.2015
of63
=ADDPROPERTY(goApp, "staticMyClass", CREATEOBJECT("MyClass"))
А это прокатывает?
Ratings: 0 negative/0 positive
Re: Как добавить метод к пользовательскому объекту
AdamAry

Сообщений: 843
Дата регистрации: 14.12.2015
akvvohinc
можно вызывать функции prg1 "как функции"
Как это?
Ratings: 0 negative/0 positive
Re: Как добавить метод к пользовательскому объекту
AdamAry

Сообщений: 843
Дата регистрации: 14.12.2015
Да не они "нужные" и
Igor Korolyov
Да не, они "нужные"
имеют противоположный смысл.
Я уверен что
DO proc1 IN my.prg
будет однозначно ввызывать именно proc1 и именно из my.prg, а не одноимённую из другого файла.



Исправлено 3 раз(а). Последнее : AdamAry, 28.04.17 09:22
Ratings: 0 negative/0 positive
Re: Как добавить метод к пользовательскому объекту
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
AdamAry
of63
Берешь и пишешь в Click кнопки
LPARAMETERS m.par1
IF PCOUNT()=0 && штатный обработчик Click
...
ELSE && нештатный код, выполняется при "нелегальном" вызове: ThisForm.кнопка.Click(1)
...
ENDIF
Да, круто.

Вот собственно, из-за чего весь спор.
Коли кто то делает так, и не хочет иначе, его дело.
Но показать другим, что так делать не следует.
Это вовсе не круто.
Это всего лишь первый камень в программу.
Накидать таких можно много.
И при таком стиле, их кол-во будет расти очень быстро.

А я вот честно не понимаю. Неужели лень создать свой класс от нативного, и добавить туда нужные методы, и не дергать нативные события.
"Избавились от лишнего класса" - как то... не те слова.)


------------------
Ratings: 0 negative/3 positive


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

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

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