Einzelnen Beitrag anzeigen

Kratos

Registriert seit: 15. Okt 2019
52 Beiträge
 
Delphi 10.3 Rio
 
#1

TDictionary Zugriff über property

  Alt 20. Dez 2023, 11:43
Delphi-Version: 10.3 Rio
Hallo Leute,

aus Gründen des Betriebsgeheimnisses hab ich vorsichtshalber den gesamten Code anonymisiert. Ich möchte keine Probleme bekommen.


Programmaufbau:
- 1 zentrale Daten-Unit
- mehrere VCL-Units

Die Informationen, die ich brauche und in das Dictionary geschrieben werden sollen, kommen aus einer MSSQL-DB.
Delphi-Quellcode:
unit Data;
...
type
  TTest = class
    SomeText: string;
    ... // weitere Einträge
    SomeBitmap: TBitmap;
  end;

  TAnother = class
  private
    FDD: TDictionary<string,TTest>;
    GetSomeText(AMyKey: string): string;
    GetSomeBitmap(AMyKey: string): TBitmap;
    ...
  public
    property pSomeText[AMyKey: string]: string read GetSomeText;
    property pSomeBitmap[AMyKey: string]: TBitmap read GetSomeBitmap;
  end;


procedure LoadFromDB;
var
  MyKey: string;
  MyStringStream: TStringStream;
  MyBlobStream: TStream;
begin
  ...
  qry.SQL.Text := 'select MyKey, SomeText, Image from table';
  qry.Open();
  ...
  MyKey := qry.FieldByName('MyKey').AsString; // MyKey ist eineindeutig
  ...
  MyStringStream := StringStream.Create;
  TBlobField(qry.FieldByName('SomeText')).SaveToStream(MyStringStream);
  MyStringStream.Position := 0;
  ...
  MyBitmap := TBitmap.Create;
  MyBlobStream := qry.CreateBlobStream(qry.FieldByName('Image'), bmRead);
  MyBlobStream.Position := 0;
  MyBitmap.LoadFromStream(MyBlobStream);
  ...
  SaveToDictionary(MyKey, MyStringStream.ReadString(MyStringStream.Size), MyBitmap);
end;

procedure SaveToDictionary(AMyKey, ASomeText: string; AMyBitmap: TBitmap);
var
  Test: TTest;
begin
  Test := TTest.Create;
  Test.SomeText := ASomeText;
  // Test.SomeBitmap := TBitmap.Create -> keine Veränderung festgestellt, egal ob auskommentiert oder nicht
  Test.SomeBitmap := AMyBitmap;

  FDD.Add(AMyKey, Test);
and;

// funktioniert
function GetSomeText(AMyKey: string): string;
var
  Test: TTest;
begin
  Test := TTest.Create;
  FDD.TryGetValue(AMyKey, Test);
  Result := Test.SomeText;
end;

// funktioniert nicht
function GetSomeBitmap(AMyKey: string): TBitmap;
var
  Test: TTest;
begin
  Test := TTest.Create;
  FDD.TryGetValue(AMyKey, Test);
  Result := Test.SomeBitmap;
end;
Alle Keys des Dictionary erscheinen in einer ListBox. Desweiteren existiert ein TMemo und ein TImage.
Ein Eintrag in der ListBox soll ausgewählt werden. SomeText soll im TMemo und SomeBitmap im TImage angezeigt werden.
Delphi-Quellcode:
unit VCL_1;
...
procedure ListBoxOnClick;
var
  MyBitmap: TBitmap;
begin
  if MyListBox.ItemIndex > -1 then
  begin
    MyMemo.Text := pSomeText[MyListBox.Items[MyListBox.ItemIndex]]; // funktioniert
    ...
    MyBitmap := TBitmap.Create;
    MyBitmap := pSomeBitmap[MyListBox.Items[MyListBox.ItemIndex]]; // funktioniert nicht
  end;
end;
SomeText wird richtig aus dem Dictionary geladen und angezeigt.
SomeBitmap nicht. Im TImage ist nur ein 16x16 Pixel großes schwarzes Viereck zu sehen, egal welche Größe das Bild in der DB hat.
Ich hab Ewigkeiten rumgesucht, auch hier im Forum. Eventuell hab ich auch einfach nicht die richtigen Suchbegriffe gewählt.
ChatGPT hat auch keine hilfreichen Antworten.
Direkt nachdem ich einen Eintrag zum Dictionary hinzugefügt habe, habe ich mir testweise die Abmessungen der Bitmap des letzten Eintrags des Dictionary ausgeben lassen.
Die Höhe und Breite der Bitmap stimmen mit denen in der DB überein.
Erst wenn ich an einer späteren Stelle im Programm über die property das Bitmap holen will, tritt das Fehlverhalten auf und die Abmessungen betragen 16x16.
Vielleicht hab ich einen grundlegenden Denkfehler.
Ich weiß jedenfalls nicht mehr weiter.

Hat eventuell von euch jemand eine Idee?

Gruß
Kratos
  Mit Zitat antworten Zitat