AGB  ·  Datenschutz  ·  Impressum  







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

Speicherzugriffsfehler bei Freigabe vom Frame

Ein Thema von backdraft · begonnen am 26. Apr 2007 · letzter Beitrag vom 3. Mai 2007
Antwort Antwort
Seite 1 von 2  1 2      
backdraft

Registriert seit: 19. Apr 2005
Ort: Hückeswagen
333 Beiträge
 
Delphi 11 Alexandria
 
#1

Speicherzugriffsfehler bei Freigabe vom Frame

  Alt 26. Apr 2007, 11:42
Hilfe, ich verzweifel langsam,

ich habe in meinem Programm ein PageControl an der Seite, welches Frames aufnimmt. Diese Frames lege ich zur Laufzeit an,
mit dem Formular als Owner. Auf dem Frames ist eigentlich immer eine ElTree Komponente oder ein ListView.

Zum Freigeben der Frames rufe ich folgende Funktion auf:

Delphi-Quellcode:
 procedure iFreeFrame(aFrame: TFrame);
 var vName: string;
 begin
  IF Assigned(aFrame) THEN BEGIN
   vName := 'unbekannt';
   try
    vName := aFrame.ClassName + '.' + aFrame.Name;
    aFrame.Free; // Darf nicht, sonst crash
   except
    KDRProg1.KDRDebugger.LogError('Kann Frame nicht freigeben: ' + vName);
   end;
   aFrame := nil;
  end;
 end;
Leider fliegt das Programm sporadisch, besonders gerne dann, wenn die Liste Werte hat mit Fehlern raus. Diese kann ich auch nicht über try except abfangen. Er läuft nicht in meine except funktion.

Da ich Eurekalog einsetze kann man eigentlich schön nachvollziehen was passiert (die Bilder sind im Anhang).
Ich finde es aber nicht. Die Zeile in der Delphi über den Debugger beim Free stehen bleibt ist folgende:

Delphi-Quellcode:
function TCanvas.TryLock: Boolean;
begin
  EnterCriticalSection(CounterLock);
  try
    Result := FLockCount = 0;
    if Result then Lock;
  finally
    LeaveCriticalSection(CounterLock);
  end;
end;
Ich habe auch schon alles probiert in einem Testprogramm. Da läuft alles wunderbar. Es ist halt nur im Gesamtprogramm, dass es auf Fehler kommt.

Weiss jemand, wo ich danach suchen kann? Ich bin da ratlos.
Lasse ich die Free Funktion weg, kommt das selbe beim Programmende.
Miniaturansicht angehängter Grafiken
fehler2_242.jpg   fehler1_104.jpg  
Oliver
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Speicherzugriffsfehler bei Freigabe vom Frame

  Alt 26. Apr 2007, 12:39
Wie legst du sie an und wann rufst du die Funktion wie auf?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
backdraft

Registriert seit: 19. Apr 2005
Ort: Hückeswagen
333 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Speicherzugriffsfehler bei Freigabe vom Frame

  Alt 26. Apr 2007, 13:20
Zitat von Bernhard Geyer:
Wie legst du sie an und wann rufst du die Funktion wie auf?
Delphi-Quellcode:
   Fframe_wf_messages := Tframe_wf_messages.Create(self, vTab);
   Fframe_wf_messages.Parent := vTab;
   Fframe_wf_messages.Align := alClient;
   Fframe_wf_messages.Execute(KDRProg1);
Wobei ich den Constructor folgendermaßen geändert habe

Delphi-Quellcode:

constructor Create(AOwner: TComponent; aNoteTab: TKDRTabbedNotebookPage); reintroduce;

constructor Tframe_wf_messages.Create(AOwner: TComponent; aNoteTab: TKDRTabbedNotebookPage);
begin
  inherited Create(AOwner);
  FNoteTab := aNoteTab;
end;
Oliver
  Mit Zitat antworten Zitat
shmia

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

Re: Speicherzugriffsfehler bei Freigabe vom Frame

  Alt 26. Apr 2007, 14:30
Du solltest den Frame so freigeben:
Delphi-Quellcode:
// zur Sicherheit den Fokus auf das PageControl setzen
// damit nicht ein Control vernichtet wird, dass z.Zt. den Focus hat (könnte evtl. Ärger machen)
PageControl1.SetFocus;
// weg mit dem Frame
FreeAndNil(Fframe_wf_messages);
Deine eigene Funktion iFreeFrame() setzt die Variable Fframe_wf_messages nicht auf Nil.
Also zeigt die Variable auf einen freigegebenen Speicher und das ist gefährlich.
Andreas
  Mit Zitat antworten Zitat
backdraft

Registriert seit: 19. Apr 2005
Ort: Hückeswagen
333 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Speicherzugriffsfehler bei Freigabe vom Frame

  Alt 26. Apr 2007, 15:07
Zitat von shmia:
Du solltest den Frame so freigeben:
Delphi-Quellcode:
// zur Sicherheit den Fokus auf das PageControl setzen
// damit nicht ein Control vernichtet wird, dass z.Zt. den Focus hat (könnte evtl. Ärger machen)
PageControl1.SetFocus;
// weg mit dem Frame
FreeAndNil(Fframe_wf_messages);
Deine eigene Funktion iFreeFrame() setzt die Variable Fframe_wf_messages nicht auf Nil.
Also zeigt die Variable auf einen freigegebenen Speicher und das ist gefährlich.
Hallo, dann kommt die Meldung "Ein deaktiviertes oder unsichtbares Objekt kann keinen Focus erhalten!"
Hab auch mal auf die Form oder ähnliches versucht, geht leider nicht.

Mit dem nicht auf nil setzen verstehe ich nicht. Ich habe doch "aFrame := nil;" gemacht. Warum geht das nicht so?

Danke schonmal für den Tipp...
Oliver
  Mit Zitat antworten Zitat
backdraft

Registriert seit: 19. Apr 2005
Ort: Hückeswagen
333 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Speicherzugriffsfehler bei Freigabe vom Frame

  Alt 26. Apr 2007, 15:12
Ich hab es gerade mal im Quelltext direkt in die fFunktion die das Fenster schließt gemacht. Jetzt kommt zwar kein Fehler mehr vom SetFocus, aber das Ergebnis ist immer noch gleich.
Oliver
  Mit Zitat antworten Zitat
backdraft

Registriert seit: 19. Apr 2005
Ort: Hückeswagen
333 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Speicherzugriffsfehler bei Freigabe vom Frame

  Alt 26. Apr 2007, 15:24
Ich habe gerade noch eine Interessante Erkenntnis erlangt.
Egal welches ich als erstes Frame freigebe. Das erste meldet keinen Fehler.
Egal welches ich als zweites, drittes, usw freigebe, ab da kommen die Fehler!

Dann habe ich mal probiert einfach zur Laufzeit während des normalen Programmlaufs ein Frame zu zerstören, geht auch fehlerfrei. Das zweite -> absturtz.

Interessant wird das ganze, wenn ich nur das erste Fenster zerstört habe und dann die Applikation minimiere und wieder wiederherstelle. Dann kommt der selbe Fehler! Danach kann ich das Prog nur noch abschießen, weil eine Fehlermeldung nach der anderen kommt.

Dann muss doch da irgendwas mit dem Window Handling total im argen sein.
Oliver
  Mit Zitat antworten Zitat
shmia

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

Re: Speicherzugriffsfehler bei Freigabe vom Frame

  Alt 26. Apr 2007, 15:39
Zitat von backdraft:
Mit dem nicht auf nil setzen verstehe ich nicht. Ich habe doch "aFrame := nil;" gemacht. Warum geht das nicht so?
Deine Funktion bekommt den Parameter aFrame: TFrame ja per Value übergeben.
Man müsste schon var aFrame: TFrame schreiben, damit das Nil setzen eine Auswirkung
auf die übergebene Variable hat.

Zum Thema SetFocus:
Wenn das Formular nicht sichtbar ist, dann muss man SetFocus weglassen.

Weitere Vorgehensweise:
Ich würde statt deinen vorhandenen Frames nur einen ganzen einfachen Frame mit einem TEdit und TLabel drauf
in das Projekt einfügen. Keine Events benützen, Konstruktor und Destruktor des Frames nicht überschreiben.
So lässt sich feststellen, ob dass Problem innerhalb eines bestimmten Frames liegt ober ob du grundsätzlich
einen Fehler gemacht hast.
Andreas
  Mit Zitat antworten Zitat
Udontknow

Registriert seit: 17. Jun 2002
223 Beiträge
 
#9

Re: Speicherzugriffsfehler bei Freigabe vom Frame

  Alt 26. Apr 2007, 16:09
Hallo!

Erfolgt der Aufruf zur Freigabe des Sheets bzw. Frames durch ein Steuerelement auf dem Frame (z.B. per Buttonclick)? Das wäre nämlich böse!

Cu,
Udontknow
  Mit Zitat antworten Zitat
backdraft

Registriert seit: 19. Apr 2005
Ort: Hückeswagen
333 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Speicherzugriffsfehler bei Freigabe vom Frame

  Alt 26. Apr 2007, 16:12
Zitat von Udontknow:
Hallo!

Erfolgt der Aufruf zur Freigabe des Sheets bzw. Frames durch ein Steuerelement auf dem Frame (z.B. per Buttonclick)? Das wäre nämlich böse!

Cu,
Udontknow
Hehe, das wäre meine nächste Frage gewesen, da hab ich nämlich sowas. aber so lange der rest nicht geht hatte ich die frage nach hinten gestellt.

Gibts dafür auch ne möglichkeit? Ich müsste auch die Variable freigeben aus dem Hauptprogramm.
Oliver
  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 23:04 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