07 EventHandle auserhalb Komponenten
00 Maus-Event
Man kann einen EventHandle im Dialog/Fenster abfangen, wen man die Maus bewegt/klickt.
Im Hauptprogramm hat es dafür nichts besonders, dies alles läuft lokal im Dialog/Fenster ab.
Im Hauptprogramm wird nur der Dialog gebaut, aufgerufe und geschlossen.
procedure TMyApp.HandleEvent(var Event: TEvent);
var
MouseDialog: PMyMouse;
begin
inherited HandleEvent(Event);
if Event.What = evCommand then begin
case Event.Command of
cmMouseAktion: begin
MouseDialog := New(PMyMouse, Init);
if ValidView(MouseDialog) <> nil then begin // Prüfen ob genügend Speicher.
Desktop^.ExecView(MouseDialog); // Dialog Mausaktion ausführen.
Dispose(MouseDialog, Done); // Dialog und Speicher frei geben.
end;
end;
else begin
Exit;
end;
end;
end;
ClearEvent(Event);
end;
Unit mit dem Mausaktions-Dialog.
unit MyDialog;
In dem Object sind die PEditLine globel deklariert, da diese später bei Mausaktionen modifiziert werden.
type
PMyMouse = ^TMyMouse;
TMyMouse = object(TDialog)
EditMB,
EditX, EditY: PInputLine;
constructor Init;
procedure HandleEvent(var Event: TEvent); virtual;
end;
Es wird ein Dialog mit EditLine, Label und Button gebaut.
Einzig besonderes dort, die Editlline wird der Status auf ReadOnly gesetzt eigene Eingaben sind dort unerwünscht.
constructor TMyMouse.Init;
var
Rect: TRect;
begin
Rect.Assign(0, 0, 42, 13);
Rect.Move(23, 3);
inherited Init(Rect, 'Mausaktion');
// PosX
Rect.Assign(25, 2, 30, 3);
EditX := new(PInputLine, Init(Rect, 5));
Insert(EditX);
EditX^.State := sfDisabled or EditX^.State; // ReadOnly
Rect.Assign(5, 2, 20, 3);
Insert(New(PLabel, Init(Rect, 'MausPosition ~X~:', EditX)));
// PosY
Rect.Assign(25, 4, 30, 5);
EditY := new(PInputLine, Init(Rect, 5));
EditY^.State := sfDisabled or EditY^.State; // ReadOnly
Insert(EditY);
Rect.Assign(5, 4, 20, 5);
Insert(New(PLabel, Init(Rect, 'MausPosition ~Y~:', EditY)));
// Maus-Tasten
Rect.Assign(25, 7, 32, 8);
EditMB := new(PInputLine, Init(Rect, 7));
EditMB^.State := sfDisabled or EditMB^.State; // ReadOnly
EditMB^.Data^:= 'oben'; // Anfangs ist die Taste oben.
Insert(EditMB);
Rect.Assign(5, 7, 20, 8);
Insert(New(PLabel, Init(Rect, '~M~austaste:', EditMB)));
// Ok-Button
Rect.Assign(27, 10, 37, 12);
Insert(new(PButton, Init(Rect, '~O~K', cmOK, bfDefault)));
end;
Im EventHandle sieht man gut, das dort die Mausaktionen abgefangen werden.
Die Maus-Daten werden an die EditLines ausgegeben.
procedure TMyMouse.HandleEvent(var Event: TEvent);
var
Mouse : TPoint;
begin
inherited HandleEvent(Event);
case Event.What of
evMouseDown: begin // Taste wurde gedrückt.
EditMB^.Data^:= 'unten';
EditMB^.Draw;
end;
evMouseUp: begin // Taste wurde losgelassen.
EditMB^.Data^:= 'oben';
EditMB^.Draw;
end;
evMouseMove: begin // Maus wurde bewegt.
MakeLocal (Event.Where, Mouse); // Mausposition ermitteln.
EditX^.Data^:= IntToStr(Mouse.X);
EditX^.Draw;
EditY^.Data^:= IntToStr(Mouse.Y);
EditY^.Draw;
end;
end;
end;