Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Eigener Messagehandler (https://www.delphipraxis.net/128526-eigener-messagehandler.html)

EWeiss 31. Jan 2009 16:09


Eigener Messagehandler
 
Verwende in meiner Listbox ein Subclassing
Irgendwie ist das aber nicht das wahre.

Daher meine Frage wie kann ich einen eigenen MessageHandler erstellen in der TListBox
und zusätzlich eigene OnEvents denke ihr wisst was ich meine.

Was ich machen möchte ist ein
OnPaint
MeasureItem
OnEraseBkgnd

und ein paar andere.
Im moment komme ich mit meiner subclass in conflikt mit meiner WinProc von der Mainform.

gruss Emil

sx2008 31. Jan 2009 16:58

Re: Eigener Messagehandler
 
Was soll deine Listbox können, was die Standard Listbox aus der VCL nicht kann?
Hast du schon auf Torry's nachgeschaut, ob es nicht eine Listbox-Komponente mit Sourcecode gibt, die die gewünschte Funktionalität hat?

EWeiss 31. Jan 2009 17:18

Re: Eigener Messagehandler
 
Zitat:

Zitat von sx2008
Was soll deine Listbox können, was die Standard Listbox aus der VCL nicht kann?
Hast du schon auf Torry's nachgeschaut, ob es nicht eine Listbox-Komponente mit Sourcecode gibt, die die gewünschte Funktionalität hat?

Was macht das für einen sinn.
War aber auch nicht die Frage ;)

Ich erstelle eine eigene ListBox Transparent mit Vista Aero Funktionalität. (nonvcl)
Copy/Paste will ich nicht.

EDIT:
Also wie kann ich ohne WinProc oder Subclassing einen DefaultHandler für
eine nonvcl ListBox erstellen.

gruss Emil

sx2008 31. Jan 2009 19:02

Re: Eigener Messagehandler
 
Zitat:

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:

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.

EWeiss 31. Jan 2009 19:09

Re: Eigener Messagehandler
 
Zitat:

Zitat von sx2008
Zitat:

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:

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

Sunlight7 31. Jan 2009 19:50

Re: Eigener Messagehandler
 
Du willst das Deine Listbox Klasse selbsttätig auf Events
WM_Paint
WM_MeasureItem
WM_DrawItem
WM_EraseBkgnd
etc. reagiert, ohne den Message Handler des Elternfensters zu benutzen?

EWeiss 31. Jan 2009 20:03

Re: Eigener Messagehandler
 
Zitat:

Zitat von Sunlight7
Du willst das Deine Listbox Klasse selbsttätig auf Events
WM_Paint
WM_MeasureItem
WM_DrawItem
WM_EraseBkgnd
etc. reagiert, ohne den Message Handler des Elternfensters zu benutzen?

Wie soll das funktionieren ?
Man versteht mich nicht.. hat sich erledigt. Danke

gruss Emil


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz