Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#6

AW: TDictionary Zugriff über property

  Alt 20. Dez 2023, 13:53
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat