Einzelnen Beitrag anzeigen

die Suchende

Registriert seit: 27. Mär 2009
16 Beiträge
 
#1

dynamisch erzeugte Forms richtig freigeben

  Alt 1. Jul 2015, 14:47
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
  Mit Zitat antworten Zitat