Eventhandlers

Tags:    delphi
Skrevet af Bruger #132 @ 17.06.2001
Custom event handlers i Delphi

De fleste ved, at man kan sende en message til en form med
PostMessage(form1.handle, MyMessage, Wparam, Lparam);
Dette går godt, fordi Delphi internt har været så flink at give os et handle (form1.handle) og en eventhandler, der kan tage sig af at behandle de messages vi sender til formen. Men hvad gør man hvis man har brug for at sende en message til en klasse, som ikke har noget handle, hvis programmet f.eks. ikke har nogen forms? Ja, så er der ikke andet for end at gøre det selv. Der er to ting vi skal have gjort. Vi skal have skaffet os et handle vi kan sende vores messages til, og vi skal have lavet en event-handler, der kan behandle de messages vi får.

1.Et handle.

Et handle er noget der knytter sig til et vindue. Det er en slags ID for det enkelte vindue. Men hvad hvis vi ikke har et vindue, eller slet ikke er interesserede i at have et? Det eneste man kan gøre er, at lave et usynligt vindue. For at gøre dette, kunne vi tage fat i Windows API'et og kæmpe med det selv. Men heldigvis er dette indkapslet i et par funktioner i Delphi, nemlig AllocateHwnd og DeAllocateHwnd. Vi skal altså i vores constructor kalde:
MyHandle := AllocateHwnd(MyEventHandler);
og i vores destructor kalde :
DeAllocateHwnd(MyHandle);
Ganske simpelt ikke? Den kvikke læser vil have bemærket, at der er givet en parameter til AllocateHwnd, nemlig en eventhandler, eller rettere: en pointer til en eventhandler. Dette leder os frem til...

2.En eventhandler.

En eventhandler er en procedure der modtager ALLE beskeder, og behandler dem. Altså ikke noget med at lave en
procedure cmMyMsg(var Msg: Tmessage); message MyMessage;

Det havde jo også næste været for nemt. I stedet skal vi i vores objekt erklære vores event-handler:
procedure MyEventHandler(var Message: Tmessage);

Implementationen af denne ser således ud:
procedure TmyObject.MyEventHandler(var Message: Tmessage);
begin
  case Message.msg of
    MyMessage:
    begin
      //Håndter MyMessage
    end;
    MyOtherMessage:
    begin
      //Håndter MyOtherMessage
    end;
    else
      DefWindowProc(MyHandle, Message.msg, Message.WParam, Message.LParam);
end;

Lad os gennemgå hvad der sker her. MyEventHandler bliver kaldt, når der bliver sendt en message til vores handle. Det vi gør er, at vi ser efter, om det er en message vi vil reagere på. Ellers sendes beskeden videre til windows' standard message handler, DefWindowProc. Og hvad kan man så bruge det til? Tjah, Idéen til artiklen fik jeg, da niLLer spurgte om man kunne lave et message-loop, uden at skulle bruge VCL kontroller. Jeg har skrevet det i en artikel, så folk kan læse det om nogen tid, når spørgsmålet er gledet ned i de støvede arkiv-filer. Det kan også bruges, hvis man har brug for at sende en message til en DLL-fil, og DLL-filen ikke indeholder forms eller andre visuelle ting.


Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (0)

Du skal være logget ind for at skrive en kommentar.
t