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.