Announcement

Collapse
No announcement yet.

WndProc, WindowProc

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • WndProc, WindowProc

    Hi,
    kann mir vielleicht jemand bei so einem Problem helfen: ich muss Botschaften empfangen, die an ein bestimmtes MDI-Fenster gesendet werden (an alle Controls, die zu dem Fenster gehören). Wenn ich versuche, mit folgendem Code WindowProc für alle Controls zu ersetzen, dann bekomme ich „Stack-Überlauf“

    <PRE>TISMessage=record
    msg: TMessage;
    Pt: TPoint;
    end;

    var Wmessage: TISMessage;

    procedure TfrmMDIChild.ISWndProc(var message: TMessage);
    begin
    with message do
    begin
    if (msg=WM_LBUTTONDOWN)
    or (msg=WM_LBUTTONUP)
    or (msg=WM_LBUTTONDBLCLK)
    or (msg=WM_RBUTTONDOWN)
    or (msg=WM_RBUTTONUP)
    or (msg=WM_RBUTTONDBLCLK)
    then
    begin
    WMessage.msg:=Message;

    bNewMessage:=true;
    end;
    end;
    Inherited WndProc(Message);
    end;

    procedure TfrmMDIChild.FormCreate(Sender: TObject);
    var i: integer;
    begin
    for i:=0 to ControlCount-1 do
    begin
    Controls[i].WindowProc:=ISWndProc;
    end;
    ……….
    end;</PRE>

    Was mache ich falsch und wie kann man das richtig realisieren?

    Vielen Dank im voraus,
    Inna

  • #2
    Das ist falsch. .WindowProc ist eine Methodenvariable und speichert die Addresse der für jedes Control eindeutigen Fenstermethode. Da jede Control-Klasse andere Aufgaben und ein anderes GUI hat unterscheiden sich auch die Fenstermethoden. D.h. Contro.WindowProc sollte sich zumindest für jeden Control Klasse unterscheiden.<br>
    So d.h. ein einheitlicher Handler kann nur mit einheitlicher Klasse arbeiten.<br>
    Wichtig beim Subclassing ist aber das der "Hook" auch immer die vorherige in Control.WindowProc abgelegte Fensterprocedure aufgerufen wird.<br>
    Genau dies ist aber dein Fehler da du: 1. nicht Control.WindowProc sicherst und 2. mit inherited WndProc() die Fenstermethode des Formulares und nicht die der gehookten Controls aufrufts.<br>
    Damit leitest du die Messages die für ein Control bestimmt wurden an den Handler des Formulars weiter (how bad is it).<br>

    also:

    <pre>

    type
    TForm1 =
    private
    FOrgWindowProc: TWndMethod;
    protected
    procedure DoEditWndProc(var Msg: TMessage);
    public
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    end;<br>

    procedure TForm1.DoEditWndProc(var Msg: TMessage);
    begin
    FOrgEditWndProc(Msg);
    end;<br>

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    FOrgEditWndProc := Edit1.WindowProc;
    Edit1.WindowProc := DoEditWndProc;
    end;<bR>

    </pre>

    Gruß Hage

    Comment

    Working...
    X