![]() |
Freigeben -> AV; Bearbeiten -> Nichts weiter
Hallo ihr,
ich habe ein seltsames Problem mit einem Schulprojekt. Und zwar habe ich eine von TObjectList abgeleitete Liste welche Objekte vom Typ TExemplarZeile beinhalten. Diese hat als Vorfahre die Klasse TZeile. Jetzt gibt es noch eine zweite ListenKlasse welche Objekte von Typus TKursZeile aufnimmt. Wenn ich nun die erste mit Daten fülle, kann ich nicht mehr das erste Objekt der zweiten Liste löschen oder freigeben. Weil dann kommt mir einen AV entgegen. Ansonsten kann ich damit arbeiten wie ich will. Wenn ich sogar das Objekt vorher entferne und dann die andere Liste befülle funktioniert alles wunderbar.
Delphi-Quellcode:
Das macht "Exemplarliste.LadeAusDatenbank":
Kursliste.LadeAusDatenbank(Datenbank);
// An dieser Stelle funktionieren folgende Aufrufe (natürlich nicht alle gleichzeitig) Kursliste[0].Free; // Oder Kursliste.Delete(0); Exemplarliste.LadeAusDatenbank(Datenbank); // Hier aber nicht mehr Kursliste[0].Free; // Oder Kursliste.Delete(0);
Delphi-Quellcode:
Ich versuche weiterhin das weiter einzugrenzen, aber im Moment möchte ich euch nicht den ganzen Sourcecode geben. Aber vielleicht hilft euch das schon? Besonders, warum man nicht freigeben kann, aber beispielsweise Werte ändern kann.
procedure TExemplareZeilenListe.LadeAusDatenbank(const ADatenbank : TDatenbank);
var Daten : TExemplarZeile; i : Integer; ILExemplarIDs, ILPersonenIDs, ILBuchIDs, ILBEIDs : TIntegerList; BLAusgedruckt : TBooleanList; begin Clear; ILExemplarIDs := TIntegerList.Create; ILPersonenIDs := TIntegerList.Create; ILBuchIDs := TIntegerList.Create; ILBEIDs := TIntegerList.Create; BLAusgedruckt := TBooleanList.Create; try ADatenbank.GibExemplarIDs(ILExemplarIDs); ADatenbank.IstAusgedruckt(BLAusgedruckt, ILExemplarIDs); ADatenbank.GibBuchIDs(ILBuchIDs, ILExemplarIDs); ADatenbank.GibBEIDs(ILBEIDs, ILExemplarIDs); ADatenbank.GibPersonen(ILPersonenIDs, ILExemplarIDs); for i := 0 to ILExemplarIDs.Count - 1 do begin Daten := TExemplarZeile.Create; Daten.ID := ILExemplarIDs[i]; Daten.Ausgeliehen := nil; Daten.Buch := nil; Daten.VPersonenID := ILPersonenIDs[i]; Daten.VBuchID := ILBuchIDs[i]; Daten.BEID := ILBEIDs[i]; Daten.Ausgedruckt := BLAusgedruckt[i]; Add(Daten); end; finally ILExemplarIDs.Free; ILPersonenIDs.Free; ILBuchIDs.Free; ILBEIDs.Free; BLAusgedruckt.Free; end; end; MfG xZise |
Re: Freigeben -> AV; Bearbeiten -> Nichts weiter
Was mir spontan dazu einfällt ohne genauer in den Quelltext geschaut zu haben ist die Eigenschaft OwnsObjects. Wenn du die Objekte selbst freigeben willst, etc., dann musst du die auf False setzen. Wenn die TObjectList bei einem Delete oder der Zerstörung der Liste diese selbst aus dem Speicher entfernen soll, dann muss das auf True stehen.
|
Re: Freigeben -> AV; Bearbeiten -> Nichts weiter
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Sebastian,
OwnObjects ist bei diesen Listen auf true. Aber daran dürfte es nicht liegen, wobei ich da misstrauisch geworden bin :mrgreen: Naja ich habe mich mal daran gesetzt den Code zu entschlacken. Und das Ergebnis hänge ich einfach mal an! Übrigens ist der Fehler (oder ein anderer?) wo anders. Ich bin der Sache mal auf der Spur. [edit]Damit ihr wisst wo ihr suchen solltet: Der Ursprüngliche Fehler tritt in Zeile 39 in UHaupt.pas auf. Der neue Fehler (oder vielleicht zeigt sich der gleiche einfach anders) in Zeile 207 in UZeilen.pas bzw die Fehlermeldung erscheint, wenn man mit dem Debuger gerade über Zeile 2136 läuft.[/edit] [edit]Ich bitte alle die es sich bereits heruntergeladen haben, die "db"-Datei zu löschen und durch diese hier im Anhang zu ersetzen.[/edit] [edit]Folgendes: In der Schule unter Delphi 2009 --> Fehler beim Zerstören In der Schule unter Turbo Delphi --> Fehler beim Erstellen aber keinen beim Zerstören des KursEintrages (Z. 39 UHaupt.pas) --> Zerstören der BLAusgedruckt-Liste (Z. 229 UZeilen.pas)[/edit] MfG xZise |
Re: Freigeben -> AV; Bearbeiten -> Nichts weiter
Hallo,
wenn ich die alte Variante von meiner UIntegerList/UBooleanList verwende, bekomme ich keine Fehler. Also vermute ich die Probleme dort. Aber ich weiß nicht, was ich da falsch mache. MfG xZise |
Re: Freigeben -> AV; Bearbeiten -> Nichts weiter
Ich möchte ja nicht stören, wüsste aber gerne, was ich da verbrochen habe :)
MfG xZise |
Re: Freigeben -> AV; Bearbeiten -> Nichts weiter
Hi,
vielleicht bin ich ja völlig auf dem falschen Dampfer, aber dein Code muss eine Exception werfen, wenn OwnObjects True ist:
Delphi-Quellcode:
Aus TObjectList:
Kursliste[0].Free;
// Oder Kursliste.Delete(0);
Delphi-Quellcode:
TObject(Ptr) hast du ja schon freigegeben.
procedure TObjectList.Notify(Ptr: Pointer; Action: TListNotification);
begin if OwnsObjects then if Action = lnDeleted then TObject(Ptr).Free; inherited Notify(Ptr, Action); end; Cu, Frank |
Re: Freigeben -> AV; Bearbeiten -> Nichts weiter
Das habe ich oben ja auch schon geschrieben und das passiert ja auch. Wenn die Zeile drin ist, dann gibts den Fehler wie nicht anders zu erwarten beim Zerstören von Kursliste.
Wenn dieser Fehler nicht drin ist, dann tritt der Fehler laut Callstack und Debuggen im CPU-Fenster beim Finalisieren einer Unit auf. Genaueres hab ich jetzt eben noch nicht gesehen. // EDIT: Um genau zu sein tritt der Fehler in DoneControls auf, aber: Es werden auch einige Speicherlecks gemeldet... Um die solltest du dich einmal kümmern, Details sagt dir z.B. FastMM. |
Re: Freigeben -> AV; Bearbeiten -> Nichts weiter
Hallo Sebastian und Frank,
Zitat:
Zitat:
Zitat:
Und wie gesagt. Es kann zufall sein, dass er nur mit der Integer-/BooleanList im Anhang auftritt. MfG xZise |
Re: Freigeben -> AV; Bearbeiten -> Nichts weiter
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Im Anhang liegt der entsprechende delphiinterne Report. |
Re: Freigeben -> AV; Bearbeiten -> Nichts weiter
Liste der Anhänge anzeigen (Anzahl: 2)
Tach Sebastian,
aber das hat dann nichts mehr mit freigeben zu tun. Weil folgender Code funktioniert:
Delphi-Quellcode:
Deshalb denke ich, dass irgendwo in der TIntegerList, TBooleanList oder TMainList sein müsste (ich wiederhole mich :) ). Ich hänge einfach die alte Version der TInteger-/TBooleanList an, womit es funktioniert. (Kleiner Hinweis: UMainList dann in der UDatenbank entfernen)
procedure TFLiberate.FormCreate(Sender: TObject);
begin Datenbank := TDatenbank.Create(ExtractFilePath(ParamStr(0)) + 'db'); ReportMemoryLeaksOnShutdown := true; Exemplarliste := TExemplareZeilenListe.Create; Kursliste := TKursZeilenListe.Create; Kursliste.LadeAusDatenbank(Datenbank); Exemplarliste.LadeAusDatenbank(Datenbank); end; procedure TFLiberate.FormDestroy(Sender: TObject); begin Exemplarliste.Free; Kursliste.Free; Datenbank.Free; end; MfG xZise |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:15 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