Einzelnen Beitrag anzeigen

Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

Re: Speicherleck oder nicht bzw. wer findet den Fehler?

  Alt 15. Okt 2004, 18:47
Delphi-Quellcode:
property Waste: TWasteItem read fWasteItem write fWasteItem;
...
procedure TItemDlg.FormCreate(Sender: TObject);
begin
  fPath := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName));
  fItems := TStringList.Create;
  fWasteItem := TWasteItem.Create(Self); <<<<---
  If FileExists(fPath + 'waste.itm') then
  begin
    ItemList.Items.LoadFromFile(fPath + 'waste.itm');
  end;
end;
...
procedure TItemDlg.FormDestroy(Sender: TObject);
begin
  ItemList.Items.SaveToFile(fPath + 'waste.itm');
  fWasteItem.Free; <<<---
  fItems.Free;
end;

...
procedure TMainForm.btnDBEditClick(Sender: TObject);
var
  wItem: TWasteItem;

begin
  wItem := TWasteItem.Create(Self);
  try
    ShowItemDlg(wItem);
  finally
// wItem.Free;
  end;
end;
So kannst du das nicht machen. Du erzeugst in deiner Form ein Wasteitem. mit
ItemDlg.Waste := Item; kopierts du nichts sondern "biegst" den Zeiger um. Fwasteitem zeigt jetzt auf das übergebene Item. Das ursprünglich erstellte fwasteitem ist dein Speicherleck, da du das nicht wieder freigeben kannst. Da du im destructor der Form fwasteitem freigibst, Fwasteitem und item aber durch die := -Zuweisung das gleiche objekt ist, siehts du eine exception beim erneuten Aufruf von free.

Keine Ahnung, für was du das brauchst, wenn es häufig vorkomt, das du ein item übergeben mußt:
property Waste: TWasteItem read fWasteItem write fWasteItem; verwende statt write write fwasteitem ein set-methode und verwende dort assign statt :=. Wenn du über eine >pro Version verfügst, gugg dir mal den Quelltext von einer Listbox an, und schau dir an, wie borland mit den Lines-eigenschaften umgeht.

Mfg Frank

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat