TBitmap ist ja eine Klasse und in der TTest-Instanz wird nur ein Zeiger auf die TBitmap-Instanz gespeichert. Ebenso enthält das Directory nur Zeiger auf TTest-Instanzen.
Folgendes ist also problematisch:
Delphi-Quellcode:
function GetSomeText(AMyKey: string): string;
var
Test: TTest;
begin
Test := TTest.Create;
FDD.TryGetValue(AMyKey, Test);
Result := Test.SomeText;
end;
Das TryGetValue gibt die gefundene TTest-Instanz im Parameter Test zurück. Die vorher erzeugte Instanz verbleibt somit als Speicherleck. Besser wäre:
Delphi-Quellcode:
function GetSomeText(AMyKey: string): string;
var
Test: TTest;
begin
Result := ''; // Wert bei not found
if FDD.TryGetValue(AMyKey, Test) then
Result := Test.SomeText;
end;
Analog hier:
Delphi-Quellcode:
function GetSomeBitmap(AMyKey: string): TBitmap;
var
Test: TTest;
begin
Result := nil; // Wert bei not found
if FDD.TryGetValue(AMyKey, Test) then
Result := Test.SomeBitmap;
end;
Und hier wäre eventuell das besser:
Delphi-Quellcode:
procedure ListBoxOnClick;
var
MyBitmap: TBitmap;
begin
if MyListBox.ItemIndex > -1 then
begin
MyMemo.Text := pSomeText[MyListBox.Items[MyListBox.ItemIndex]];
...
MyBitmap := pSomeBitmap[MyListBox.Items[MyListBox.ItemIndex]];
Image.Picture.Graphic := MyBitmap;
// kein MyBitmap.Free, da uns die Instanz hier nicht gehört. Andernfalls klappt es beim zweiten Mal vermutlich nicht mehr.
end;
end;
Damit die Bitmaps auch am Ende freigegeben werden, sollte in einem
TTest.Destroy
noch ein
SomeBitmap.Free
erfolgen.