Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Form.hide Problem bei dynamischen Erzeugen via create(self) (https://www.delphipraxis.net/87998-form-hide-problem-bei-dynamischen-erzeugen-via-create-self.html)

litotes 8. Mär 2007 16:14


Form.hide Problem bei dynamischen Erzeugen via create(self)
 
Hallo,

bin gerade auf ein merkwürdiges Problem gestoßen:
Bisher hatte ich immer folgendes:
Delphi-Quellcode:
form1.hide;
form2.show;
klappt gut, is ja auch einfach :-D

Nun habe ich aus Speichergründen, weil ich sehr große Videos in die Formulare einbinde, mir folgendes überlegt:

Delphi-Quellcode:
form1.hide
form2 := Tform2.create(self);
form2.show;
Problem dabei:
Alles klappt, im Debugger sehe ich, dass alles freigegeben und neu erzeugt wird,
ABER dann springt er sofort zu der form2.hide Methode!! (in der natürlich wieder steht:
Delphi-Quellcode:
Screen.ActiveForm.release;
um eben Speicher freizugeben...

Wenn ich form2.show auskommentiere, dann springt er nicht mehr dorthin, tut aber natürlich nix mehr...

Für alle Hilfe bin ich sehr dankbar!

Litotes

Mazel 8. Mär 2007 16:59

Re: Form.hide Problem bei dynamischen Erzeugen via create(se
 
Zitat:

ABER dann springt er sofort zu der form2.hide Methode!!
Du meinst doch sicher, dass er in Form1.Hide springt?

Ich habe das eben mal so aufgebaut wie du es beschrieben hast, aber bei mir wird die Form korrekt angezeigt und Form1 ausgeblendet.

Wenn ich aber das Screen.ActiveForm.Release in die Form1 stelle, dann habe ich den Effekt, dass kein Fenster angezeigt wird, dass daran liegt, dass Form1 den Fokus hat und somit freigegeben wird, da Screen.ActiveForm.Release sich das Fenster mit dem Fokus holt, und danach Form2.Show nicht mehr aufgerufen wird.

Gruß
Mazel

litotes 8. Mär 2007 17:29

Re: Form.hide Problem bei dynamischen Erzeugen via create(se
 
Hi,

danke für die schnelle Antwort:

Zitat:

Du meinst doch sicher, dass er in Form1.Hide springt?
Nein, ich meinte tatsächlich Form2.hide, also die form1 ist weg,
form2.show ist passiert (sieht man im Debugger), aber nach dem form2.show
springt er im Code der Form2 direkt in die form2.formhide -Methode,
was mich völlig verwirrt, weil er das ja nirgends gesagt bekommt!

Gruss
Litotes

mkinzler 8. Mär 2007 17:44

Re: Form.hide Problem bei dynamischen Erzeugen via create(se
 
Hast du schon mal versucht die Reihenfolge zu ändern?
Delphi-Quellcode:
form2 := Tform2.create(self);
form2.show;
form1.hide;
Was ist self? (Form1?)

shmia 8. Mär 2007 17:50

Re: Form.hide Problem bei dynamischen Erzeugen via create(se
 
Zitat:

Zitat von litotes
Nun habe ich aus Speichergründen, weil ich sehr große Videos in die Formulare einbinde, mir folgendes überlegt:
Delphi-Quellcode:
form1.hide
form2 := Tform2.create(self);
form2.show;

Das Verstecken von Formularen bringt keinen Speichervorteil. Du müsstest das Formular schon komplett freigeben.

Ich vermute auch, du machst den beliebten Standardfehler:
Delphi-Quellcode:
procedure TForm1.Button1Click(...);
begin
   Form1.Hide;  // FALSCH !!!
   // man darf nicht auf seine eigene Objektvariable (hier: Form1) zugreifen

   Hide;  // Richtig !!
end;
Nächster Standardfehler:
Delphi-Quellcode:
procedure TForm1.Button1Click(...);
begin
  form2 := Tform2.create(self);
  // hier wurde "self" als Owner übergeben
  // wenn nun Form1 freigegeben wird, wird automatisch auch form2 geschlossen
  // und freigeben !!
  form2.show;
end;

litotes 8. Mär 2007 19:02

Re: Form.hide Problem bei dynamischen Erzeugen via create(se
 
Hallo,

ein Vorschlag war (von mkinzler), die Reihenfolge zu ändern:
Delphi-Quellcode:
form2 := Tform2.create(self);
form2.show;
form1.hide;
Das klappt leider nicht.

shmia schreibt:
Zitat:

Das Verstecken von Formularen bringt keinen Speichervorteil. Du müsstest das Formular schon komplett freigeben.
Das ist mir klar, deswegen will ich ja auch in jedem Formular (ca. 130), in form.hide den Code einbauen:
Delphi-Quellcode:
Screen.ActiveForm.Release;
Mit Taskmanager habe ich das überprüft und klappt auch wunderbar.

Nun sagt shmia, das ich zwei STandardfehler begehe,
den ersten habe ich bereits korrigiert,
aber die Lösung für den zweiten ist mir unklar,
aber ich denke, das ist genau das, was ich suche! also der Fehler laut shmia:
Delphi-Quellcode:
procedure TForm1.Button1Click(...);
begin
  form2 := Tform2.create(self);
  // hier wurde "self" als Owner übergeben
  // wenn nun Form1 freigegeben wird, wird automatisch auch form2 geschlossen
  // und freigeben !! 
  form2.show;
end;
Ok, aber was ist dann die Lösung?? (ich komm nicht drauf),
denn genau das passiert ja und ist mein Problem, nämlich form2 wird geschlossen und freigegeben!

Wäre sehr dankbar, wenn shmia oder ein anderer Crack mir das sagen kann...

Gruss

Litotes

IngoD7 8. Mär 2007 19:14

Re: Form.hide Problem bei dynamischen Erzeugen via create(se
 
Zitat:

Zitat von shmia
Ich vermute auch, du machst den beliebten Standardfehler:
Delphi-Quellcode:
procedure TForm1.Button1Click(...);
begin
   Form1.Hide;  // FALSCH !!!
   // man darf nicht auf seine eigene Objektvariable (hier: Form1) zugreifen
   ...
end;

:gruebel:
Erklärst du das mal bitte?

mkinzler 8. Mär 2007 19:23

Re: Form.hide Problem bei dynamischen Erzeugen via create(se
 
Form1 ist eine bestimmte Referenzvariable und nicht die aktuelle Instanz.
Einfach
Delphi-Quellcode:
Hide;
oder
Delphi-Quellcode:
Self.Hide;
verwenden

IngoD7 8. Mär 2007 19:28

Re: Form.hide Problem bei dynamischen Erzeugen via create(se
 
Zitat:

Zitat von litotes
Nun sagt shmia, das ich zwei STandardfehler begehe,
[...]
aber die Lösung für den zweiten ist mir unklar,
aber ich denke, das ist genau das, was ich suche! also der Fehler laut shmia:
Delphi-Quellcode:
procedure TForm1.Button1Click(...);
begin
  form2 := Tform2.create(self);
  // hier wurde "self" als Owner übergeben
  // wenn nun Form1 freigegeben wird, wird automatisch auch form2 geschlossen
  // und freigeben !! 
  form2.show;
end;

Ist das denn so?

Wenn ich das nicht überlesen habe, dann hast du noch gar nicht gesagt, wo genau deine Form2 erzeugt wird. Wenn shmias Vermutung stimmt, dann wäre Form1 der Besitzer von Form2. Das kann mal beabsichtigt sein, ist es in deinem Fall aber wohl eher nicht.

Mache die Anwendung zum Besitzer von Form2. Das ist der Normalfall.
Delphi-Quellcode:
form2 := Tform2.create(Application);

IngoD7 8. Mär 2007 19:32

Re: Form.hide Problem bei dynamischen Erzeugen via create(se
 
Zitat:

Zitat von mkinzler
Form1 ist eine bestimmte Referenzvariable und nicht die aktuelle Instanz.
Einfach
Delphi-Quellcode:
Hide;
oder
Delphi-Quellcode:
Self.Hide;
verwenden

Das weiß ich. Ich selbst verwende auch - wenn nötig - self.

Aber wo ist die Verwendung von Form1.Hide in einer TForm1.Button1Click ein Fehler?
Habt ihr ein Beispiel, wann und wieso das in diesem Fall schiefgehen kann?

Will sagen:
Wenn er Form1 (eine Instanz von TForm1) verstecken will, dann kann er überall sagen: Form1.Hide.
Form1 wird ausgeblendet und er ist zufrieden.

Dass er - wenn er mehrere Instanzen von TForm1 erzeugt hat - immer nur die eine Instanz namens Form1 schließt, sobald in irgendeiner Instanz der zugehörige Button1 gedrückt wird, das ist mir klar.
Hat aber ja mit seinem Problem hier überhaupt nichts zu tun.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:09 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz