Вопрос по структуре WindowProc

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Вопрос по структуре WindowProc

Сообщение Pantalone » 01.09.2006 (Пт) 19:42

Интересует вопрос почему многие, в том числе и тут на форуме пишут следующий код:

Код: Выделить всё
Public Function WindowProc(ByVal hwnd As Long, _
    ByVal uMsg As Long, ByVal wParam As Long, _
    ByVal lParam As Long) As Long

    Select Case uMsg

        Case A:

        Case B:

        Case Else
            WindowProc = (CallWindowProc(lpProcOrg, hwnd, uMsg, wParam, lParam))
    End Select

End Function


Разве не должна строка
WindowProc = (CallWindowProc(lpProcOrg, hwnd, uMsg, wParam, lParam))

выполняться в любом случае всегда? Т.е. не надо ли ее вынести из Case вообще?
И кстати насколько вредно писать в самом начале WindowProc
Код: Выделить всё
On Error Resume Next

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.09.2006 (Пт) 20:16

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

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 01.09.2006 (Пт) 21:22

Не понятно.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 02.09.2006 (Сб) 6:07

Учи матчасть. Без вариантов. Все необходимое легко найти поиском. Для начала вдумайся в смысл вызова CallWindowProc и в смысл использования On Error Resume Next.
Весь мир матрица, а мы в нем потоки байтов!

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 02.09.2006 (Сб) 14:08

Спасибо за помощ, я знал к кому обратиться. :(

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 02.09.2006 (Сб) 15:00

Pantalone
On Error Resume Next ни стоит писать нигде. Это тебе пытались намекнуть.
Разве не должна строка

Строка тебе ничего не должна... Следует лишь думать, нужно ли после ручной обработки сообщения вызывать стандартную функцию или не нужно...
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 05.09.2006 (Вт) 19:18

Очередной глупый вопрос от панталоне, сколько можно таких хуков повесить например на форму? В смысе хуков где сообщения отлавливаются через WindowProc.
Т.е.
SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WindowProc)
Просто у меня кучка модулей с этими хуками, не хотелось бы все это в один модуль сваливать, так проще разбираться.
Пожалуйста если можно без подколок и намеков на тупость.
И выглядеть это будет так:
SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WindowProc1)
SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WindowProc2)
SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WindowProc3)

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 05.09.2006 (Вт) 19:44

А зачем оно надо? Все сообщения можно обрабатывать в одном обработчике. В зависимости от сообщения вызывать ту или иную процедуру из любого модуля. Хотя бы ту же самую WindowProc() :)
Лучший способ понять что-то самому — объяснить это другому.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 05.09.2006 (Вт) 20:01

сколько можно таких хуков повесить например на форму
В теории много. Хотя из вопроса следует, что вы едва ли на 10% представляете себе их принцип действия.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 05.09.2006 (Вт) 20:57

Да, с представлением пока не очень, поэтому такое вот стресс-тестирование :)

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

Сообщение Хакер » 05.09.2006 (Вт) 21:37

On Error Resume Next ни стоит писать нигде.

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

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 05.09.2006 (Вт) 21:52

Хакер писал(а):
On Error Resume Next ни стоит писать нигде.

А вот это, вот кстати, очень даже не правильно... :? стоит писать, и там где это действительно нужно.
Случаев, когда это действительно нужно, настолько мало, что для того, что бы не сбивать человека с толку, лучше сказать, что этого не стоит писать нигде. Когда же автор нарвется на этот уникальный случай (что-то с ходу не придумывается, когда это бывает), он сам поймет, что ему нужно.
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

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

Сообщение Хакер » 05.09.2006 (Вт) 21:57

Нет, это совсем не уникальный случай... 40 % таких :?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 05.09.2006 (Вт) 22:10

н-да?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение Хакер » 05.09.2006 (Вт) 22:13

ын-да
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 05.09.2006 (Вт) 22:17

Ну если использование
Код: Выделить всё
Private Sub Form_Resize()
    On Error Resume Next
    fProportion = Me.ScaleWidth / Me.ScaleHeight
End Sub
считать оправданным (а вдруг форму свернут и будет ошибка), то и то наверное 40% не наберется :).
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 06.09.2006 (Ср) 5:25

Да, действительно, единственный случай, где мне пришлось поставить On Error Resume Next - это обработка сворачивания формы при ресайзе.
А я все практикую лечение травами...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 06.09.2006 (Ср) 8:25

Twister писал(а):Да, действительно, единственный случай, где мне пришлось поставить On Error Resume Next - это обработка сворачивания формы при ресайзе.

Защита, построенная на исключениях.
Инициализация переменных/массивов/коллекций, построенная на исключениях.
Ветвление и переход через один или несколько уровней стека процедур, построенных на исключениях.
Поиск в встроенных коллекциях.

Еще?
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение Хакер » 06.09.2006 (Ср) 9:26

:)
Всё зависет от стиля кодинга.

И скажите мне что лучше?

Код: Выделить всё
On Error resume next
CreateLockedGPCBlock()
If err.number <> 0 Then ....
SomeOperation1()
If err.number <> 0 Then ....
SomeOperation2()
If err.number <> 0 Then ....


или

Код: Выделить всё
On Error Goto ErrHandler1
CreateLockedGPCBlock()
On Error Goto 0
On Error Goto ErrHandler2
SomeOperation1()
On Error Goto 0
On Error Goto ErrHandler3
SomeOperation2()

exit sub
ErrHandler1:
...
ErrHandler2:
...
ErrHandler3:
...


?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 06.09.2006 (Ср) 9:51

alibek писал(а):
Twister писал(а):Да, действительно, единственный случай, где мне пришлось поставить On Error Resume Next - это обработка сворачивания формы при ресайзе.

Защита, построенная на исключениях.
Инициализация переменных/массивов/коллекций, построенная на исключениях.
Ветвление и переход через один или несколько уровней стека процедур, построенных на исключениях.
Поиск в встроенных коллекциях.

Еще?
Надо было сразу добавить - единственный мой случай в VB.
А я все практикую лечение травами...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 06.09.2006 (Ср) 10:30

А alibek говорил про VB...
А вот on error resume next в обработке сворачивания при resize - это очень дурной тон, как мне кажется...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 06.09.2006 (Ср) 10:36

GSerg писал(а):А вот on error resume next в обработке сворачивания при resize - это очень дурной тон, как мне кажется...
Это как с ноги ниже пояса - некрасиво, зато просто и наверняка :D
Лучший способ понять что-то самому — объяснить это другому.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 06.09.2006 (Ср) 11:26

Twister писал(а):Надо было сразу добавить - единственный мой случай в VB.

А в VBS это вообще единственный способ обрабатывать ошибки, синтаксис On Error GoTo Label там недопустим.
Lasciate ogni speranza, voi ch'entrate.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 06.09.2006 (Ср) 12:05

А в VBS это вообще единственный способ обрабатывать ошибки, синтаксис On Error GoTo Label там недопустим.
На нем не пишу.
А вот on error resume next в обработке сворачивания при resize - это очень дурной тон, как мне кажется...
Соглашусь с Antonariy - это просто и эффективно. Чего ж тут дурного. Впрочем, у каждого свой стиль кодинга...
А я все практикую лечение травами...

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 06.09.2006 (Ср) 12:12

Twister писал(а):Чего ж тут дурного. Впрочем, у каждого свой стиль кодинга...
Дурного тут то, что если, к примеру, написать первой сторчкой в Form_Resize
Код: Выделить всё
If Me.WindowState = vbMinimized Then Exit Sub
то из процедуры выйдем сразу, а не будем тыкаться как слепые котята в каждую ошибку. Да и инструкции,где нет ошибки, врядли надо выполнять :)
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 06.09.2006 (Ср) 12:20

error resume next получается короче... :wink:
А я все практикую лечение травами...

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 06.09.2006 (Ср) 12:42

Я уже писал, в какой ступор я встал когда-то из за resume Next :) Нафик-нафик. Только, если действительно необходимо ;) А так
Twister писал(а):Впрочем, у каждого свой стиль кодинга...
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 06.09.2006 (Ср) 12:49

Я обычно пишу на делфях. Могу сказать одно - обработчики try-except-end приходится ставить только при работе с базами данных, да и то в редких случаях. Обычно можно обойтись простой проверкой нужных данных.
А я все практикую лечение травами...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.09.2006 (Ср) 12:58

Я на работе пишу на делфях, и внутрифирменное соглашение -- не использовать try-except-end без крайней необходимости. Согласен я с этим или нет, но приходится обходиться без них.
Изображение


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 62

    TopList