На каком событии можно отловить перемещение формы VB?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

На каком событии можно отловить перемещение формы VB?

Сообщение 0xy » 18.01.2011 (Вт) 14:28

Resize не ловит, а больше ни чего похожего я не заметил.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: На каком событии можно отловить перемещение формы VB?

Сообщение Хакер » 18.01.2011 (Вт) 14:29

Штатно — нельзя.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: На каком событии можно отловить перемещение формы VB?

Сообщение Денис » 18.01.2011 (Вт) 14:35

Только если устроит такой вариант: по таймеру отслеживать у формы Top и Left. И если одно из них изменилось, поднимать самодельное событие. Но очевиден минус. Событие поднимется как минимум при следующем поднятии события таймера, а не в момент изменения Top или Left.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: На каком событии можно отловить перемещение формы VB?

Сообщение Хакер » 18.01.2011 (Вт) 14:45

Есть ещё мега-извратный вариант, в котором всё обходится штатными средствами. Под окно положить точно такое же, но пустое. Если верхнее окно сдвинется, в нижнем возникнет событие Paint.

Сказал только из познавательных соображений, крайне предостерегаю от замысла действительно так сделать. Например, можно сделать проект так, чтобы под отладкой в IDE использовал этот извратный метод, а в скомпилированном файле работал вариант, работающий через сабклассинг. Выигрыш в том, что под IDE при внезапном стопе не снятый WP не вызовет крах.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: На каком событии можно отловить перемещение формы VB?

Сообщение arthur2 » 18.01.2011 (Вт) 17:16

Хакер писал(а):не снятый WP не вызовет крах
Ты же сам мне рассказывал, что это не WP вызывает крах :)
Хакер писал(а):Например, можно сделать проект так, чтобы под отладкой в IDE использовал этот извратный метод
Если уж идти не простым, а замысловатым путём, то лучше уж выбрать не такой сверхмутный путь, а стандартный субклассинг. Падений в большинстве случаев вполне можно избежать :oops:
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: На каком событии можно отловить перемещение формы VB?

Сообщение Хакер » 18.01.2011 (Вт) 18:02

arthur2 писал(а):Ты же сам мне рассказывал, что это не WP вызывает крах :)

Крах вызывает не WP, которого к этому моменту уже нет, а тот факт, что его уже нет, а он ещё значится. Крах вызывает попытка выполнения мусора, который лежит там, где раньше был WP.

arthur2 писал(а):Если уж идти не простым, а замысловатым путём, то лучше уж выбрать не такой сверхмутный путь, а стандартный субклассинг.

Ты не понял, что-ли? Под IDE ради одного такого дела городить сабклассинг, вокруг которого городить меры по его безопасному снятию — это чересчур не оправдано.

Или ты с тех пор написал таки плагин для обеспечения безопасных Callback-ов?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: На каком событии можно отловить перемещение формы VB?

Сообщение arthur2 » 18.01.2011 (Вт) 20:09

Хакер писал(а):Или ты с тех пор написал таки плагин для обеспечения безопасных Callback-ов?
Я пользуюсь им в том виде, в каком и оставил viewtopic.php?p=6726674#p6726674 Ни какие энды ему не страшны, просто не удалось добиться классического вида winproc. Но и то, что было до этого - с классическим видом wp - тоже почти безопасно :)

Хакер писал(а):его уже нет, а он ещё значится
На сколько я понмю, его уже нет и он уже даже не значится, но крах всё равно происходит...
Хакер писал(а):если в своей WP первым же делом снять сабклассинг и вызвать End, то среда всё равно закроется. И это при том, что на момент вызов End'а всё будет в ровно таком же положении, как до установки сабклассинга.
Хакер писал(а):Кроме того, я проверил, возвращается ли выполнение из процедуры, в которой был вызван End, туда, откуда вызвана процедуры и убедился, что не возвращается. Так что возврат в выгруженный код сразу надо исключить.


Хакер писал(а):Под IDE ради одного такого дела городить сабклассинг, вокруг которого городить меры по его безопасному снятию — это чересчур не оправдано.

Ты предлагаешь под ИДЕ пользоваться каким-то левым мутным способом, который будет вести себя совсем не так, как в релизе субклассинг? Ты предлагаешь вставить в релиз субклассинг, код которого вообще никак не будет отлаживаться (потому что на время отладки он заменен на что-то мутное)? Ты как-то сам на себя не похож :)
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: На каком событии можно отловить перемещение формы VB?

Сообщение Хакер » 18.01.2011 (Вт) 20:18

arthur2 писал(а):На сколько я понмю, его уже нет и он уже даже не значится, но крах всё равно происходит...

Это если вызывать End из события, обработчик которого вызван из WP, которой больше нет.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: На каком событии можно отловить перемещение формы VB?

Сообщение arthur2 » 19.01.2011 (Ср) 6:22

Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: На каком событии можно отловить перемещение формы VB?

Сообщение arthur2 » 19.01.2011 (Ср) 7:41

Хакер писал(а):Выигрыш в том, что под IDE при внезапном стопе не снятый WP не вызовет крах.

И всё-таки - карх вызывает не неснятых wp :
Код: Выделить всё
Option Explicit

Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Public Const GWL_WNDPROC = (-4)

Public OldWindowProc As Long

Public Function NewWindowProc(ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
   Debug.Print msg
   NewWindowProc = CallWindowProc(OldWindowProc, hwnd, msg, wParam, lParam)
End Function

Код: Выделить всё
Option Explicit

Private Sub Form_Load()
   OldWindowProc = SetWindowLong(Command1.hwnd, GWL_WNDPROC, AddressOf NewWindowProc)
End Sub

Возвращения старой WP в коде - вообще нету. И тем не менее - проект не сдохнет ни по закрытии окна, ни по стопу :)
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: На каком событии можно отловить перемещение формы VB?

Сообщение Хакер » 19.01.2011 (Ср) 7:44

arthur2 писал(а):И тем не менее - проект не сдохнет ни по закрытии окна, ни по стопу :)

Это заявление вместе с кодом имеет такую же силу, какую бы имело заявление «можно писать в абсолютно любое место в памяти», написанное после кода, в котором запись делается по адресу Int(Rnd*size_of_address_space), и который, о чудо, пару раз отработал и не вызвал крах.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: На каком событии можно отловить перемещение формы VB?

Сообщение arthur2 » 19.01.2011 (Ср) 7:54

Хакер писал(а):и который, о чудо, пару раз отработал и не вызвал крах

Этот код не умирает, потому что на момент стопа ничего внутри WP не происходит. Поэтому никакого чуда.

Если End поставить в обработчик клика субклассируемой кнопки - проект сдохнет, если End поставить в обработчик клика формы - ровным счетом ничего особенного не произойдет.
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: На каком событии можно отловить перемещение формы VB?

Сообщение Хакер » 19.01.2011 (Ср) 7:56

arthur2 писал(а):Этот код не умирает, потому что на момент стопа ничего внутри WP не происходит.

И?
1) Разве я не об этом говорил?
2) Разве это не является случайным фактором?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: На каком событии можно отловить перемещение формы VB?

Сообщение arthur2 » 19.01.2011 (Ср) 8:01

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

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: На каком событии можно отловить перемещение формы VB?

Сообщение Хакер » 19.01.2011 (Ср) 8:06

arthur2 писал(а):Ты говорил о том, что возврат в выгруженный код - как причину краха - нужно исключить.

Откуда нужно исключить выгруженный код?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: На каком событии можно отловить перемещение формы VB?

Сообщение arthur2 » 19.01.2011 (Ср) 8:26

Хакер писал(а):Откуда нужно исключить выгруженный код?
исключить - как причину краха. Исключить из списка возможных причин краха. Исключить не код, а возврат в код.

Не спрашивай, как хранится этот список :D
Последний раз редактировалось arthur2 19.01.2011 (Ср) 8:31, всего редактировалось 1 раз.
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: На каком событии можно отловить перемещение формы VB?

Сообщение Хакер » 19.01.2011 (Ср) 8:28

В этой теме я такого не говорил. Что я говорил в той теме, я точно не помню. Сейчас я не считаю, что это нужно исключить из списка возможных причин.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: На каком событии можно отловить перемещение формы VB?

Сообщение arthur2 » 19.01.2011 (Ср) 8:33

Артур
 
   


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот, Yandex-бот и гости: 41

    TopList