|
|
|
Форма не разрушается
|
|||
|---|---|---|---|
|
#18+
Всем привет! Есть форма (любая). Нужно переопределить событие в рантайме. Т.к. у меня VFP5, делаю так: CREATEOBJECT("CHook") DEFINE CLASS CHook AS CUSTOM frm = _SCREEN.ActiveForm FUNCTION frm.Click .... ENDFUNC ENDDEFINE Все работает, кроме одного: после такого трюка форма отказывается разрушаться на Form.Release(). Не могу понять, почему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2006, 17:04 |
|
||
|
Форма не разрушается
|
|||
|---|---|---|---|
|
#18+
Батенька, вы случаем не вирус пишете? Или просто самомодифицирущуюся программу? Вы считаете самомодификацию правильным путем? Может лучше подумать в сторону выполнения разных кусков кода в обработчике события? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2006, 17:48 |
|
||
|
Форма не разрушается
|
|||
|---|---|---|---|
|
#18+
А не релизится она как минимум вот по этой причине: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2006, 17:50 |
|
||
|
Форма не разрушается
|
|||
|---|---|---|---|
|
#18+
На самом деле я уже сделал все "по честному", изменив логику и просто добавляя новый контрол. Но вопрос остался, хочется разобраться. Извиняюсь за ламерство, но я не совсем понял что значит "в перехватчике осталась ссылка..". Ведь объект, создаваемый CREATEOBJECT тут же разрушается. И RELEASE ALL/CLEAR CLASS/CLEAR MEMORY/ets не помогают (помогает только CLEAR ALL - почему?). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2006, 18:10 |
|
||
|
Форма не разрушается
|
|||
|---|---|---|---|
|
#18+
Тут же - это где? Никакого кода по уничтожению перехватчика я здесь что-то не наблюдаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2006, 18:28 |
|
||
|
Форма не разрушается
|
|||
|---|---|---|---|
|
#18+
Вот оно что! Я полагал, что подобный "навесной" обработчик нельзя явно уничтожить. Как же это сделать, подскажите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2006, 19:52 |
|
||
|
Форма не разрушается
|
|||
|---|---|---|---|
|
#18+
Для начала лучше будет если Вы разъясните саму задачу, ради решения которой вы затеяли этот, мягко говоря, очень некорректный в любом языке программирования сыр-бор с изменением исполняемого кода во время его работы? И что вы надеялись получить от написанного Вами класса? Это полное описание класса? И где вы научились в описании одного класса переопределять методы другого, при том никак не связанного с описываемым, класса? К какому из основных столпов ООП относится данная технология? Полиморфизму? Наследованию? Инкапсуляции? Особенно мне интересно как эта технология согласуется с инкапсуляцией? Короче, что-то тут с выбором решения явно не так. Это первая, занудная, часть. :) Часть вторая, формальная. авторCREATEOBJECT("CHook") Обычно в фоксе объект не просто создается, а сразу запоминается ссылка на него. Ибо нет иной возможности работать с объектом кроме как через ссылку на него. Т.е. процитированный код должен выглядеть примерно так: Код: plaintext Вот теперь мы можем обратиться к объекту. В том числе и уничтожить: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2006, 20:29 |
|
||
|
Форма не разрушается
|
|||
|---|---|---|---|
|
#18+
С инкапсуляцией это никак не согласуется, согласен. Но тут уж вина не моя, а VFP5. Ведь сделали же потом BindEvent() и UnBind... Явное разрушение не помогает, я пробовал (в т.ч. RELEASE ALL, как я выше указал). Я думал так: в фоксе объект уничтожается, если его внутренний счетчик ссылок =0 (ну так вроде обычно это делается). Операция присваивания счетчик увеличивает, release - уменьшает. Соответственно если присваивания нет, объект должен разрушиться сразу после создании. В доказательство: если дополнить CHook событием Destroy, где поместить, например, MESSAGEBOX - мы увидим его сразу же после вызова CREATEOBJECT. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2006, 21:19 |
|
||
|
Форма не разрушается
|
|||
|---|---|---|---|
|
#18+
Пришла в голову очевидная вещь. Если сделать так Код: plaintext 1. 2. 3. 4. 5. 6. Это работает. Но для меня остается загадкой, где висит эта скрытая ссылка и как ее грамотно "убить". Другими словами, как удалить установленный перехватчик. P.S. Проходящему спасибо за ответы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2006, 23:18 |
|
||
|
Форма не разрушается
|
|||
|---|---|---|---|
|
#18+
Hi andrey! > Это работает. Но для меня остается загадкой, где висит эта скрытая ссылка > и как ее грамотно "убить". Другими словами, как удалить установленный > перехватчик. Думаю что не стоит этим вообще заниматься - это была недокументированная фишка фокса, и только лишь её MSFT документировал (кажись в VFP9 или может VFP8 это было), как тут-же она перестала работать :) Вообще ActiveForm это хитрый зверь - это не ссылка в нормальном смысле этого понятия - это какой-то внутренний механизм доступа к объекту формы - БЕЗ инкрементирования/декрементирования внутреннего счётчика ссылок. А вот когда ты объявляешь свойство (вполне штатную структуру) и запихиваешь в неё _SCREEN.ActiveForm - то походу создаётся вполне реальная ссылка на объект и счётчик наращивается - а вот что там с его уничтожением происходит - это уже совсем другой вопрос... Думаю что кроме разработчиков VFP никто точно ответить не сможет - а VFP5 это настолько древняя версия, что вряд-ли это вообще реально - узнать что там и как. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2006, 23:50 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=41&tid=1591631]: |
0ms |
get settings: |
5ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
135ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 217ms |
| total: | 438ms |

| 0 / 0 |
