Olecontainer de görüntüyü image ve doc olarak FB e kaydetmek

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
menderes

Olecontainer de görüntüyü image ve doc olarak FB e kaydetmek

Mesaj gönderen menderes »

Bu konulara benzer forumda 4 konu buldum ama istediğim sonuçlar yok,
SORUM: olecontainer e word sayfası açarak burada yazılmak istenenleri yazıp save ettim. Yazılanlar olecontainer içerisine geldi.
Şimdi olecontainerdeki bu uygulamayı image nesnesinin içerisine resim olarak koyalım;
Sonra da resim olarak veritabanına ve ayrıca da doc olarak veritabanına nasıl kayıt edebiliriz.

Yine düzenleme için açmak istediğimizde yine resim ve doc olarak işlem yapabilelim....Bir haftadır uğraşıyorum...
Yardımlarınızı bekliyorum. Herkesten Allah razı olsun.......
En son menderes tarafından 19 Eki 2005 06:44 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
menderes

Mesaj gönderen menderes »

Ben uzun aramalar ve denemelerden sonra bir şeylere ulaşabildim, bunu da paylaşmak isterim belki bir arkadaşın işine yarar.
Şimdilik, OleContainer 'e word den gelen bilgiyi veritabanına (FireBird) kayıt edip tekrar işlemek ve düzeltmek için veritabanından çağırma işlemini yapabildim. Daha sonra resim olarak kaydetme işinide az kaldı yapacağım inşaallah...
Şurdan başlayalım

Kod: Tümünü seç

//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.

Kod: Tümünü seç

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
TSORU.ApplyUpdates;
 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.

Kod: Tümünü seç

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;

Kod: Tümünü seç

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;
Aramalarımda word dosyasının veritabanına kayıtı olmaz falan gibi bir şeyler deniliyordu... Acaba arkadaşlar bu yaptığım işlemde bir yanlışlık varmı yokmu veya başka bir öneriniz varmı,
Birde Firebird de TBlobStream kullanamadım, BDE de oluyor. DBTable usese eklenirse, ben BDE kullanmıyorum. FireBird de TBlobstream yerine ne kullancağım şu an bilmiyorum, Artık deneyeceğiz, sorum da bir tek resim olarak kaydetme kaldı onuda hallederiz herhalde......Forumda benzer blob alan ile ilgili açıklamalar vardı ama onları tutturamadım..
Firebirdd e yukarıdaki işlemin devamı olarak resim kaydetme ile ilgili örnek verecek bir arkadaş varsa lütfen bekliyorum....
Şimdiden teşekkür ederim.....
menderes

resim kaydetme blob alana FB de

Mesaj gönderen menderes »

Neyse ben bir yerlerden buldum ve ayarladım resim kaydetme işlemini, sizlerle paylaşmak istedim. Sorum da cevaplanmış oldu, ilgilenen arkadaşlara duyurulur.

Kod: Tümünü seç

function GetDcAsBitmap(DC: HDC; Bitmap: TBitmap; W, H: Cardinal): Boolean;
var
  hdcCompatible: HDC;
  hbmScreen: HBitmap;
begin
  Result := False;
  if DC = 0 then Exit;
  hdcCompatible := CreateCompatibleDC(DC);
  hbmScreen := CreateCompatibleBitmap(DC, W, H);
  if (hbmScreen = 0) then Exit;
  if (SelectObject(hdcCompatible, hbmScreen)=0) then Exit;
  if not(BitBlt(hdcCompatible, 0,0, W, H, DC, 0,0, SRCCOPY)) then 
    Exit;
  Bitmap.Handle := HbmScreen;
  Bitmap.Dormant;
  Result := True;
end;

function GetScreenAsBitmap(Bitmap: TBitmap): Boolean;
var ScreenDC: HDC;
begin
  ScreenDC := CreateDC('DISPLAY', NIL, NIL, NIL);
  Result := GetDCAsBitmap(ScreenDC, Bitmap,
                          GetDeviceCaps(ScreenDC, HORZRES),
                          GetDeviceCaps(ScreenDC, VERTRES)
            );
end;

function GetWindowAsBitmap(const WindowName: string; 
        Bitmap: TBitmap): Boolean;
var Wnd: HWnd;
    Rect: TRect;
begin
   Wnd := FindWindow(nil, PChar(WindowName));
   GetWindowRect(Wnd, Rect);
   Result := GetDCAsBitmap(GetWindowDC(Wnd), Bitmap, 
             Rect.Right - Rect.Left, Rect.Bottom - Rect.Top);
end;

function GetWindowAsBitmap(Wnd: HWnd; Bitmap: TBitmap): Boolean;
var
  Rect: TRect;
begin
  GetWindowRect(Wnd, Rect);
  Result := GetDCAsBitmap(GetWindowDC(Wnd), Bitmap, 
            Rect.Right - Rect.Left, Rect.Bottom - Rect.Top);
end;
Bu fonksiyonları başka bir yerden aldım; aynı zamanda tüm ekranı resim olarak alabilirsiniz.
GetScreenAsBitmap(Image1.Picture.Bitmap); //yazarak
Şimdi bizim soru ile alakalı kısma gelelim.
Yukarıda bahsetmiştik bir olecontainerimiz vardı ve buraya word den bir veri getirmiştik. Bu veriyi word olarak veritabanına kaydetmeyi, düzeltmeyi bahsetmiştik. Kalan ise bu olecontainerdeki verinin resim olarak image ye ve veritabanına kayıt işlemi idi.
Aşağıdaki kodla image1 içerisine veriyi resim olarak alabiliyoruz.

Kod: Tümünü seç

procedure TForm1.BitBtn4Click(Sender: TObject);
begin
GetWindowAsBitmap(OleContainer1.Handle, Image1.Picture.Bitmap);
end;
Aynı şekilde veritabanına kayıt etmek için (burada FireBird kullanıldı)

Kod: Tümünü seç

uses e JPEG eklemeyi unutmayın....
procedure TForm1.BitBtn7Click(Sender: TObject);
var 
  aMS: TMemoryStream; 
begin 
  if not (Image1.Picture.Graphic is TJPEGImage) then
    Image1.Picture.Graphic := TJPEGImage.Create;
GetWindowAsBitmap(OleContainer1.Handle, Image1.Picture.Bitmap);
   
  aMS := TMemoryStream.Create;
  try 
    Image1.Picture.Graphic.SaveToStream(aMS); 
    dataModule1.IBTable1.Edit;
       aMS.Position := 0;  
    TBlobField(dataModule1.IBTable1.FieldByName('RESIM')).LoadFromStream(aMS);
    dataModule1.IBTable1.Post;
   finally 
    aMS.Free; 
  end; 
end;
Bu sayede veritabanına hem word dosya olarak hemde resim olarak kayıt işlemini gerçekleştirmiş olduk. Ama veritabanı çok şişecek herhalde bakalım 10.bin kayıtta kaç megabayt olacak. Tahmin ediyorum resimleri dışarı koyacağız herhalde. Neyse bir fikri olan arkadaş varsa sevinirim. Çünkü ben resimleri hep dışarıda tutardım bu ilk olacak bakalım nereye varacak......Herkese saygılar ve kolay gelsin....Bu foruma katkısı olan tüm arkadaşlardan Allah C.C Razı olsun........
Kullanıcı avatarı
tolgaozb
Üye
Mesajlar: 70
Kayıt: 26 Ara 2003 12:22
Konum: Karşıyaka
İletişim:

Mesaj gönderen tolgaozb »

Database'deki image ya da blob alandaki veriyi yeniden dosya olarak açma konusunda bir çalışman oldu mu ? Yani ben image alana diyelim ki deneme.jpg dosyasını gönderdim.Daha sonra bu alandan bu bilgiyi alıp örneğin c:\deneme.jpg şeklinde kaydetmek (oluşturmak) istiyorum.Bunun yöntemi nedir?
T.Tolga Özbaltalar - http://www.veridizayn.com
menderes

Mesaj gönderen menderes »

image1 e getirilen resimi nasıl kaydetiyorsanız o şekilde kaydedebilirsiniz..
JPEG için uses e JPEG eklersiniz.
Kullanıcı avatarı
Commandx
Üye
Mesajlar: 181
Kayıt: 01 Oca 2008 05:34

Re: Olecontainer de görüntüyü image ve doc olarak FB e kaydetmek

Mesaj gönderen Commandx »

Şu anda inanılmaz derecede bana da lazım oldu, Olecontainer nesnesini de bir ara gözden geçireceğim pdf doc xls kaydı, Kalsın burda lazım olacak..

Binary Bloba PDF veya dosya Yükleme

Kod: Tümünü seç

procedure TForm1.RzBitBtn3Click(Sender: TObject);
VAR
BLOB:TSTREAM;
FS:TFILESTREAM;
  BEGIN
 UniQuery1.Edit;
blob := UniQuery1.CreateBlobStream(UniQuery1.FieldByName('PDF'), bmWrite); // PDF = VERİTABANINDAKİ PDF BLOB ALANI
try
  blob.Seek(0, soFromBeginning);
  fs := TFileStream.Create('c:\TEST_DOSYASI.PDF', fmOpenRead);
    blob.CopyFrom(fs, fs.Size);
    fs.Free ;
  blob.Free ;
   UniQuery1.POST;
except
 Application.MessageBox('Hata oluştu','Hata',MB_OK+MB_ICONERROR);
end;
end;


Blobdan Binary Olarak yüklenmiş Dosyanın extract edilmesi

Kod: Tümünü seç


procedure TForm1.RzBitBtn2Click(Sender: TObject);
VAR
BLOB:TSTREAM;
FS:TFILESTREAM;
  BEGIN
blob := UniQuery1.CreateBlobStream(UniQuery1.FieldByName('PDF'), bmRead);
try
  blob.Seek(0, soFromBeginning);
  with TFileStream.Create('c:\extract_from_db_TEST_DOSYASI.PDF', fmCreate) do
    try
      CopyFrom(blob, blob.Size)
    finally
      Free
    end;
finally
  blob.Free
end;
END;

http://www.delphibasics.co.uk/RTL.asp?Name=DaysBetween
http://www.neonhaber.com/Static/mega-co ... index.html
www.delphican.con
Function PARSE( text, ilk, son:String ): String; //
begin
Delete(Text, 1, pos(ilk, Text) + Length(ilk)-1);
Result := Copy(Text, 1, Pos(Son, Text)-1);
end;
Cevapla