2016-08-31 1 views
3

Verwenden von XE8. Devex TcxGrid mit einer Spalte, die Blobdaten mit PopupEditProperties und PopupControl = einem TOleContainer-Steuerelement darstellt. Diese Spalte stellt ein Datenbankfeld (BlobType) für verschiedene Datentypen (Bilder, PDF, Word, Excel, mpg, avi, mp3, ppt, etc.)Blob-Inhalt in OleContainer Delphi anzeigen

Wenn OnInitPopup Ereignis von PopupEditProperties Feuer ich dies möchte tun:

var 
    MS: TMemoryStream; 
    OC: TOleContainer; 
begin 
    if not Query1.FieldByName('data').isNull then begin 
    OC := TcxPopupEditProperties(cxGrid1DBTableView1Data.Properties).PopupControl as TOleContainer; 
    //Size of Container 
    with OC do begin 
     Parent := TcxPopupEdit(Sender).PopupWindow; 
     Left := 5; 
     Top := 5; 
     Width := cxGrid1DBTableView1.Controller.FocusedColumn.Width; 
     Height := 300; 
    end; 
    MS := TMemoryStream.Create; 
    try 
     TBlobField(Query1.FieldByName('data')).SaveToStream(MS); 
    // I Want show the content with appropiate application 
     OC.LoadFromStream(MS); // here crashes 
    finally 
     MS.Free; 
    end; 
    end; 
end; 

Ungültige Stream-Format Nachricht wird ausgelöst. Welches ist das beste Thema dafür?

Antwort

4

TOleContainer verwendet ein eigenes Format mit LoadFromStream/SaveToStream. Ich nehme an, dass Ihr DB-Blob die ursprünglichen Dateidaten enthält. Sie müssen TMemoryStream in eine temporäre Datei speichern und dann CreateObjectFromFile anrufen.

Eine andere Option ist, diese Lösung zu verwenden: Load a TOleContainer from a stream which contains a file image, without using CreateObjectFromFile (Ich würde persönlich die benötigten privaten Mitglieder hacken und schrieb ein Stand-Alone-Verfahren, aber es wäre Version abhängig).

Anscheinend ist die oben „Lösung“, die ich angenommen richtig waren nicht funktioniert und nicht mit "%1 already exists" EOleSysError Ausnahme, wie Sie in Ihren Kommentaren erwähnt.

Also, AFAIK einzige Möglichkeit ist es, eine temporäre Datei mit einer richtigen Erweiterung zu verwenden. Die Erweiterung wird benötigt, um festzustellen, welche OLE-Serveranwendung die Datei verarbeitet. Jede dieser Erweiterungen ist auf Ihrem Computer in HKEY_CLASSES_ROOT registriert. IMO, müssen Sie müssen den Dateityp in der DB speichern. Wie würde Ihre Anwendung später wissen, um welchen Typ es sich handelt? Der einzige Weg wäre, den Stream/Blob Signatur (die nicht 100% genau sein könnte) zu untersuchen.

+0

Ich unbekannte den Dateityp, alles muss hinzugefügt werden: Videos, Dokumente, XLS, PDFs, Bilder aus einer Datei oder Einfügen aus der Zwischenablage ... Ich testete "LoadAsDocument" als Beispiel sagt, aber ein EOleSysError löst "% 1 ist bereits vorhanden“... :( – NizamUlMulk

+1

' OleCheck (StgOpenStorageOnILockBytes (FLockBytes, nil, STGM_READWRITE oder STGM_SHARE_EXCLUSIVE, null, 0, FStorage)); ' Hier wirft – NizamUlMulk

+0

Sie sind richtig ich die Lösung ist, ohne es genau angenommen zu testen. . – kobik

2

Sie können das RAW-Dateiformat nicht direkt in TOleContainer laden. Dieser Stream muss im speziellen OLE-Format sein. Deshalb haben Sie den Fehler "Ungültiges Stream-Format" erhalten.

Als Workaround können Sie Ihr BLOB in eine temporäre Datei mit der entsprechenden Dateierweiterung speichern. Zum Beispiel: c: \ temp \ image.gif Und als es in TOleContainer wie folgt laden:

OC.CreateObjectFromFile('c:\temp\image.gif', false); 

Edit: Wenn Sie nicht unbedingt Dateiformat kennen, können Sie es erkennen! Zum Beispiel können Sie Marco Pontellos TriID-Bibliothek versuchen. Also zuerst das Dateiformat erkennen und es im temporären Ordner speichern und dann in OC laden.

+0

Ich muss die Anwendung dann ändern ...., danke – NizamUlMulk