06 Dialoge als Komponente
05 Dialog mit lokalem Ereigniss
In den vererbten Dialogen ist es möglich Buttons einzubauen, welche lokal im Dialog eine Aktion ausführen.
Im Beispiel wir eine MessageBox aufgerufen.
Im Hauptprogramm ändert sich nichts daran, dem ist egal, ob lokal noch etwas gemacht wird.
procedure TMyApp.HandleEvent(var Event: TEvent);
var
AboutDialog: PMyAbout;
begin
inherited HandleEvent(Event);
if Event.What = evCommand then begin
case Event.Command of // About Dialog
cmAbout: begin
AboutDialog := New(PMyAbout, Init);
if ValidView(AboutDialog) <> nil then begin // Prüfen ob genügend Speicher.
Desktop^.ExecView(AboutDialog); // Dialog About ausführen.
Dispose(AboutDialog, Done); // Dialog und Speicher frei geben.
end;
end;
else begin
Exit;
end;
end;
end;
ClearEvent(Event);
end;
Unit mit dem neuen Dialog.
Dort sieht man gut, das es ein Button für lokale Ereignisse hat.
Wichtig ist, bei den Nummernvergabe, das sich dies nicht mit einem anderen Eventnummer überschneidet.
Vor allem dann, wen der Dialog nicht Modal geöffnet wird.
Ausser es ist gewünscht, wen man zB. über das Menü auf den Dialog zugreifen will.
unit MyDialog;
Für den Dialog kommt noch ein HandleEvent hinzu.
const
cmMsg = 1003; //
type
PMyAbout = ^TMyAbout;
TMyAbout = object(TDialog)
constructor Init;
procedure HandleEvent(var Event: TEvent); virtual;
end;
Im Konstruktor wird der Dialog noch um den Button Msg-box ergänzt, welcher das lokale Ereigniss cmMsg abarbeitet.
constructor TMyAbout.Init;
var
Rect: TRect;
begin
Rect.Assign(0, 0, 42, 11);
Rect.Move(23, 3);
inherited Init(Rect, 'About');
// StaticText
Rect.Assign(5, 2, 41, 8);
Insert(new(PStaticText, Init(Rect,
'Free Vison Tutorial 1.0' + #13 +
'2017' + #13 +
'Gechrieben von M. Burkhard'+ #13#32#13 +
'FPC: '+ {$I %FPCVERSION%} + ' OS:'+ {$I %FPCTARGETOS%} + ' CPU:' + {$I %FPCTARGETCPU%})));
// MessageBox-Button, mit lokalem Ereigniss.
Rect.Assign(19, 8, 32, 10);
Insert(new(PButton, Init(Rect, '~M~sg-Box', cmMsg, bfNormal)));
// Ok-Button
Rect.Assign(7, 8, 17, 10);
Insert(new(PButton, Init(Rect, '~O~K', cmOK, bfDefault)));
end;
Im neuen EventHandle, werden loake Ereigniss (cmMsg) abarbeitet.
Andere Ereignisse, zB. cmOk wird an das Hauptprogramm weiter gereicht, welches dann den Dialog auch schliesst.
procedure TMyAbout.HandleEvent(var Event: TEvent);
begin
inherited HandleEvent(Event);
case Event.What of
evCommand: begin
case Event.Command of
// Lokales Ereigniss ausführen.
cmMsg: begin
MessageBox('Ich bin eine MessageBox !', nil, mfOKButton);
ClearEvent(Event); // Event beenden.
end;
end;
end;
end;
end;