AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TDictionary Zugriff über property

Ein Thema von Kratos · begonnen am 20. Dez 2023 · letzter Beitrag vom 20. Dez 2023
 
Kratos

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

TDictionary Zugriff über property

  Alt 20. Dez 2023, 10: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
 

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz