03 Dialoge
35 Werte im Dialog merken
Bis jetzt gingen die Werte im Dialog immer wieder verloren, wen man diesen schliesste und wieder öffnete.
Aus diesem Grund werden jetzt die Werte in einen Record gespeichert.
In diesem Record werden die Werte des Dialoges gespeichert.
Die Reihenfolge der Daten im Record muss genau gleich sein, wie bei der Erstellung der Komponenten, ansonten gibt es einen Kräsch.
Bei Turbo-Pascal musste ein Word anstelle von LongWord genommen werden, dies ist wichtig beim Portieren alter Anwendungen.
type
TParameterData = record
Druck,
Schrift: longword;
Hinweis: string[50];
end;
Hier wird noch der Constructor vererbt, diesen Nachkomme wird gebraucht um die Dialogdaten mit Standard Werte zu laden.
type
TMyApp = object(TApplication)
ParameterData: TParameterData; // Daten für Parameter-Dialog
constructor Init; // Neuer Constructor
procedure InitStatusLine; virtual; // Statuszeile
procedure InitMenuBar; virtual; // Menü
procedure HandleEvent(var Event: TEvent); virtual; // Eventhandler
procedure MyParameter; // neue Funktion für einen Dialog.
end;
Der Constructoer welcher die Werte für den Dialog ladet.
Die Datenstruktur für die RadioButtons ist einfach. 0 ist der erste Button, 1 der Zweite, 2 der Dritte, usw.
Bei den Checkboxen macht man es am besten Binär. Im Beispiel werden der erste und dritte CheckBox gesetzt.
constructor TMyApp.Init;
begin
inherited Init; // Vorfahre aufrufen
with ParameterData do begin
Druck := %0101;
Schrift := 2;
Hinweis := 'Hello world';
end;
end;
Der Dialog wird jetzt mit Werten geladen.
Dies macht man, sobald man fertig ist mit Komponenten ertstellen.
procedure TMyApp.MyParameter;
var
Dia: PDialog;
Rect: TRect;
dummy: word;
Ptr: PView;
begin
Rect.Assign(0, 0, 35, 15);
Rect.Move(23, 3);
Dia := New(PDialog, Init(Rect, 'Parameter'));
with Dia^ do begin
// CheckBoxen
Rect.Assign(2, 3, 18, 7);
Ptr := New(PCheckBoxes, Init(Rect,
NewSItem('~D~atei',
NewSItem('~Z~eile',
NewSItem('D~a~tum',
NewSItem('~Z~eit',
nil))))));
Insert(Ptr);
// Label für CheckGroup.
Rect.Assign(2, 2, 10, 3);
Insert(New(PLabel, Init(Rect, 'Dr~u~cken', Ptr)));
// RadioButton
Rect.Assign(21, 3, 33, 6);
Ptr := New(PRadioButtons, Init(Rect,
NewSItem('~G~ross',
NewSItem('~M~ittel',
NewSItem('~K~lein',
nil)))));
Insert(Ptr);
// Label für RadioGroup.
Rect.Assign(20, 2, 31, 3);
Insert(New(PLabel, Init(Rect, '~S~chrift', Ptr)));
// Edit Zeile
Rect.Assign(3, 10, 32, 11);
Ptr := New(PInputLine, Init(Rect, 50));
Insert(Ptr);
// Label für Edit Zeile
Rect.Assign(2, 9, 10, 10);
Insert(New(PLabel, Init(Rect, '~H~inweis', Ptr)));
// Ok-Button
Rect.Assign(7, 12, 17, 14);
Insert(new(PButton, Init(Rect, '~O~K', cmOK, bfDefault)));
// Schliessen-Button
Rect.Assign(19, 12, 32, 14);
Insert(new(PButton, Init(Rect, '~A~bbruch', cmCancel, bfNormal)));
end;
Dia^.SetData(ParameterData); // Dialog mit den Werten laden.
dummy := Desktop^.ExecView(Dia); // Dialog ausführen.
if dummy = cmOK then begin // Wen Dialog mit Ok beenden, dann Daten vom Dialog in Record laden.
Dia^.GetData(ParameterData);
end;
Dispose(Dia, Done); // Dialog und Speicher frei geben.
end;