Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   OnClose , action caFree oder caHide (https://www.delphipraxis.net/187887-onclose-action-cafree-oder-cahide.html)

akurka 12. Jan 2016 14:45

OnClose , action caFree oder caHide
 
Hallo,
Von der Form1 werden je nach Stellung eines Drehschalters (OnChange)
proceduren von verschiedene Forms (z.Bsp Form2.man, Form3.Prog usw) )aufgerufen. Alle diese Forms beinhalten ein anderes Image. Das funktioniert soweit problemlos.
Beim Starten des Programms wird standartmässig Form2.Man aufgerufen.
Beim Wechsel des Drehschalters wird dann z.Bsp Form3.Prog aufgerufen.
Da es 16 Stellungen des Drehschalters gibt, sind es auch 16 Formulare
die aktiviert werden können.

Im Form2 habe ich OnClose verwendet mit caFree oder caHide. Die Form2
wird aber nicht gelöscht nach dem Drehschalterwechsel(das Image wurde teilweise entfernt)also die Form2 offenbar nicht freigegeben.

Bei jedem umschalten wird dann eine neue Form aufgerufen.
Gemäss verschiedene Forenbeiträge müsste OnClose funktionieren, es tut aber nicht. Woran liegt es ?

baumina 12. Jan 2016 14:54

AW: OnClose , action caFree oder caHide
 
Um Form2 zu schließen, musst du irgendwo Form2.Close aufrufen, dann geht er auch dort in OnClose rein.

Neutral General 12. Jan 2016 14:56

AW: OnClose , action caFree oder caHide
 
Falls du die globale Variable "Form2" benutzt, dann kannst du nur froh sein, dass dir das Programm bei caFree nicht um die Ohren fliegt.
Das Beste wäre wenn du alle globalen Form-Variablen bis auf die vom Hauptformular löschst, dann kommst du gar nicht erst in Versuchung.

EDIT: Wenn es ist wie baumina sagt, dann fehlt dir tatsächlich nur ein Close. Aber auch da solltest du (höchstwahrscheinlich) nicht auf die
globalen Formvariablen zugreifen.

Ich bin mir nicht ganz sicher wie deine Situation ist, aber ich würde für deinen 16 Formularen 1 Formular machen mit einem TImage.
Je nach Stellungen des Drehschalters lädst du andere Bilder in das Image dieses Formulars.
Ob du nun beim Schließen des Forms das Formular freigibst (und beim nächsten Anzeigen vorher wieder erstellst) oder es nur unsichtbar machst,
sollte soweit ich das mit diesen Infos beurteilen kann relativ egal sein.

mm1256 12. Jan 2016 16:46

AW: OnClose , action caFree oder caHide
 
Zitat:

Zitat von Neutral General (Beitrag 1326760)
.... ich würde für deinen 16 Formularen 1 Formular machen mit einem TImage. Je nach Stellungen des Drehschalters lädst du andere Bilder in das Image dieses Formulars.

:thumb: Und wenn ein Formular mehr als nur ein Image beinhaltet, gibt's ja immer noch die Möglichkeit, Frames zu verwenden

himitsu 12. Jan 2016 16:59

AW: OnClose , action caFree oder caHide
 
Zitat:

Zitat von baumina (Beitrag 1326759)
Um Form2 zu schließen, musst du irgendwo Form2.Close aufrufen, dann geht er auch dort in OnClose rein.

Jupp, er hat auch nicht geschrieben, wie er die Fenster wieder zu macht.
Ein Form.Free ruft kein OnClose/OnCloseQuery auf.

akurka 12. Jan 2016 18:25

AW: OnClose , action caFree oder caHide
 
Hallo Neutral General
Ja da hast Du schon recht mit einem Timage, nun ist es so, dass es innerhalb des jeweiligen Frames schon mehrere Bilder gibt.
Es sind nicht Bilder im herkömlichen Sinn sondern Menüs mit Edit, Memos, und grafischen Anzeigen.
Wegen der übersichtlichkeit des Programms will ich die einzelne Drehschalter Stellungen : (sprich Betriebsarten der Steuerung) von ein
andern trennen.
-----------------------
Zitat:

Heute, 15:54 by baumina
[Zitat]
vor 2 Stunden
Um Form2 zu schließen, musst du irgendwo Form2.Close aufrufen, dann geht er auch dort in OnClose rein.
andern trennen.

Ja genau das habe ich gemacht : im Form2 steht :

procedure TForm2.OnClose(Sender: TObject; var Action: TCloseAction);
begin
Action:= caHide;// pribiert habe ich auch mit caFree
end;

Es funktioniert aber nicht, der Formular bleibt Leer auf dem Bildschirm stehen.
Wenn ich der Wahlschalter wieder zurück schalte, lauft der Form2 wieder
weiter, d.h Bild baut sich wieder auf und alle Anzeigen funktionieren.

ich habe es auch im Hauptformular probiert mit dem OnClose, das gab
ein Programmabsturz. Auch wenn es so gegangen wäre, ist dieser Lösung
sehr ungünstig.

Helmi 12. Jan 2016 19:11

AW: OnClose , action caFree oder caHide
 
Hallo,

wie wäre es, einfach vor dem Anzeigen (ich vermute mal mit Show) der ausgewählten Form
erst mal alle zu hiden?

also:

Delphi-Quellcode:
Form1.Hide;
Form2.Hide;
...

//und ab hier die Anzeige abhängig der Drehschalterstellung

hoika 13. Jan 2016 05:32

AW: OnClose , action caFree oder caHide
 
Hallo,
caHide und caFree haben eigentlich nur in MDI-Anwendungen eine Daseinsberechtigung..


Heiko

nahpets 13. Jan 2016 12:10

AW: OnClose , action caFree oder caHide
 
Wo rufst Du denn
Delphi-Quellcode:
Form2.Close
auf, wenn das aufgerufen wird, dann wird auch das Ereignis onClose aufgerufen.

Blup 13. Jan 2016 14:21

AW: OnClose , action caFree oder caHide
 
Zitat:

Zitat von akurka (Beitrag 1326757)
Hallo,
Von der Form1 werden je nach Stellung eines Drehschalters (OnChange)
proceduren von verschiedene Forms (z.Bsp Form2.man, Form3.Prog usw) )aufgerufen. Alle diese Forms beinhalten ein anderes Image. Das funktioniert soweit problemlos.

Das funktioniert nur deshalb, weil dein Projekt so eingestellt ist, beim Programmstart alle Formulare zu erzeugen und den Variablen Form1 .. FormX zuzuweisen.

Zitat:

Zitat von akurka (Beitrag 1326757)
Beim Starten des Programms wird standartmässig Form2.Man aufgerufen.
Beim Wechsel des Drehschalters wird dann z.Bsp Form3.Prog aufgerufen.
Da es 16 Stellungen des Drehschalters gibt, sind es auch 16 Formulare
die aktiviert werden können.

Im Form2 habe ich OnClose verwendet mit caFree oder caHide. Die Form2
wird aber nicht gelöscht nach dem Drehschalterwechsel(das Image wurde teilweise entfernt)also die Form2 offenbar nicht freigegeben.

In dieser Konstellation darfst du die Formulare auch nicht löschen (caHide ist Standardbelegung, caFree unzulässig). Ist das Formular "Form2" freigegeben, würde die Variable "Form2" auf einen ungültigen Speicherbereich verweisen. Der Aufruf von "Form2.man" kann dann schon zum Programmabsturz führen. Da der Speichermanager freigegebene Objekte nicht sofort löscht, fallen solche Fehler oft erst später auf. In diesem Fall scheint Form2 noch teilweise da zu sein, aber das Programm kann jederzeit abstürzen, wenn der Speichermanager diesen Speicher für etwas anderes braucht.

Zitat:

Zitat von akurka (Beitrag 1326757)
Bei jedem umschalten wird dann eine neue Form aufgerufen.
Gemäss verschiedene Forenbeiträge müsste OnClose funktionieren, es tut aber nicht. Woran liegt es ?

Formulare werden mit "Show" angezeigt und mit "Hide" ausgeblendet.
Individuelle Initialisation kannst du zum Beispiel im OnShow-Ereignis des jeweiligen Formulars aufrufen.
Beim Schalten deines Drehschalters sollte etwa das ablaufen:
Delphi-Quellcode:
  FAktivesForm.Hide;
  FAktivesForm := GetFormular(Drehschalter.Stellung);
  FAktivesForm.Show;
FAktivesForm ist eine Variable, in der du dir das jeweils aktive Formular merkst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:20 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