powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Форма не разрушается
10 сообщений из 10, страница 1 из 1
Форма не разрушается
    #33739351
andrey-g-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!

Есть форма (любая). Нужно переопределить событие в рантайме. Т.к. у меня VFP5, делаю так:

CREATEOBJECT("CHook")

DEFINE CLASS CHook AS CUSTOM
frm = _SCREEN.ActiveForm

FUNCTION frm.Click
....
ENDFUNC
ENDDEFINE

Все работает, кроме одного: после такого трюка форма отказывается разрушаться на Form.Release(). Не могу понять, почему.
...
Рейтинг: 0 / 0
Форма не разрушается
    #33739500
Проходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Батенька, вы случаем не вирус пишете? Или просто самомодифицирущуюся программу? Вы считаете самомодификацию правильным путем? Может лучше подумать в сторону выполнения разных кусков кода в обработчике события?
...
Рейтинг: 0 / 0
Форма не разрушается
    #33739508
Проходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А не релизится она как минимум вот по этой причине:
Код: plaintext
frm = _SCREEN.ActiveForm
То есть в твоем перехватчике осталась ссылка на форму.
...
Рейтинг: 0 / 0
Форма не разрушается
    #33739572
andrey-g-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На самом деле я уже сделал все "по честному", изменив логику и просто добавляя новый контрол. Но вопрос остался, хочется разобраться.

Извиняюсь за ламерство, но я не совсем понял что значит "в перехватчике осталась ссылка..". Ведь объект, создаваемый CREATEOBJECT тут же разрушается. И RELEASE ALL/CLEAR CLASS/CLEAR MEMORY/ets не помогают
(помогает только CLEAR ALL - почему?).
...
Рейтинг: 0 / 0
Форма не разрушается
    #33739624
Проходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут же - это где? Никакого кода по уничтожению перехватчика я здесь что-то не наблюдаю.
...
Рейтинг: 0 / 0
Форма не разрушается
    #33739783
andrey-g-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот оно что!
Я полагал, что подобный "навесной" обработчик нельзя явно уничтожить. Как же это сделать, подскажите.
...
Рейтинг: 0 / 0
Форма не разрушается
    #33739828
Проходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для начала лучше будет если Вы разъясните саму задачу, ради решения которой вы затеяли этот, мягко говоря, очень некорректный в любом языке программирования сыр-бор с изменением исполняемого кода во время его работы? И что вы надеялись получить от написанного Вами класса? Это полное описание класса? И где вы научились в описании одного класса переопределять методы другого, при том никак не связанного с описываемым, класса? К какому из основных столпов ООП относится данная технология? Полиморфизму? Наследованию? Инкапсуляции? Особенно мне интересно как эта технология согласуется с инкапсуляцией?
Короче, что-то тут с выбором решения явно не так.
Это первая, занудная, часть. :)

Часть вторая, формальная.

авторCREATEOBJECT("CHook")
Обычно в фоксе объект не просто создается, а сразу запоминается ссылка на него. Ибо нет иной возможности работать с объектом кроме как через ссылку на него. Т.е. процитированный код должен выглядеть примерно так:

Код: plaintext
oMyObjecnt=CREATEOBJECT("CHook")

Вот теперь мы можем обратиться к объекту. В том числе и уничтожить:

Код: plaintext
Release oMyObjecnt
...
Рейтинг: 0 / 0
Форма не разрушается
    #33739877
andrey-g-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С инкапсуляцией это никак не согласуется, согласен. Но тут уж вина не моя, а VFP5. Ведь сделали же потом BindEvent() и UnBind...

Явное разрушение не помогает, я пробовал (в т.ч. RELEASE ALL, как я выше указал).

Я думал так: в фоксе объект уничтожается, если его внутренний счетчик ссылок =0 (ну так вроде обычно это делается). Операция присваивания счетчик увеличивает, release - уменьшает. Соответственно если присваивания нет, объект должен разрушиться сразу после создании.
В доказательство: если дополнить CHook событием Destroy, где поместить, например, MESSAGEBOX - мы увидим его сразу же после вызова CREATEOBJECT.
...
Рейтинг: 0 / 0
Форма не разрушается
    #33739965
andrey-g-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пришла в голову очевидная вещь. Если сделать так
Код: plaintext
1.
2.
3.
4.
5.
6.
DEFINE CLASS CHook AS Custom
   _s = _SCREEN
  FUNCTION _s.ActiveForm.Click
     ...
  ENDFUNC
ENDDEFINE
то проблема отпадет сама собой, т.к. ссылка на форму не создается.

Это работает. Но для меня остается загадкой, где висит эта скрытая ссылка и как ее грамотно "убить". Другими словами, как удалить установленный перехватчик.

P.S. Проходящему спасибо за ответы.
...
Рейтинг: 0 / 0
Форма не разрушается
    #33741395
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi andrey!

> Это работает. Но для меня остается загадкой, где висит эта скрытая ссылка
> и как ее грамотно "убить". Другими словами, как удалить установленный
> перехватчик.

Думаю что не стоит этим вообще заниматься - это была недокументированная
фишка фокса, и только лишь её MSFT документировал (кажись в VFP9 или может
VFP8 это было), как тут-же она перестала работать :)
Вообще ActiveForm это хитрый зверь - это не ссылка в нормальном смысле этого
понятия - это какой-то внутренний механизм доступа к объекту формы - БЕЗ
инкрементирования/декрементирования внутреннего счётчика ссылок. А вот когда
ты объявляешь свойство (вполне штатную структуру) и запихиваешь в неё
_SCREEN.ActiveForm - то походу создаётся вполне реальная ссылка на объект и
счётчик наращивается - а вот что там с его уничтожением происходит - это уже
совсем другой вопрос... Думаю что кроме разработчиков VFP никто точно
ответить не сможет - а VFP5 это настолько древняя версия, что вряд-ли это
вообще реально - узнать что там и как.

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


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