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