AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Form.hide Problem bei dynamischen Erzeugen via create(self)
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von litotes · begonnen am 8. Mär 2007 · letzter Beitrag vom 8. Mär 2007
Antwort Antwort
Seite 1 von 2  1 2      
litotes

Registriert seit: 12. Feb 2007
33 Beiträge
 
Delphi 7 Professional
 
#1

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

  Alt 8. Mär 2007, 17:14
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

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:
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
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#2

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

  Alt 8. Mär 2007, 17:59
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
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
litotes

Registriert seit: 12. Feb 2007
33 Beiträge
 
Delphi 7 Professional
 
#3

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

  Alt 8. Mär 2007, 18:29
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#4

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

  Alt 8. Mär 2007, 18:44
Hast du schon mal versucht die Reihenfolge zu ändern?
Delphi-Quellcode:
form2 := Tform2.create(self);
form2.show;
form1.hide;
Was ist self? (Form1?)
Markus Kinzler
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

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

  Alt 8. Mär 2007, 18:50
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;
Andreas
  Mit Zitat antworten Zitat
litotes

Registriert seit: 12. Feb 2007
33 Beiträge
 
Delphi 7 Professional
 
#6

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

  Alt 8. Mär 2007, 20:02
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:
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
  Mit Zitat antworten Zitat
IngoD7

Registriert seit: 17. Feb 2004
464 Beiträge
 
Delphi 7 Enterprise
 
#7

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

  Alt 8. Mär 2007, 20:14
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;

Erklärst du das mal bitte?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#8

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

  Alt 8. Mär 2007, 20:23
Form1 ist eine bestimmte Referenzvariable und nicht die aktuelle Instanz.
Einfach Hide; oder Self.Hide; verwenden
Markus Kinzler
  Mit Zitat antworten Zitat
IngoD7

Registriert seit: 17. Feb 2004
464 Beiträge
 
Delphi 7 Enterprise
 
#9

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

  Alt 8. Mär 2007, 20:28
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.
form2 := Tform2.create(Application);
  Mit Zitat antworten Zitat
IngoD7

Registriert seit: 17. Feb 2004
464 Beiträge
 
Delphi 7 Enterprise
 
#10

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

  Alt 8. Mär 2007, 20:32
Zitat von mkinzler:
Form1 ist eine bestimmte Referenzvariable und nicht die aktuelle Instanz.
Einfach Hide; oder 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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 00:47 Uhr.
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