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