AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Callback WndProc innerhalb einer Klassen-Methode... ist das OK?
Thema durchsuchen
Ansicht
Themen-Optionen

Callback WndProc innerhalb einer Klassen-Methode... ist das OK?

Ein Thema von Satty67 · begonnen am 2. Nov 2011 · letzter Beitrag vom 6. Nov 2011
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#11

AW: Callback WndProc innerhalb einer Klassen-Methode... ist das OK?

  Alt 5. Nov 2011, 23:19
Jupp, dort würde dein Win32 Programm ja in einem "virtuellen" 32 Bit-Windows ausgeführt.


Wenn man irre ist, dann kann man auch die möglichkeiten der Klassen ausnutzen.

Di kennst ja bestimmt das Folgendes
Delphi-Quellcode:
procedure WMGestureNotify(var Message: TWMGestureNotify); message WM_GESTURENOTIFY;
procedure CMActivate(var Message: TCMActivate); message CM_ACTIVATE;
procedure WndProc(var Message: TMessage); override;

Würde dann wohl etwa so aussehn ... natürlich in Assembler, da ja das SELF hardcodiert sein müßte.
Delphi-Quellcode:
//type
// TMessage = packed record
// Msg: Cardinal;
// WParam: WPARAM;
// LParam: LPARAM;
// Result: LRESULT;
// end;

function WndProc(Wnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
  Message: TMessage;
begin
  Message.Msg := Msg;
  Message.WParam := wParam;
  Message.LParam := lParam;
  Message.Result := 0;
  TheDispatcher.Dispatch(Message);
  Result := Message.Result;
end;
statt deinem globalen Array könnte man auch gleich alles in diese Klasse verbauen:
Delphi-Quellcode:
type
  TDispatcher = class
  private
    FHandle: HWND;
    FMessage: TMessage;
    FWndProcInfo: TWndProcInfo;
  public
    constructor Create(Window: HWND);
    destructor Destroy;

    property Handle: HWND read FHandle;
  end;

function WndProc(Wnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  with TheDispatcher do begin
    FHandle := Wnd; // (MethodOwner + 8)^ := Wnd; (sollte +8 sein ... glaub ich)
    FMessage.Msg := Msg; // (MethodOwner + 12)^ := Msg;
    FMessage.WParam := wParam; // (MethodOwner + 16)^ := wParam
    FMessage.LParam := lParam; // (MethodOwner + 20)^ := lParam;
    FMessage.Result := 0; // (MethodOwner + 24)^ := 0;
    Dispatch(Message); // call TObject.Dispatch mit TheDispatcher und MethodOwner als Parameter
    Result := FMessage.Result; // Result := (MethodOwner + 24)^;
  end;
end;
PS: Statt das Self hardzukodieren kannste es uch über SetProp an das Fenster hängen und über GetProp auslesen ... dann könnteste deine deine Proceduren in Pascal schreiben.
Wäre ja nur noch eine Variante nötig wäre, da man keine Werte hardcodiert hätte.

Hat auch den Vorteil, daß man schauen kann kann, ob schon soein Hook an dem Fenster hängt. (PS: so macht es die VCL ... die hängt ihr Self auch einfach überall an)
Es gäbe zwar noch GWL_USERDATA, aber das wäre wohl zu unsicher, da es ja schon belegt sein kann.
SetProp(hWnd, 'Satty67_Dispatcher', THandle(TheDispatcher));
Ach ja, ich hatte FHandle := Wnd immer wieder neu gesetzt .. das könnte man auch nicht machen
- wenn die Klasse nur an einem Fenster hängt, dann ändert sich dieses nicht
- wenn man es veränderbar macht, könnte man mehere Fenster an eine Klasse hängen


[add]
ich seh grade, daß man man bei dem Dispatch ebenfalls nur das SELF zwischen das HWND und MSG schieben müßte, dann bräuchte man das Message nicht kopieren, sondern könnte direkt auf den Stack zeigen und kopiert nach Prozeduraufruf noch nur noh das Result in EAX.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 5. Nov 2011 um 23:26 Uhr)
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#12

AW: Callback WndProc innerhalb einer Klassen-Methode... ist das OK?

  Alt 6. Nov 2011, 07:22
Ist immer wieder erstaunlich, wie man ich ständig auf völlig neue unerforschte Bereiche in Delphi stosse. Hatte mich bisher immer aufs Framework verlassen

Ich splitte das ganze in zwei Aufgaben auf:

1) Die Unit mit dem WindowProc-Hook, die möglichst wenig "am Fenster" ändern darf, falls es ein fremdes Fenster ist. Deshalb hat mir die Lösung aus der VCL etwas Sorgen gemacht. Da fehlen noch ein paar Funktionen, um die alte WndProc aufzurufen... und das x64 Promblem hatte ich ja anfangs garnicht im Hinterkopf.

2) Auf die Idee einer eigenen Fensterklasse bin ich gekommen, weil es für den TAppButton wesentlich besser funktioniert, als ein TForm mit all dem Balast zu nehmen. Das soll ja später eine Komponente werden. Da werfe ich die Lösung mit dem x86 Dispatcher wieder raus und implementiere eine Variante, die nur für die Komponente übersetzt. Da besteht ja zum Glück der Sonderfall, das pro Application nur eine Instanz benötigt wird und ich keinen Verteiler für die WindowProc brauche.

Ich geh' mal Brötchen holen, kann im Moment fast nur am WE programmieren. Brauche Kohlehydrate fürs Gehirn... das ganze ist leider nicht so banal, wie ich erst gedacht hatte

Geändert von Satty67 ( 6. Nov 2011 um 07:26 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:57 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