Delphi5.0' da Access OLE fieldin gösterilmesi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Archimed
Üye
Mesajlar: 14
Kayıt: 29 Nis 2004 10:35

Delphi5.0' da Access OLE fieldin gösterilmesi

Mesaj gönderen Archimed »

Arkadaşlar Merhaba...

Access veritabınımda excel ve word documanlarını gömdüğüm bir OLE field' ım var. Delphi5.0 da hazırlayacağım bir programda bu ole field' in içeriğini nasıl gösterebilirim? mevcut componentlerin dışında başka componetlere mi ihtiyacım var?
Archimed
Üye
Mesajlar: 14
Kayıt: 29 Nis 2004 10:35

Mesaj gönderen Archimed »

accessdeki bir OLE field içindeki excel' dosyasını delphide açmanın bir yolu yok mu yani? :cry: :cry: :cry:
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Selamlar...

- Denemedim ama yaptığım minik bir araştırma sonucu şunu buldum... Kulağa mantıklı geliyor, dilersen bir dene.

- Ref: http://www.elists.org/pipermail/delphi- ... 02594.html

Kod: Tümünü seç

var
   S: TMemoryStream;
begin
   S := TMemoryStream.Create;
   try
      tblTo.Edit;
      TBlobField( tblFrom.FieldByName('Document') ).SaveToStream( S );
	S.Position := 0;          				//  <== add this line.
      TBlobField( tblTo.FieldByName('Document') ).LoadFromStream( S );
      tblFrom.Post;
   finally
      S.Free;
   end;
end;
Resim
Resim ....Resim
Archimed
Üye
Mesajlar: 14
Kayıt: 29 Nis 2004 10:35

Mesaj gönderen Archimed »

merhaba...
öncelikle ilginiz için teşekkür ederim.

bu kod anladığım kadarıyla bir tablodaki blob field' i diğer bir tabloya kopyalıyor; ancak yapmak istediğim buradaki bilgiyi form üzerinde göstermek. OleConteiner componenti yada uygun olabilecek başka bir component.

aşağıdaki kodu

Kod: Tümünü seç

OleContainer1.LoadFromStream(S);


şeklinde değiştirsem belki faydası olabilir. Şu anda deneme imkanım yok ama akşam eve gittiğimde ilk iş bunu denemek olacak.
Archimed
Üye
Mesajlar: 14
Kayıt: 29 Nis 2004 10:35

Mesaj gönderen Archimed »

denedim ama yapamadım.. :cry:
sonra aşağıdaki gibi birşey denedim :

Kod: Tümünü seç

tblobfield(adotable1.fields[0]).savetofile('c:\' + adotable1.Fields[1].value + '.doc' );
orjinal dosyadan daha büyük bir dosya kaydetti. sanırım dosyanın başına fazladan 1-2 Kb' lik bir şeyler ekledi.. Orjinal dosyayı ayırmanın bir yolu var mıdır?
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Kusura bakma denemediğim için net bişi yazamıyorum... Sadece arama yapıp bulduklarımı sunabiliyorum...

- Bir forumda da şöyle geçmiş... {Noktalı} yerde ekrana yansıtma olayını gerçekleştirirsin...
ref : http://groups.google.com.tr/groups?hl=t ... 013.z2.ftn

Kod: Tümünü seç

var
 OLE : TOLEContainer;
 TBS : TADOBLOBStream;
begin
 OLE:=TOLEContainer.Create(Self);
 OLE.Parent:=Self;
 TBS:=TADOBLOBStream.Create(TBLOBField(ADOTable1.fields[0]), bmRead);
 OLE.LoadFromStream(TBS);
 TBS.Free;
 {...}
 OLE.Free;
end;
Resim
Resim ....Resim
Archimed
Üye
Mesajlar: 14
Kayıt: 29 Nis 2004 10:35

Mesaj gönderen Archimed »

tekrar merhaba...
bu konu çok uzadı biliyorum ama yukardaki kodlarda

Kod: Tümünü seç

 OLE.LoadFromStream(TBS);  
satırında Invalid Stream Format. hatası veriyor. Bu blob field'deki verinin gerçek dosya boyutundan daha büyük olması ile ilgili olabilir mi? Acaba verileri okurken Stream.Position değeri 0' dan büyük mü olmalı? öyle ise kaç olmalı?
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Access veritabanına kayıt nasıl yapılmıştı acaba, bir bilginiz var mı ? Tersi işlem adına soruyorum...
Resim
Resim ....Resim
Archimed
Üye
Mesajlar: 14
Kayıt: 29 Nis 2004 10:35

Mesaj gönderen Archimed »

access' e kayıt manuel olarak yapıldı..
yani table view' da alandaki boş hücreye sağ tuşla tıklanıp insert object dedikten sonra CreateFromFile seçeneği ile ekledim.

dediğim gibi stream.savetofile deyip save edebiliyorum fakat kaydettiği dosya benim orjinal dosyamdan daha büyük. Access, benim dosyamın yanı sıra bu alana ilave bişeyler ekliyor olmalı. Field' a gömülü Dosyanın içeriğini Access' te problemsiz görebiliyorum.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- O zaman bişi önericem...

- Örnek bir word / excel ne olursa bir dosya oluşturup diske kaydedin. Sonra da bunu dosya olarak aynı bildiğiniz şekilde veritabanına ekleyip, kullanacağınız zaman açın ve save to file ile kaydedin... İki dosya arasındaki binary farkı sabit ise yine delphide file operation ile bu fazlalığı ayıklayıp işe yarayan kısmı işleme koyun...
Resim
Resim ....Resim
Archimed
Üye
Mesajlar: 14
Kayıt: 29 Nis 2004 10:35

Mesaj gönderen Archimed »

Stream.Position değerini 0 dan başlatıp 448000 küsüre kadar arttırdım. fakat hiç birinde de olumlu sonuç alamadım..

Delphi gibi üstün bir araç ile çok basit gibi görünen bir şey neden bu kadar komplex hale geldi anlamıyorum. Çok basit bir noktayı atlıyoruz gibi bir his var içimde... Web' de de çok aradım ama Blob field'e hep resim gömülmüş. Neden kimse word/excel/PDF ..vb gömmeyi denememiş?
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Selam...

- Bugün biraz vaktim vardı senin için bir deneme yaptım... Haklıymışsın, fazlalık var ama bu fazlalık eklenti şeklinde değil tamamen format farklılığından kaynaklı...

- Dilersen aşağıda vereceğin kodu dene...

- Blob Alana XLS dosya gömme... Program dizinindeki Kitap1.XLS dosyası AdoQuery1'deki üzerinde konumlanmış kaydın "BlobVeri" ismindeki blob alana kopyalanması...

Kod: Tümünü seç

  AdoQuery1.Edit;
  (AdoQuery1.fieldbyName('BlobVeri') as TblobField).loadfromFile(ExtractFilePath(Application.ExeName)+'Kitap1.XLS');
  AdoQuery1.Post;
- Yukardaki şekilde Blob Alana gömülmüş XLS dosyayı HDD'ye kopyalama...

Kod: Tümünü seç

var
   S: TMemoryStream;
begin
   S := TMemoryStream.Create;
   try
      TBlobField( AdoQuery1.FieldByName('BlobVeri') ).SaveToStream( S );
      S.Position := 0;
      S.SaveToFile(ExtractFilePath(Application.ExeName)+'ExcelVerisi.XLS');
   finally
      S.Free;
   end;
end;
- Bu işlemin mümkün olduğu görüldüğüne göre, sorunun kaynağına gidilmiş oldu... Sorun Clipboard nesenesini dosyaymış gibi HDD'ye kaydetmekten kaynaklı...

- Sana önerim, mouse sağ clik/Nesne Ekle(InsertObject) vb. yerine ufak bir program yazıp, bu dosyaları yukardaki metodla veritabanına kaydet ki, aynı şekilde geri okuyabilesin...

- Şimdi yeni soru Clipboard formatındaki bir nesnenin dosya formatına dönüştürülmesi nasıl olur ?

- Hani daha önceki başlıklarda HDD'ye kaydettiğin veri normalden uzun diyordun ya işte onu dosyanın orjinaline nasıl dönüştüreceğini bulmak lazım... Bunu halen bilmiyorum...
Resim
Resim ....Resim
Archimed
Üye
Mesajlar: 14
Kayıt: 29 Nis 2004 10:35

Mesaj gönderen Archimed »

hafta sonu bunun üzerinde çalışıp pazartesi haber sonucu yazarım..
teşekkür ederim.
Archimed
Üye
Mesajlar: 14
Kayıt: 29 Nis 2004 10:35

Mesaj gönderen Archimed »

evet.. access yerine delphiden insert ettiğim dosyalar düzgün açılıyor ama accessden ekleiğim dosyalar delphi' den açılmıyor..

:lol:

teşekkürler..
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Rica ederim...

- Ben yine de meraklıyım... Bu konuda (access'e manuel eklenmiş olanları da extract etmek adına) birşey bulursam buraya yazarım... :o
Resim
Resim ....Resim
Cevapla