Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Konzeptfrage Speicher freigeben (https://www.delphipraxis.net/120485-konzeptfrage-speicher-freigeben.html)

WIng2005 11. Sep 2008 10:51


Konzeptfrage Speicher freigeben
 
Hallo Gemeinde,

ich hatte vor geraumer Zeit ein Problem mit folgendem Code (sinngemäß):

Delphi-Quellcode:

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;
Es soll eine DB nach einem Pfad zu einem jpg-file durchsucht werden und dieses (nachdem es zwischengespeichert wurde) in ein
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

DeddyH 11. Sep 2008 10:53

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.

WIng2005 11. Sep 2008 11:12

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

DeddyH 11. Sep 2008 11:16

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.

WIng2005 11. Sep 2008 11:37

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

DeddyH 11. Sep 2008 12:29

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.

WIng2005 11. Sep 2008 13:34

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

DeddyH 11. Sep 2008 13:40

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.

WIng2005 11. Sep 2008 13:43

Re: Konzeptfrage Speicher freigeben
 
habs so:

Delphi-Quellcode:
if templist <> nil then freeandnil(templist);
Vielen Dank für die Hilfe.

MFG
Steffen

uligerhardt 11. Sep 2008 15:10

Re: Konzeptfrage Speicher freigeben
 
Zitat:

Zitat von WIng2005
Delphi-Quellcode:
if templist <> nil then freeandnil(templist);

Die Prüfung auf nil kannst du dir noch sparen - das macht FreeAndNil eh schon.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:35 Uhr.
Seite 1 von 2  1 2      

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