![]() |
Konzeptfrage Speicher freigeben
Hallo Gemeinde,
ich hatte vor geraumer Zeit ein Problem mit folgendem Code (sinngemäß):
Delphi-Quellcode:
Es soll eine DB nach einem Pfad zu einem jpg-file durchsucht werden und dieses (nachdem es zwischengespeichert wurde) in ein try //Abfrage DB-> Pfad Bilddatei holen if zquery1.RecordCount=1 then Begin qpfad:=qpfad+zquery1.fieldbyname('file_name_org').AsString; //Quellpfad wird gesetzt if DownloadFile(qpfad, filepath+'tmp.jpg')=true then //die Datei wird temporär heruntergeladen Begin bild:=TJPEGImage.create; //bild:TGraphic bild.LoadFromFile(filepath+'tmp.jpg'); NGrPFert2AuftrVw_det.Cell[6,0].ObjectReference:=bild; NGrPFert2AuftrVw_det.Repaint; end else NGrPFert2AuftrVw_det.Cell[6,0].Clear; end; except end; Grid (NextGrid) geladen. Funktioniert soweit auch gut. Nun kann ich jedoch "bild" nicht wieder freigeben, da der Eintrag im Grid nur eine Referenz ist. Also dachte ich mir, dass ich einfach beim Wechsel in ein anderes Modul (also auch aus einer völlig anderen Prozedur heraus (sogar in einer anderen Unit)) "bild" freigebe. Auch das funktionierte soweit. Dann bekam ich jedoch ständig Fehler "Zugriffsverletzung in Modul dcc70.dll" (muss nicht im Zusammenhang stehen), sodass ich die "Bild-Funktion" erstmal auskommentiert hatte. Nun möchte ich mich der Problematik wieder annehmen und würde gern mal eure Meinung zum beschiebenen Konzept wissen. Mir geht es dabei auch darum, eine Möglichkeit zu erarbeiten Stringslisten über die Grenzen einer Prozedure hinweg zu speichern (also ähnlich, wie die vorherige Problematik). MFG Steffen |
Re: Konzeptfrage Speicher freigeben
Das NextGrid hält doch die Referenz. Evtl. wird sie vom Grid selbst freigegeben? Das könntest Du ja z.B. mit FastMM überprüfen.
|
Re: Konzeptfrage Speicher freigeben
Hallo,
wenn ich jedoch bild zu früh freigebe, wird bei jedem Repaint (z.B. nach Formresize) die Referenz neu geladen, was dann in einer Zugriffsverletzung endet. Mir ging es vorrangig um die Problematik, Speicher in einer anderen Prozedur freizugeben. MFG Steffen |
Re: Konzeptfrage Speicher freigeben
Grundsätzlich bin ich ja auch dafür, ein Objekt immer auf der Ebene freizugeben, in der es angelegt wurde. Da aber nun das Grid die Referenz braucht und damit arbeitet, geht das so natürlich nicht. Falls das Grid die Freigabe nicht selbst erledigt, musst Du das dann eben an geeigneter Stelle (z.B. im Destruktor der Form) übernehmen.
|
Re: Konzeptfrage Speicher freigeben
Und wie würde sich die Problematik z.B. auf Stringlisten auswirken? Ich möchte eine Stringlist erstellen und diese im Verlauf mehrerer eingaben über ein Edit-Feld füllen. Könnte man dann die Liste selbst erst z.B. beim Klick auf einen Button freigebn, oder ist das "russisch"?
MFG Steffen |
Re: Konzeptfrage Speicher freigeben
Wenn die Stringliste über "Methodengrenzen" hinweg existieren soll, würde ich sie als privates Feld der Form deklarieren, im OnCreate erzeugen, im Programmverlauf bearbeiten und im OnDestroy wieder zerstören.
|
Re: Konzeptfrage Speicher freigeben
Vielen Dank für den Tip.
Habe es nun so gelöst, dass die Liste bei Bedarf (also wenn im zugehörigen Modul ein entspr. Event auftritt) erzeugt und bei verlassen des Modules sowie im OnDestroy wieder freigegeben wird. Wäre hier auch (habe das hier mal gelesen) eine ObjectList (unbekannterweise) zu gebrauchen? Muß in der Stringliste ggf. auch wieder einzelne Zeilen löschen, suchen, ersetzen usw... oder ist die Stringliste deiner Meinung nach ausreichend? MFG Steffen Edit: Falls es Off-Topic wird....sorry |
Re: Konzeptfrage Speicher freigeben
Für Strings eine Stringliste, für Objektinstanzen eine TObjectList :zwinker:. Gibst Du die Listen an 2 verschiedenen Stellen frei (so habe ich das verstanden), solltest Du das aber mit FreeAndNil machen oder die Liste von Hand auf nil setzen, sonst kann es ganz böse Fehler geben.
|
Re: Konzeptfrage Speicher freigeben
habs so:
Delphi-Quellcode:
Vielen Dank für die Hilfe.
if templist <> nil then freeandnil(templist);
MFG Steffen |
Re: Konzeptfrage Speicher freigeben
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:36 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