Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#5

Re: Eigener Messagehandler

  Alt 31. Jan 2009, 20:09
Zitat von sx2008:
Zitat von EWeiss:
Was macht das für einen sinn.
War aber auch nicht die Frage
Nun die Sinnfrage könnte ich auch stellen. Was macht es für einen Sinn, für eine nonVCL Listbox
Events bereitzustellen, wenn es nicht einmal ein Formular gibt, dass die Eventhandler implementiert?
Zitat von EWeiss:
Also wie kann ich ohne WinProc oder Subclassing einen DefaultHandler für
eine nonvcl ListBox erstellen.
Duschen, ohne sich nass zu machen geht nicht.
Du musst entweder WinProc für jede einzelne Listbox auf eine eigene Funktion umbiegen.
oder
du hast eine allgemeine WinProc für alle Listboxen.
Mit SetWindowLong(lbhandle,GWL_USERDATA, (ListBoxObject)) kann man einen Zeiger auf ein Objekt in der Listbox speichern.
In der allgemeinen WinProc für alle Listboxen liest man mit GetWindowLong die Userdaten aus und castet den Wert in einen Zeiger auf die Listbox-Hilfsklasse:
Delphi-Quellcode:
function WindowProcListbox(hwnd:Handle; uMsg:TMsg; wParam, lParam:Cardinal):integer;
var
  lb : TnonVCLListbox;
begin
  lb := TnonVCLListbox(GetWindowLong(hwnd, GWL_USERDATA));
  if Assigned(lb) then
  begin
    lb.Handle := hwnd;
    Result := lb.WinProc(uMsg, wParam, lParam);
  end
  else
  begin
    // default-Bahandlung, falls kein Objekt in den Userdaten ist
  end;
end
;
Da nun alle Messages auf ein Objekt umgeleitet worden sind, kann man theoretisch von diesem Objekt auch Events auslösen.
Aber es macht wenig Sinn, denn es ist einfacher gleich eine Klasse von TnonVCLListbox abzuleiten, die dann die speziellen Aufgaben für eine ganz bestimmte Listbox übernimmt.
Mein anliegen war wie in einer Standard Form einen defaultHandler zu generieren auf dem die ListBox reagiert.
Ich habe meine ListBox gesubclassed das ist nicht mein problem.

Irgendwie drücke ich mich nicht richtig aus oder werde nicht verstanden.

gruss Emil
  Mit Zitat antworten Zitat