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

)...
я хочу применить мехаизм отлова событий как в делфях
т.е.
есть несколько основных классов:
TGenericEvents - класс отлова основых событий (через 10 функцию)
в нем есть адреса обработчиков событий
.OnGMouse - проверка мыши
.OnGKeyboard - работа клавы
.OnGWindow - перерисовка окна
.OnGSocket - данные в сокетах
.OnGIPC - IPC (надо ещё раздуплить чё это такое...)
....
вобщем есть цикл в основной процедуре чтото навроде следующего
.MainEventLoop:
.@@EventLoop:
mov eax,10
int 0x40
а теперь как и всегда делалось перебираем , какое же событие было, но механизм я немного усложнил
идёт простой case перебор
Code: Select all
cmp eax,1
jne .@@Next1:
CallEvent .OnGWindow
jmp .@@EventLoop
.@@Next1:
cmp eax,2
jne .@@Next2
CallEvent .OnGKeyboard
jmp .@@EventLoop
.@@Next2:
....
jmp .@@EventLoop
ret
как видно для определённого события вызывается его обработчик, однако нам мало получить лишь состояние мыши или кнопки,
надо узнать какая кнопка нажата, в каком состоянии находится окно или пришли ли данные в сокет нормально или с ошибкой
поэтому следует основные события разбивать на уже более менее конкретные осбытия типа (мышь переместилась, нажата правая кнопка, левая, двойной клик, окно начало перерисовываться или уже закончило... данные пришли или ещё не отправлены и т.п.)
поэтому в обработчике мыши имеем следующее
.OnGMouse:
проверяем изменились ли текущие координаты, если да вызываем событие .OnMouseMove
проверям какая нажата клавиша и вызываем соответсвтенно .OnMouseClick или .OnMouseRightClick (хотя можно просто отслеживать сами кнопки в одном событии OnClick) .OnMouseDoubleClick...
ret
в сокете
типа
.OnPortGet
.OnPortFree
.OnSend
.OnReceive
.OnError....
к чему все это веду, что далее при создании и регистрации компонент (гуи) эти события будут посылаться компонентам, и они уже будут раздуплять что к чему + эти обработчики будут отлавливаться с пользовательских процедурах (кто работает в делфях, поймёт что это ооочень удобно)....
а далее (думаю это будет реализовано с помощью динамических списков или массивов)
что то типа такого
onMouseMove_UserProc:
for i:=1 to Controls.Count do ; просмотр всех компонент на фокус
begin
Controls
.CheckFocus;
if Controls.inFocus then ; если компонент в фокусе
begin
Controls.GetFocus; ;он его захватывает
Controls.Action; ;основное действие (в зависимости уже от самого контрола - ввод текста, подсветка и т.п.)
break; выход
end;
end;
при этом фокус будет нарушен при нажатии кнопки мыши за областью контрола, т.е. фокус получает уже другой контрол....
вот такие идейки...
на счёт переопределения обработчика, делается все просто
SetEvent TSocket.OnDataReceive,myProcReceive
SetEvent TSocket.OnError,fuck_error_proc
а дальше в другом файле для удобства
myProcReceive:
обработка полученныз данных
ret
....
ну плюс ещё надо доделать систему сообщений на подобия Windows Messages и исключений (класс TException)...
жду здоровой критики и советов!