AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein OnClose , action caFree oder caHide
Thema durchsuchen
Ansicht
Themen-Optionen

OnClose , action caFree oder caHide

Ein Thema von akurka · begonnen am 12. Jan 2016 · letzter Beitrag vom 16. Jan 2016
Antwort Antwort
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.487 Beiträge
 
Delphi 12 Athens
 
#1

AW: OnClose , action caFree oder caHide

  Alt 13. Jan 2016, 14:21
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.

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.

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.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: OnClose , action caFree oder caHide

  Alt 13. Jan 2016, 15:09
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.
Das stimmt so nicht ganz. Der Speichermanager gibt die Objekte (den Speicher der Objekte) sofort frei. (Es gibt in Delphi keinen Garbage Collector)
Wenn du "Glück" hast und niemand sonst Speicher anfordert und die Speicherseite nicht komplett freigegeben wurde, dann funktioniert das Objekt auch noch.
Da Methoden an die Klasse und nicht an eine Instanz gebunden sind, lassen sie sich grundsätzlich immer aufrufen.
Je nach Zustand des freigegebenen Speichers kann es dann aber innerhalb der Methoden beim Zugriff auf Felder der Instanz zu Zugriffsverletzungen kommen.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von akurka
akurka

Registriert seit: 30. Dez 2008
Ort: Schweiz, 8636 Wald ZH
81 Beiträge
 
Delphi 7 Personal
 
#3

AW: OnClose , action caFree oder caHide

  Alt 16. Jan 2016, 14:43
Hallo mitenand,
Ich habe mich lang nicht gemeldet, das Problem ist aber jetzt gelöst, allerdings ist es nicht so gegangen wie ich es mir ursprünglich gedacht habe.

Es hat doch einige Probleme gegeben ich bin zurück auf den Vorschlag
vom mm1256 : 1 Frame und eine Menge Images, und das lauft jetzt sehr stabil.

Besten Dank an alle für die Beiträge, ich schätze es sehr wenn man
ein Problem hat, dies einem grösserem Publikum zu unterbreiten, statt
im stillem Kämmerli vor sich zu brüten.
Man lernt auch immer etwas dabei.
Vielen Dank
Anton
Anton Kurka
  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 00:41 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