Delphi - Bild aus Datenbank an TL25_ Komponente übergeben

Wie kann ich ein Bild, das in einer PostgreSQL-Datenbank in einen BYTEA-Feld gespeichert ist, direkt an die Komponente TL25_ übergeben?

Herzlich willkommen im List & Label Forum.
Welche VCL Komponente wird hier verwendet, die FireDAC oder die BDE?

Ich arbeite mit der BDE-Komponente, weil ich die Erfahrung gemacht habe, dass die FireDAC-Komponente wohl nicht mit meinen Devart-DAC’s arbeiten will. Oder arbeite Devart auch mit der neuen FireDAC-Komponente zusammen? Leider kann ich noch wenig dokumentation über die neue L&L FireDAC Komponente finden.

Danke für die Info, könnten Sie noch detaillierter beschreiben was Sie genau benutzen, also welche Komponente wird für die Verbindung verwendet, welche für die Table/Query etc.
Verwenden Sie die BDE DataBinding Komponente (TDBl25_) oder nur die Komponente (TL25_), falls nicht die DataBinding Komponente ist, wie übergeben Sie die Daten genau an List & Label.

Zu Ihrer Frage bzgl. FireDAC, hierzu kann ich nicht direkt eine Antwort geben, auch hier würde ich weitere Informationen benötigen, z.B. welche Komponente wird hier verwendet, ist es die UniDAC oder eine andere.

Wie Sie sehen ist hier noch ein größerer Informationsaustausch nötig, daher würde ich empfehlen einen Supportcase zu diesem Thema zu öffnen, im Supportportal gibt es weitere Möglichkeit für den Austausch von Daten bzw. Informationen, vielen Dank.

Ich verwende seit L&L Vers. 6 die nicht datengebundene Komponente TL25_ mit einem Code wie folgt:

For i:= 0 to (tbSets.FieldCount - 1) do begin
L25_SetDataSheet.LlDefineVariableFromTField(tbSets.Fields[i]);
end;
//---------------------------------- Datamatrix-Code des Sets übergeben
L25_SetDataSheet.LlDefineVariableExt(‘set_code_datamatrix’,tbSets.FieldByName(‘set_code’).AsString ,LL_BARCODE_DATAMATRIX);

Von den Devart-Komponenten verwende ich projektspezifisch sowoh UNIDAC, SDAC, IBDAC, PgDAC und auch LiteDAC.

Dann müssten Sie das Bild - Handle der Grafik für die Anmeldung verwenden, hier mal ein Beispielcode (Variablen) für ein Metafile und ein Bitmap.

LL.LlDefineVariableExtHandle('Picture', BufferImage.picture.bitmap.handle,
   LL_DRAWING_HBITMAP)

LL.LlDefineVariableExtHandle('Picture', BufferImage.picture.metafile.handle,
   LL_DRAWING_HEMETA);

Dieses Beispiel ist aus dem von uns mitgelieferten Picture Beispiel, dieses finden Sie im “LL26\Beispiele\Delphi\BDE (Legacy)\Samples\Picture Example” Ordner.

Naja …

D: Diese Demo zeigt die Übergabe von Grafikobjekten an List && Label <<<
In dem Sample ist aber kein DataSet enthalten. Was meine ursprüngliche Frage betrifft.
Die Übergabe des Bildes erfolgt aus einem Image-Objekt und nicht aus einem Datenbank-Feld.
Insofern hilft mit der Lösungansatz weiter.
Eigentlich bevorzuge ich L&L seit Version 6 aber ich habe auch immer noch FastReport in der neuesten Version verfügbar. Dort sind ist ein Report mit Bildern aus Datenbankfeldern genauso einfach wie Textobjekte. Schade. L&L hat den besseren Designer. Aber FastReport anscheinend die bessere Datenbankschnittstelle.
Darüberhinaus läuft das Sample nicht, weil die beiden Bilder bei der Installation in ein anderes Verzeichnis kopiert werden, als vom Sample gebraucht.
Sorry habe seit einigen Jahren den Eindruck, die Delphianer sind nicht mehr ganz so wichtig bei Combit.

Insofern hilft mit der Lösungansatz weiter. <<<
Sollte natürlich heissen, dass mit der Lösungsansatz nicht weiterhilft!

Sie müssen die Bilder aus Ihrer Datenbank holen und z.B. in einem Stream oder auf dem File System speichern und wie beschrieben das Handle der Grafik übergeben.
Wie Sie das Bild holen, speichern liegt in Ihrer Hand bzw. ist Abhängig von der Logik der Anwendung.

Ich habe Ihnen mal den Beispiel-Code aus unserer Komponente hier reingepackt, dort sehen wie diese es macht, analog dazu können Sie Ihren Code aufbauen.
Auszug aus der
LLDataSetDataProvider.pas >TTFieldTableColumn.Create

      ftGraphic, ftBlob:
        Begin
          Try
            PictureStream := Field.DataSet.CreateBlobStream(Field, bmRead);
            if PictureStream <> Nil then
            Begin
              PictureStream.Seek(0, soBeginning);
              if PictureStream.Size > 0 then
                begin
                  wic := TWICImage.Create;
                  try
                  wic.LoadFromStream(PictureStream);
                  except on e: EInvalidGraphic do
                    begin
                    try
                    //special handling for northwind pictures
                      PictureStream.Position:= 78;
                      wic.LoadFromStream(PictureStream);
                      //if the blobcontent is not a image we create one empty
                         except on e: EInvalidGraphic do
                         begin
                          FFieldType:=LL_DRAWING_HBITMAP;
                          FHandle:= 0; exit;
                         end;
                    end;
                  end;
                end;
                PicContainer := FProvider.FImageStorage.AddItem;
                PicContainer.Bitmap.Assign(wic);
                if PicContainer.Graphic is TMetafile then
                begin
                  FFieldType:=LL_DRAWING_HMETA;
                  FHandle:=PicContainer.Metafile.Handle;
                end
                else if PicContainer.Graphic is TBitmap then begin
                  FFieldType:=LL_DRAWING_HBITMAP;
                  FHandle:=PicContainer.Bitmap.Handle;
                end
                else if PicContainer.Graphic is TIcon then begin
                  FFieldType:=LL_DRAWING_HICON;
                  FHandle:=PicContainer.Icon.Handle;
                end;
              end;
            end;
          finally
            if Assigned(wic) then
            begin
              FreeAndNil(wic);
            end
            else
            begin
              FFieldType := LL_TEXT;
              if not(Field.IsNull)then FFieldContent := Field.AsString;
            end;
            if Assigned(PictureStream) then FreeAndNil(PictureStream);

          end;
        End;

Im Beispiel-Code ist noch eine Sonderbehandlung für die NorthWind Datenbank Bilder eingefügt.

Falls das hier nicht helfen sollte, würde ich Sie an dieser Stelle bitten einen Supportcase über das Supportportal zu öffnen, dort können Sie uns auch ein kleines Sample bereitstellen, welches wir im Detail untersuchen können, vielen Dank.

Sorry, das mag ja funktionieren. Aber das ist weder RAD noch Low-Code.
Jetzt weiss ich warum FastReport “Fast” heisst.
Eine so teuere Report-Komponente wie L&L sollte hier einfachere Möglichkeiten bereitstellen.
Vielleicht fällt für Delphianer auch mal wieder was ab in einer der nächsten Versionen.
Nix für ungut.

Sie könnten die Routine TL26_.ConvertTField(…) hierhingehend anpassen, diese wird ja von der LlDefineVariableFromTField() Methode aufgerufen.

Hier ist mal die abgespeckte Version vom oben gezeigtem code, Fehlerhandling und Freigabe der Bilder etc. müssten noch angepasst werden.

  PictureStream: TStream;
  wic  : TWICImage;
  PicContainer  : TPicture;
  FFieldType: Integer;
  FHandle   : Cardinal;

PictureStream := Field.DataSet.CreateBlobStream(Field, bmRead);
  if PictureStream <> Nil then
    Begin
      PictureStream.Seek(0, soBeginning);
      if PictureStream.Size > 0 then
        begin
          wic := TWICImage.Create;
          wic.LoadFromStream(PictureStream);
           PicContainer := TPicture.Create();
           PicContainer.Bitmap.Assign(wic);
           if PicContainer.Graphic is TMetafile then
                begin
                  FFieldType:=LL_DRAWING_HMETA;
                  FHandle:=PicContainer.Metafile.Handle;
                end
           else if PicContainer.Graphic is TBitmap then begin
                  FFieldType:=LL_DRAWING_HBITMAP;
                  FHandle:=PicContainer.Bitmap.Handle;
                end
            else if PicContainer.Graphic is TIcon then begin
                  FFieldType:=LL_DRAWING_HICON;
                  FHandle:=PicContainer.Icon.Handle;
                end;
        end;
    End;
//mögliche Übergabe.
L26_1.LlDefineVariableExtHandle('Photo',FHandle, FFieldType);

Ob es jedoch noch eine generelle Anpassung und Erweiterung dazu in der BDE Legacy-Komponente geben wird, können wir zu diesem Zeitpunkt leider noch nicht sagen, da der Fokus auf der aktuellen FireDAC-Komponente liegt. Da die Sourcen der jeweiligen Komponenten stets mitgeliefert werden, kann eine Anpassung nach eigenen Bedürfnissen immer selbst durchgeführt werden. Dennoch werden wir prüfen lassen, ob es hierzu in der BDE Legacy-Komponente Anpassungen für eine der zukünftigen Versionen von List & Label geben wird. Im Idea Place (https://forum.combit.net/c/idea-place/7) hier im Forum, können Sie die gewünschte Anforderung gerne zusätzlich einreichen und von der Community up-voten lassen, um damit die Wichtigkeit zu unterstreichen. Vielen Dank für das Verständnis.