Datei vom VST (VirutalSringTree) in die
DB speichern.
Delphi-Quellcode:
type
TODocuments =
class
private
//
public
id :
String;
docType : Integer;
doc : TStream;
docFileStream :
String;
// nur für DB Speicherung erforderlich
docFileName :
String;
docExt :
String;
docComment :
String;
deletedRecord : Boolean;
...
procedure Tfrm_task.tbtn_menu_saveClick(Sender: TObject);
var
ts, myFileStream : TStream;
begin
if frm_main.ConnectToSQLServer = False
then // Datenbankverbindung herstellen
Exit;
...
Document := TODocuments(vst_task_documents.GetNodeData(curNode)^);
ts := DSData.CreateBlobStream(DSData.FieldByName('
doc'), bmWrite);
try
ts.Seek(0, soFromBeginning);
myFileStream := TFileStream.Create(Document.docFileStream, fmShareDenyWrite);
ts.CopyFrom(myFileStream, myFileStream.Size);
myFileStream.Free
except
on E:
Exception Do
begin
MessageDlg('
Es ist ein Fehler aufgetreten beim Speichern der Dokumente. ' + #13 +
E.
Message, mtError, [mbOK], 0);
Exit;
end;
end;
ts.Free;
DSData.Post;
DSData.Close;
frm_main.SQLConnection.Connected := False;
// Datenbankverbindung trennen
...
end;
Daten aus
DB in das VST laden
Delphi-Quellcode:
procedure Tfrm_task.SQLDataToVST_Documents;
var
i : Integer;
Doc : TODocuments;
taskbook_id : String;
ts : TStream;
begin
if frm_main.ConnectToSQLServer = False then // Datenbankverbindung herstellen
Exit;
if lbl_task_id.Caption = '' then
taskbook_id := '-1' // damit nichts ausgewählt und angezeigt wird für neue Auträge
else
taskbook_id := lbl_task_id.Caption;
DSData.Close;
DSData.CommandText := 'select * from taskbook_documents where taskbook_id = ' + QuotedStr(taskbook_id) + ' order by docType';
DSData.Open;
DSData.First;
vst_task_documents.BeginUpdate;
vst_task_documents.Clear;
for i := 0 to DSData.RecordCount - 1 do
begin
Doc := TODocuments.Create;
with Doc do
begin
id := DSData.FieldByName('id').AsString;
docType := DSData.FieldByName('docType').AsInteger;
if DSData.FieldByName('doc').IsBlob then
begin
ts := DSData.CreateBlobStream(DSData.FieldByName('doc'), bmRead);
doc := ts;
ts.Free;
end;
docFileStream := '';
docFileName := DSData.FieldByName('docFileName').AsString;
docExt := DSData.FieldByName('docExt').AsString;
docComment := DSData.FieldByName('docComment').AsString;
end;
vst_task_documents.AddChild(nil, Doc);
DSData.Next;
end;
vst_task_documents.EndUpdate;
DSData.Close;
frm_main.SQLConnection.Connected := False; // Datenbankverbindung trennen
end;
Doppelklick auf VST, um die Datei(z.B. PDF) anzuzeigen.
Delphi-Quellcode:
procedure Tfrm_task.vst_task_documentsDblClick(Sender: TObject);
var
Document : TODocuments;
curNode : PVirtualNode;
folder : string;
fileName : String;
ts : TStream;
ms: TMemoryStream;
begin
curNode := vst_task_documents.FocusedNode;
if not Assigned(curNode) then
begin
MessageDlg('Bitte ein Dokument auswählen.',mtInformation, [mbOK], 0);
Exit;
end;
Document := TODocuments(vst_task_documents.GetNodeData(curNode)^);
fileName := 'c:\'+Document.docFileName+Document.docExt;
ts := TStream.Create;
ts.CopyFrom(Document.doc, Document.doc.Size); // ==> hier bricht das Programm ab, siehe Anhang
ts.Position := 0;
ms := TMemoryStream.Create;
ms.LoadFromStream(ts);
ms.SaveToFile(fileName);
ms.Free;
ts.Free;
folder := ExtractFileDir(fileName);
ShellExecute(0, 'open', PChar(fileName), nil, PChar(folder), SW_NORMAL );
end;
Wenn ich beim Laden der Daten aus der
DB die Routine beim Doppelklick verwende, werden die Dokumente erstellt.
Kann ich nicht aus dem TStream Feld des VST die Datei erstellen?
Die Materie ist neu für mich und ich bin froh, dass ich die Daten speichern und laden kann. Jetzt möchte ich nur noch die Daten in der VST Struktur haben und nur wenn ein Anwender auf das Dokument klick, soll es erzeugt werden.
Danke im Voraus.
Sven