06 Dialoge als Komponente
00 Ein einfaches About
Wen man immer wieder die gleichen Dialog braucht, packt man diesen am besten als Komponente in eine Unit.
Dazu schreibt man einen Nachkommen von TDialog.
Als Beispiel wird hier ein About-Dialog gebaut.
Hier wird der About-Dialog geladen und anschliessend bei Close wieder frei gegeben.
procedure TMyApp.HandleEvent(var Event: TEvent);
var
AboutDialog: PMyAbout;
begin
inherited HandleEvent(Event);
if Event.What = evCommand then begin
case Event.Command of
cmAbout: begin
AboutDialog := New(PMyAbout, Init); // Neurer Dialog erzeugen.
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.
unit MyDialog;
Für den Dialog muss ein neuer Konstruktor erzeugt werden.
Noch ein Hinweis zu StaticText, wen man eine Leerzeile einfügen will, muss man #13#32#13 schreiben, bei #13#13, wird nur ein einfacher Zeilenumbruch ausgefühert.
interface
uses
App, Objects, Drivers, Views, Dialogs;
type
PMyAbout = ^TMyAbout;
TMyAbout = object(TDialog)
constructor Init; // Neuer Konstruktor, welche den Dialog mit den Komponenten baut.
end;
Im Konstruktor werden die Dialog-Komponeten erzeugt.
implementation
constructor TMyAbout.Init;
var
Rect: TRect;
begin
Rect.Assign(0, 0, 42, 11);
Rect.Move(23, 3);
inherited Init(Rect, 'About'); // Dialog in verdefinierter Grösse erzeugen.
// 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%})));
// Ok-Button
Rect.Assign(27, 8, 37, 10);
Insert(new(PButton, Init(Rect, '~O~K', cmOK, bfDefault)));
end;