Hallo zusammen,
vorn weg: ich arbeite mit
Delphi 5 (arbeitgeberseitig vorgeschrieben) und bearbeite das Programm eines Kollegen (nicht mehr in der Firma)
Ich habe Verständnisprobleme wie er seine dynamisch erzeugten Seiten aufruft und schließt/terminiert?
Mein Ziel wäre es, die Seiten auch mit dem "Kreuzchen" schließen zu können ... wie ein Abbrechen-Button. Aber wie ist das genau richtig?
Folgendes:
Delphi-Quellcode:
procedure TfrmSplash.btnOKClick(Sender: TObject);
...
frmSpeicherverzeichnis:=nil; //warum macht er das?
if Speicherverzeichnis='' then
begin
Application.CreateForm(TfrmSpeicherverzeichnis, frmSpeicherverzeichnis);
frmSpeicherverzeichnis.Show;
self.Enabled:=False;
end;
while assigned(frmSpeicherverzeichnis) do
begin
Application.ProcessMessages;
end;
if (IRPort=0) or (ArduinoPort=0) then
begin
Application.MessageBox('Die Schnittstellen konnten nicht ermitteln. '+
'Schalten Sie den Controller aus um im nächsten Schritt die korrekte '+
'Erkennung zu gewährleisten.', 'Achtung', mb_OK + mb_ICONWARNING);
Application.CreateForm(TfrmPortErkennung, frmPortErkennung);
frmPortErkennung.Show;
self.Release;
exit;
end
else
begin
...
Application.CreateForm(TfrmStartseite1B, frmStartseite1B);
frmStartseite1B.Show;
self.Hide;
end;
end;
end;
______
procedure TfrmSpeicherverzeichnis.btnAbbrechenClick(Sender: TObject);
begin
self.Release;
end;
procedure TfrmSpeicherverzeichnis.FormDestroy(Sender: TObject);
begin
frmSpeicherverzeichnis:=nil;
end;
Warum das "Nil" der SpeicherverzeichnisOberfläche, wenn er es erst danach erzeugt? Warum kein "if not Assigned" wie unten beschrieben? Oder ist das nur Programmiererspezifisch?
Warum das "self.hide" seiner Startoberfläche? Da sind keine Elemente/ Objekte, die er nochmal benutzt.
bzw.
Delphi-Quellcode:
procedure TfrmStartseite1B.btnOptionenClick(Sender: TObject);
begin
if not Messung.MessungLaeuft then
begin
Application.CreateForm(TfrmOptionen, frmOptionen);
frmOptionen.show;
self.Enabled:=False;
end
else
begin
Application.MessageBox('Das Fenster kann nur aufgerufen werden, wenn ' +
'aktuell keine Messung läuft.', 'Achtung', mb_OK + mb_ICONWARNING);
end;
end;
___________
procedure TfrmOptionen.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
CanClose:=False;
frmStartseite1B.Enabled:=True;
self.Release;
if assigned(frmStartseite1B) then
begin
frmStartseite1B.Enabled:=True;
end;
if assigned(frmStartseite2B) then
begin
frmStartseite2B.Enabled:=True;
end;
end;
procedure TfrmOptionen.btnOKClick(Sender: TObject);
begin
close;
end;
Ich habe im Forum so viel rausbekommen, dass
• Form.close = Form.Visible := false
• Form.release = setzt eine Application. Message ab/ gibt aber nix frei
• Form.Free ist was anderes als Form.freeAndNil
Meine Fragen:
• Ist es wirklich sinnvol, die aufrufende Form immer Enabled:=false zu setzen?
• Auf manchen Seiten steht bei CloseQuery nur CanClose:=false und beim Abbrechen-Button aber nur close; !? da kann ich doch das CloseQuery weglassen oder?
• Mir wiederstrebt es irgendwie die Form nicht in sich selbst zu beenden (Form.CloseQuery)... ist das nicht sauberer
reicht es nicht (so hab ich es bisher gemacht ... bin kein Programmierer):
Delphi-Quellcode:
procedure TfrmStartseite.MomentanwerteButtonClick(Sender: TObject);
begin
if not Assigned(frmMomentanwerte) then begin
Application.CreateForm(TfrmMomentanwerte,frmMomentanwerte);
end;
frmMomentanwerte.show;
frmMomentanwerte.Button2Click(Self); //aktualisiert die Daten
end;
______
procedure TfrmMomentanwerte.Button1Click(Sender: TObject);
begin
close; //Button "zur Startseite"
end;
procedure TfrmMomentanwerte.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
frmMomentanwerte.Release;
frmMomentanwerte := nil;
end;
______
procedure TfrmStartseite.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
...
if Assigned(frmMomentanwerte) then frmMomentanwerte.Release;
if Assigned(frmKundeneinstellungen) then frmKundeneinstellungen.Release;
...
//für alle dynamischen Forms
//falls noch was offen ist, wenn das Programm beendet wird
...
//andere Variablen wieder freigeben
//Messung ist bereits beendet
CanClose := true;
end;
...
So würde ich jetzt seine Forms anpassen. Da ich mir aber nicht sicher bin, ob das so korrekt ist (mal abgesehen von dem Programmierauffwand) möchte ich hier lieber nochmal nachfragen, wie man das eigentlich richtig macht.
Schon mal Danke im Vorraus
die Suchende