OleContainer e getirilen word dosyasını FireBird e kaydetme,kaydedileni (Word) çağırma,düzeltme Rastladığım bazı forum larda Word dosyasının veritabanına kaydı ile ilgili bazı arkadaşlar imkansız yazmışlar, bu konuyla ilgili çok sorularla karşılaştım. Umarım ilgilenen arkadaşların işine yarar.
Bu kodlarla word dosyasını veritabanına ekleyebilir, tekrar wordde açarak düzeltebilirsiniz.
//OleContainer in olduğu forma linkleyelim....
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Application.CreateForm(TForm2, Form2);
Form2.OleContainer1.DoVerb(ovShow);
Form2.ShowModal;
end;
Bu linke tıkladığınızda direkt (olecontaineri word olarak ayarladığınızı ve ben AllowActiveDoc=False , AllowInPlace=False yaptım ki word ayrı bir sayfada karşıma çıksın.
Word uygulamasına birşeyler yazıp çizip kaydet deyip çıktık, Burada yaptığımız işlemler formumuzda bulunan olecontainer1 içerisine geldi...
Şimdi bu içerisindeki bilgileri veritabanımıza (Firebird - Blob alan) kaydediyoruz.procedure TForm2.BitBtn6Click(Sender: TObject);
var
Buf : String;
Uzunluk : Integer;
TempStream : TMemoryStream;
begin
dm.TSORU.Open; // dm - DataModule ye verilen name - isim
dm.TSORU.Insert; // TSORU ise IBTable mize verdiğimiz isim
TempStream := TMemoryStream.Create;
OleContainer1.SaveToStream( TempStream );
TempStream.Position := 0;
Uzunluk := TempStream.Size;
SetLength(Buf,Uzunluk+1);
TempStream.Read(Buf[1],Uzunluk);
dm.TSORU.FieldValues['RDOS']:=Buf;// RDOS blob alan ismi
dm.TSORU.Post;
TempStream.Free;
end;
// TSORU tablesiyle ilgili yaptıklarımı da yazayım da belki eleştiri gelir. procedure Tdm.TSORUBeforeOpen(DataSet: TDataSet);
begin
if not IBDatabase1.Connected=True then
IBDatabase1.Connected:=True;
if IBTransaction1.Active=False then
IBTransaction1.Active:=True;
end;
procedure Tdm.TSORUAfterPost(DataSet: TDataSet);
begin
IBTransaction1.CommitRetaining;
end;
// insert esnasında otomatik artan için sp yi tetikleyelim... procedure Tdm.TSORUBeforePost(DataSet: TDataSet);
begin
IF (TSORU.State=dsInsert) AND (TSORU.FieldByName('SORU_ID').IsNull) then
begin
TSORU.FieldByName('SORU_ID').AsInteger:=0;
IbStoredProc2.Prepare;
IbStoredProc2.ExecProc;
TSORU.FieldByName('SORU_ID').AsInteger:=IbStoredProc2.ParamByName('ID').AsInteger;
end;
end;
Şimdide veritabanından bu dosyayı çağıralım ve wordde tekrar düzenleme yapalım. procedure TForm2.BitBtn8Click(Sender: TObject);
var
Buf : String;
Uzunluk : Integer;
TempStream : TMemoryStream;
begin
TempStream := TMemoryStream.Create;
Buf:=dm.TSORU.FieldValues['RDOS'];
Uzunluk := Length(Buf);
TempStream.SetSize(Uzunluk+1);
TempStream.Write(Buf[1],Uzunluk);
TempStream.Position := 0;
OleContainer1.LoadFromStream( TempStream );
TempStream.Free;
end;
//ve
//tekrar wordde düzenleme yapalım procedure TForm2.BitBtn3Click(Sender: TObject);
begin
OleContainer1.DoVerb(ovShow);
end;
//evet düzenleme yapabiliyoruz. Veritabanına kayıt için yukarıda insert yerine edit yapalım.... Yani;
procedure TForm2.BitBtn9Click(Sender: TObject);
var
Buf : String;
Uzunluk : Integer;
TempStream : TMemoryStream;
begin
dm.TSORU.Open;
dm.TSORU.Edit;
TempStream := TMemoryStream.Create;
OleContainer1.SaveToStream( TempStream );
TempStream.Position := 0;
Uzunluk := TempStream.Size;
SetLength(Buf,Uzunluk+1);
TempStream.Read(Buf[1],Uzunluk);
dm.TSORU.FieldValues['RDOS']:=Buf;
dm.TSORU.Post;
TempStream.Free;
end;