AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

(Formular-)Handling größerer Projekte

Ein Thema von mm1256 · begonnen am 11. Mär 2015 · letzter Beitrag vom 13. Mär 2015
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.531 Beiträge
 
Delphi 12 Athens
 
#1

AW: (Formular-)Handling größerer Projekte

  Alt 12. Mär 2015, 09:53
Ein modales Formular kann, muss aber nicht mit Release freigegeben werden, da sich die Behandlungsroutine nicht im modalen Formular befindet.
Dennoch Release oder besser Close statt einem Free, denn auch dieser Code greift weiterhin auf die Form zu.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: (Formular-)Handling größerer Projekte

  Alt 12. Mär 2015, 10:20
Eigentlich kann man sagen, dass bei größeren Projekten die globalen Form-Variablen quasi als non existent zu betrachten sind. Die gibt es einfach nicht mehr.

Sobald von einer Form mehrere Instanzen benötigt werden, hat man eh ein Problem, denn die globale kann ja nur eine Referenz speichern. Also merkt sich der Erzeuger der Form diese Referenz und gibt diese je nach Bedarf wieder frei.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
642 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

AW: (Formular-)Handling größerer Projekte

  Alt 12. Mär 2015, 10:26
Sobald von einer Form mehrere Instanzen benötigt werden, hat man eh ein Problem, denn die globale kann ja nur eine Referenz speichern.....
Das Problem mit mehreren Instanzen "des selben Formulars" habe ich ja Gott sei Dank nicht. Die MDI's erben von einem gemeinsamen Vorfahren alle grundlegenden Eigenschaften und die anderen "normalen" Formulare sind eindeutig, d.h. es wird immer nur eine einzige Instanz benötigt.

Der Bahnhof ist für mich jedoch noch nicht kleiner geworden. Wenn ich - respektive der User - einen Button zum Schließen hat, dann ist die Sache schon klar. Aber, ich hab doch ausgenommen von modalen Fenstern i.d.R. keinen Close-Button. Darum die Frage, wenn ich denn schon Release verwenden soll, wo? Und wo setzt man die Form-Variable auf nil? Muss ja gemacht werden, sonst müsste ich ja die bisherige Boolean-Variable weiter verwenden.

So langsam kommt mir der Verdacht, dass die aus der Not geborene Variante (ich wusste bzw. weiß es ja nicht besser, und sogar die Experten sind sich nicht offensichtlich ganz so einig wie man es besser oder idealerweise macht) mit der Hilfsvariablen gar nicht so schlecht ist.

Darum nochmals die Frage: Ist das jetzt der Königsweg? Oder was funktioniert in dieser Variante nicht so wie gewollt? Speicherleck scheint es ja keines zu geben, denn mit FastMM und aktiviertem "ReportMemoryLeaksOnShutdown := True" kommt jedenfalls keine Meldung.

Delphi-Quellcode:
{-Interface-procedure zum Anzeigen der Form-}
procedure FrmClient1_Show;
begin
  if not Assigned(FrmClient1)
  then FrmClient1 := TFrmClient1.Create(Application);
  FrmClient1.Show;
end;

procedure TFrmClient1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  FrmClient1 := nil;
end;

procedure TFrmClient1.FormCreate(Sender: TObject);
begin // EDIT: Sorry, das braucht man ja nicht mehr
  FrmClient1Active := true;
end;
Gruss Otto PS: Sorry wenn ich manchmal banale Fragen stelle. Ich bin Hobby-Programmierer und nicht zu faul die SuFu zu benutzen

Geändert von mm1256 (12. Mär 2015 um 10:29 Uhr)
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
736 Beiträge
 
Delphi 12 Athens
 
#4

AW: (Formular-)Handling größerer Projekte

  Alt 12. Mär 2015, 11:23
Aber, ich hab doch ausgenommen von modalen Fenstern i.d.R. keinen Close-Button. Darum die Frage, wenn ich denn schon Release verwenden soll, wo? Und wo setzt man die Form-Variable auf nil?
Genau für diesen Fall gibt es ja das OnClose-Ereignis, damit du da nochmal eingreifen kannst. Und ob du Release selbst aufrufst oder nicht ist Geschmackssache.
Das hier:
Delphi-Quellcode:
procedure TFrmClient1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  FrmClient1 := nil;
end;
bewirkt genau das selbe wie:
Delphi-Quellcode:
procedure TFrmClient1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caNone;
  FrmClient1 := nil;
  Release;
end;
Ich habe hier übrigens auch wie du Forms, von denen es nur eine Instanz geben kann. Dabei prüfe ich deren Existenz auch über die Form-Variablen. Bei allen anderen Forms (modale Dialoge etc) lösche ich die von Delphi automatisch erzeugte Form-Variable immer als erstes raus.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz