07 EventHandle auserhalb Komponenten

00 Maus-Event

Selfhtml

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;



zurück