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 2 von 2     12   
Udontknow

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

Re: Speicherzugriffsfehler bei Freigabe vom Frame

  Alt 26. Apr 2007, 17:14
Ähm, war das jetzt ein Ja oder ein Nein?

Edit: Hier mal der Code, mit dem ich ein komplettes Tabsheet verwerfe. PGC_Consoles ist übrigens die PageControl, die die einzelnen Tabsheets mit den Frames beinhaltet. Der Button mit diesem Event liegt aber eben nicht auf den Tabsheets, sondern separat ausserhalb der Pagecontrol.

Delphi-Quellcode:
procedure TFRM_Main.BTN_CloseConsoleClick(Sender: TObject);
var OldPageIndex:Integer;
begin
  if PGC_Consoles.ActivePage=NIL then
    exit;

  if MessageDlg('Die Konsole wird geschlossen, sämtlicher dort eingegebene SQL-Code geht verloren. Fortfahren?',mtConfirmation,[mbOk,mbCancel],0)=mrOk then
  begin
    OldPageIndex:=PGC_Consoles.ActivePageIndex;
    PGC_Consoles.ActivePage.Free;
    if OldPageIndex>0 then
      PGC_Consoles.ActivePageIndex:=OldPageIndex-1;
  end;
end;
  Mit Zitat antworten Zitat
backdraft

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

Re: Speicherzugriffsfehler bei Freigabe vom Frame

  Alt 26. Apr 2007, 17:27
Zitat von shmia:
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.
Also ich habe ein paar neue Erkenntnisse, die mich nicht wirklich weiterbringen.

Es sind insgesamt 7 verschiedene Frames. Wenn ich bei diesen 7 Frames den Parent nicht setze funktioniert das Programm fehlerfrei, ausser dass ich das Frame halt nicht sehe.

Bei 3 dieser Frames kann ich den Parent setzen und mit dem neuen FreeAndNil funktioniert auch das freigeben super.

4 der Frames, die sich von den Komponenten nicht sonderlich unterscheiden (es sind alle komponenten von den 4 frames auch irgendwo auf den 3 funktionierenden) klappen nicht, sobald ich den Parent einstelle.

Alle Frames haben den selben Constructor.

Das Beispielframe funktioniert auch (mit dem Edit und so).

Komischerweise ist, wenn ich NUR eins der 4 frames, ohne die anderen 3 mache geht es auch. sobald ich aber ein zweites frame dynamisch erstelle ist ende.

Jetzt der Hammer... Wenn ich den Constructor nicht ändere und Delphi das erstellen / zerstören überlasse (also nicht dynamisch) funktioniert es. Den Parameter, den ich im Constrcutor zusätzlich übergeben habe, setze ich an der Stelle, wo vorher das Frame kreiert wurde.

Das hilft mir aber nicht, da ich das Frame dynamisch erstellen muss.
Oliver
  Mit Zitat antworten Zitat
backdraft

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

Re: Speicherzugriffsfehler bei Freigabe vom Frame

  Alt 26. Apr 2007, 18:29
AHA....

den Grund, wann ein Frame abschmiert habe ich jetzt.
Immer dann wenn ein LMD-ElTree auf der Maske ist und diese Liste ein Objekt hinzugefügt bekommen hat (Items.Add).
Auch ein Items.Clear hilft dann nicht mehr. Dann kracht es, beim Free.
Beim Simulieren in einem kleinen Demo-Programm passiert dieses aber nicht.

Was kann das sein?
Oliver
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#14

Re: Speicherzugriffsfehler bei Freigabe vom Frame

  Alt 26. Apr 2007, 18:47
Das klingt eher wie eine falsche Fährte. Dass klingt eher nach einer anderen Auswirkung eines woanders liegenden Problems.
  Mit Zitat antworten Zitat
backdraft

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

Re: Speicherzugriffsfehler bei Freigabe vom Frame

  Alt 26. Apr 2007, 18:49
Zitat von Muetze1:
Das klingt eher wie eine falsche Fährte. Dass klingt eher nach einer anderen Auswirkung eines woanders liegenden Problems.
... ach so ein scheiss... ich verzweifele gleich ... wieso ich immer?

ok, hab gerade ein argument für die richtige fährte gefunden. wenn ich in dem frame einen button mache, der eltree.free aufruft, knallt das prog auch raus ...
Oliver
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#16

Re: Speicherzugriffsfehler bei Freigabe vom Frame

  Alt 26. Apr 2007, 18:55
Hast du denn nun schon abgeprüft, dass...

1. Du die Frame Instanzen jeweils nur in einer Variablen / Stelle ablegst und nirgendwo anders?
2. Du beim freigeben (Destruktor) der Frame auch immer ordentlich die dazugehörige Variable/Listenelement auf Nil setzt?
3. Schonmal den Destruktor der Frames überschrieben und überall einen Brechpunkt reingestellt und geschaut, wann die anspringen? Also ob alle nur zu den gewollten Aktionen aufgerufen werden und keiner mal so zwischendurch von woanders her?
4. Hast du bei allen Zugriffen auf eine Variablen mit einer FrameInstanz einen Brechpunkt hingestellt und gleichzeitig bei im Destruktor der Frame und drauf geachtet, dass kein Zugriff mehr auf die Variablen geschieht nach dem der Destruktor angesprungen wurde?
5. Noch nicht beantwortet: Wird im Endeffekt einer langen Aufrufkette die Frame durch ein Ereignishandler der selbigen Frame ausgelöst?

etc, etc, etc.

/EDIT: ok, dann noch ein paar:

6. Sicher das die beim ElTree hinterlegten Objekte noch existieren, wenn ElTree freigegeben wird?
7. Sicher das die Objekte nicht mehr durch andere Routinen angesprochen werden, wenn ElTree freigegeben wird (z.B. ein beim freigeben ausgelöstes OnChange, o.ä.)?
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#17

Re: Speicherzugriffsfehler bei Freigabe vom Frame

  Alt 26. Apr 2007, 19:15
Hallo,

eine Ergänzung zu Thomas' Liste:

1a. Ist sichergestellt, daß der Parent des Frames noch existiert, wenn das Frame manuell freigegeben wird? Ansonsten hat der Parent das Frame bereits bei seiner eigenen Freigabe zerstört.

Gruß Hawkeye
  Mit Zitat antworten Zitat
backdraft

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

Re: Speicherzugriffsfehler bei Freigabe vom Frame

  Alt 27. Apr 2007, 11:16
Zitat von Muetze1:
Hast du denn nun schon abgeprüft, dass...

1. Du die Frame Instanzen jeweils nur in einer Variablen / Stelle ablegst und nirgendwo anders?
2. Du beim freigeben (Destruktor) der Frame auch immer ordentlich die dazugehörige Variable/Listenelement auf Nil setzt?
3. Schonmal den Destruktor der Frames überschrieben und überall einen Brechpunkt reingestellt und geschaut, wann die anspringen? Also ob alle nur zu den gewollten Aktionen aufgerufen werden und keiner mal so zwischendurch von woanders her?
4. Hast du bei allen Zugriffen auf eine Variablen mit einer FrameInstanz einen Brechpunkt hingestellt und gleichzeitig bei im Destruktor der Frame und drauf geachtet, dass kein Zugriff mehr auf die Variablen geschieht nach dem der Destruktor angesprungen wurde?
5. Noch nicht beantwortet: Wird im Endeffekt einer langen Aufrufkette die Frame durch ein Ereignishandler der selbigen Frame ausgelöst?

etc, etc, etc.

/EDIT: ok, dann noch ein paar:

6. Sicher das die beim ElTree hinterlegten Objekte noch existieren, wenn ElTree freigegeben wird?
7. Sicher das die Objekte nicht mehr durch andere Routinen angesprochen werden, wenn ElTree freigegeben wird (z.B. ein beim freigeben ausgelöstes OnChange, o.ä.)?
Danke erstmal für die Antwort.

zu 1,2,3,4: hab ich alles kontrolliert, läuft alles korrekt
zu 5: ??? dass heisst?
zu 6: ja, ich bekomme ja schon den fehler, wenn ich über einen button ein .free aufrufe.
zu 7: ja

Mittlerweile habe ich ein Testframe gemacht, auf dem nur ein Eltree liegt und ein Button zum zerstören.

Folgende erkenntnis habe ich:
Das Programm crashed, wenn es versucht den Header über der Liste zu zerstören.
Das Programm crashed nur dann, wenn der Header (Columns) beim Create sichtbar geschaltet ist UND ich ein Objekt in die Liste hänge bevor das Eltree sichtbar ist.

Das Programm crashed nicht, wenn:
- ich vor dem anlegen des Objektes die ShowColumns = False und nach dem Anlegen wieder auf True setze
- wenn ich das Objekt anlege, wenn das Eltree bereits sichtbar ist (zb über einen button auf dem frame)
- wenn ich das ganze in einem kleines Testprogramm mache, in dem ein Frame erzeuge auf dem das Eltree liegt.

Ich verstehe nicht, wieso es in dem Testprogramm klappt und in dem normalen Programm nicht. Was kann der auslöser für so ein verhalten sein? In beiden fällen lege ich das Frame an, bevor die Hauptform sichtbar wird.

Oliver
Oliver
  Mit Zitat antworten Zitat
backdraft

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

Re: Speicherzugriffsfehler bei Freigabe vom Frame

  Alt 27. Apr 2007, 12:55
Die Funktion die den Fehler verursacht habe ich gefunden:

Diese wird aber nicht beim Zerstören des Objekts aufgerufen, sondern beim Berechnen der Spaltenbreite

DrawText(Canvas.Handle, PChar(S), Length(S), R, DT_NOPREFIX or AL or DT_CALCRECT); Der Fehler tritt nämlich nur dann auf, wenn die Größe der Spalten berechnet werden muss.
Die Funktion wird insgesamt 3 mal aufgerufen, pro Spalte wobei 3 verschiedene Canvas.Handles benutzt werden.
Deaktiviere ich diese Funktion geht alles...

Vielleicht weiss jemand was an dieser Stelle passiert, das das Programm viel später rausfliegt, wenn ich das ElTree zerstöre.
Falsches Window-Handle, oder was auch immer!?!

Oliver

Hab nochwas entdeckt.
Wenn ich den DrawText deaktiviere und nur x := Canvas.Handle oder ein "IF Canvas.Handle > 0 THEN" mache, stützt er auch ab. Canvas ist aber nicht NIL.
Oliver
  Mit Zitat antworten Zitat
backdraft

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

Re: Speicherzugriffsfehler bei Freigabe vom Frame

  Alt 3. Mai 2007, 13:44
Hallo,

habe geschaft ein Testprog zu machen. Es kommt darauf an, wann man den Parent an das Frame zuweisst. Macht man es in meinem Testprog hinter dem Execute funktioniert es.

Vielleicht hilft das jemand, das Problem zu erkennen.

Es wird das ElTree für das Kompilieren benötigt.

Wäre gut, wenn jemand Rat weiss.
Angehängte Dateien
Dateityp: zip test_130.zip (596,9 KB, 6x aufgerufen)
Oliver
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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:00 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