resimlerinizi veritabanına kaydetmeden gösterin.

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
Kullanıcı avatarı
y.kulac
Üye
Mesajlar: 276
Kayıt: 08 Kas 2003 12:03
Konum: serdivan/sakarya

resimlerinizi veritabanına kaydetmeden gösterin.

Mesaj gönderen y.kulac »

herkese merhaba.

resimlerini veritabanında değilde ayrı bir klasörde tutmak isteyen arakadaşlar olabilir.bunun avantajları ve dezavantajları forumumuzda tartışıldı. burada resimleri ayrı bir klasörde tutmak isyen arkadaşlara bir nebze olsun yardımım olsun dedim.

ben firebird veritabanı ve ibx bileşeni kullandım. veritabanında RESIM alanını varchar olarak tanımladım.

öncelikle veritabanı ile bütün bağlantı ayarlarını yaptığımızı varsayıyorum.
formumuza bir image1, bir popupmenu1, bir opendialog1 koyalım.
poupmenu1 de;
-resim aç
-resim kaydet
-resim sil tanımlayalım
opject inspector den image1 in PopupMenu bağlantısını popupmeu1 yapalım.

resim aç için kod.

Kod: Tümünü seç

procedure TfrmAna.Resimekle1Click(Sender: TObject);
begin
 if opendialog1.Execute then // eğer opendialog1 aktif ise
 begin
 image1.Picture.LoadFromFile(opendialog1.FileName); //opendialog1 deki resmi image nesnesine aktar
 end;
end;
resim kaydet için kod.

Kod: Tümünü seç

ibdataset1.Edit;
ibdataset1RESIM.AsString:= opendialog1.FileName;//veritabanındaki RESIM alanına opendialog1 deki yolun ismini yaz.
ibdataset1.Post;
resim sil için kod.

Kod: Tümünü seç

ibdataset1.Edit;
ibdataset1RESIM.AsString:='';
ibdataset1.Post;
image1.Picture.LoadFromFile(ibdataset1.fieldByName('RESIM').AsString);//image nesnesini güncelledik.
ben kayıt bulurken edit nesnesinin oncahnce olayından yararlanıyorum. siz ne şekilde kayıt buluyorsanız kodu onun
içine yazın. örneğin button click olayı olabilir.

Kod: Tümünü seç

ibdataset1.Close;
ibdataset1.SelectSQL.Clear;
ibdataset1.SelectSQL.Add('Select * From BILGILER');
ibdataset1.SelectSQL.Add('where ADISOYADI LIKE '''+CeEdit1.Text+'%'' order By ADISOYADI');
ibdataset1.Open;
image1.Picture.LoadFromFile(ibdataset1.fieldByName('RESIM').AsString);//veritabanında kayıtlı yoldaki resmi image1 nesnesine aktar.
ben dbgridde kayıtları listeleyince ve kayıtlar arasında dolaşırken resimlerin değişmediğini sabit kaldığını gördüm.
bunuda şu şekilde hallettim.

enter tuşuna basılırsa

Kod: Tümünü seç

procedure TfrmAna.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = Char(VK_RETURN) then
begin
ibdataset1.Next;
image1.Picture.LoadFromFile(ibdataset1.fieldByName('RESIM').AsString);
end;
end;
herhangi bir tuşa basılırsa yukarı ve aşağı olabilir.

Kod: Tümünü seç

procedure TfrmAna.DBGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
image1.Picture.LoadFromFile(ibdataset1.fieldByName('RESIM').AsString);
end;
ama resimlerin saklandığı klasör başka bir yere taşınırsa resim yollarını tekrar güncellemek gerekecektir.
fakat hız süper. daha önce yaptığım bir projede resimleri veritabanına kaydetmiştim. formu kapatırken
tablolarıda kapattığım için bir form 5-6 saniyede kapanıyordu. ben resimleri veritabanına kaydetme taraftarı
değilim.

kolay gelsin.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Ben VT'de tutuyorum. Bir personel tablom var. 1000 kadar personelin fotoğrafları JPEG ve yaklaşık 6-10 Kb boyutunda. Hiçbir hız problemi yaşamıyorum. BLOB size ve VT page size düzgün ayarlandığı müddetçe de bir sorun oluşturacağını sanmıyorum.
Turki
Üye
Mesajlar: 75
Kayıt: 03 May 2005 08:02

vt' ye resim kaydetme

Mesaj gönderen Turki »

Coderlord Kardeş Jpeg leri Veritabanına nasıl bir kodla kaydedip,gösteriyorsun..
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Hmm dur göndereyim DBImage i kullanmıyorum çünkü galiba JPEG desteği yoktu ve takla atmak gerekiyordu o yüzden gösterimde JEDI in DBImage ini kullandım:

Datasetini edit veya insert moduna aldıktan sonra !! VT'ye JPEG kaydetmek için:

Kod: Tümünü seç

 // Blob içeriğini yükle
  if opdPictureOpen.Execute then  // Resmi seçtiğimiz dialog kutusunu açar
    // Seçilen JPEG dosya Jedi'in DBImage'ine bu yöntemle aktarılır.
    jdiPhoto.Picture.LoadFromFile(opdPictureOpen.FileName); 
Veritabanını Post-Commit ettiğinde resim VT ye yazılacaktır.

Resmi silmek istediğimde, Datasetini edit moduna aldıktan sonra !! :

Kod: Tümünü seç

 // Blob içeriğini sil
  if MessageDlg('Fotoğraf içeriği silinecektir. Devam etmek istiyor musunuz?',
    mtWarning, [mbOK, mbCancel], 0) = mrOK then
  begin
    jdiPhoto.Picture.Graphic:= nil; // Jedi in DBImage bileşeninden resim siliniyor
    jdiPhoto.DataSource.DataSet.FieldByName(jdiPhoto.DataField).Clear;
  end;
Dataseti post commit ettiğinde daha önce kaydetmiş olduğun resim içeriği silinecektir.
Turki
Üye
Mesajlar: 75
Kayıt: 03 May 2005 08:02

Mesaj gönderen Turki »

Teşekkürler....
Kullanıcı avatarı
delphist
Üye
Mesajlar: 595
Kayıt: 05 Oca 2005 04:34

Mesaj gönderen delphist »

@coderlord hocam Jedi paketindeki bu componentin tam adını söyleyebilirmisiniz...Teşekkürler
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Jv Data Controls tabının altındaki, JvDBImage bileşeni.
Kullanıcı avatarı
delphist
Üye
Mesajlar: 595
Kayıt: 05 Oca 2005 04:34

Mesaj gönderen delphist »

@coderlord hocam sürümünü söylermisin bu tabda bende böle bir bileşen yok...Teşekkürler
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

ComponentList te sinde TjvDbImage yazınca cıkıyoer.
ÜŞENME,ERTELEME,VAZGEÇME
Turki
Üye
Mesajlar: 75
Kayıt: 03 May 2005 08:02

Mesaj gönderen Turki »

Sayın Y.Kulaç Veritabanında,Verdiğiniz, Resim Gösterme kodlarını(Uzun bir Zaman Sonra Bende Deneyeyim dedim) Yazdığınız Şekilde (Çok Sağol Gerçekten Resimi VB'ye kaydetmek Yerine Göstermek daha mantıklı)Denedim fakat Resim ekledikten sonra;


Gezinirken Resmi sabitliyen bu kodlar;

Kod: Tümünü seç

procedure TfrmAna.DBGrid1KeyDown(Sender: TObject; var Key: Word; 
  Shift: TShiftState); 
begin 
image1.Picture.LoadFromFile(ibdataset1.fieldByName('RESIM').AsString); 
end; 

Kod: Tümünü seç

procedure TfrmAna.DBGrid1KeyPress(Sender: TObject; var Key: Char); 
begin 
if Key = Char(VK_RETURN) then 
begin 
ibdataset1.Next; 
image1.Picture.LoadFromFile(ibdataset1.fieldByName('RESIM').AsString); 
end; 
önce gösteriyor daha sonra DBGridde Ya Resim eklerken veya başka bir işlemden sonra hata veriyor..Kodları tekrar tekrar kontrol edip denedim..sizin kodlarla karşılaştırdım..sonuç aynı bir türlü çözemedim..nerde hata yapıyorum..yanlız bir şey var,hata DBGrid'in KeyPres'ine ve DBGrid'in KeyDown 'una yazılan kodlardan kaynaklanıyor...Siz bu sorunu yaşadınızmı Yoksa benmi yapamadım Lütfen yardım..

Not:Bu kodları Paradox'da düzenleyerek denedim yine aynı hatayı veriyor.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Turki yazdı:(Çok Sağol Gerçekten Resimi VB'ye kaydetmek Yerine Göstermek daha mantıklı)
Neden? Mantığınız nedir?
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

sy coderlord
uses
jpeg JEDİ yüklü firebir tablomu oluşturdum formumda gerekli bağlantıyı yaptım ınterbase bileşenleri ile bağlandım

IBTable1.append;
if OpenPictureDialog1.Execute then // Resmi seçtiğimiz dialog kutusunu açar
// Seçilen JPEG dosya Jedi'in DBImage'ine bu yöntemle aktarılır.
JvDBImage1.Picture.LoadFromFile( OpenPictureDialog1.FileName);

IBTable1.post;
resim alanım blob olarak tanımlı
yaptığımda JvDBImage1 de jpeg resmini görüyorum ama kaydet dediğimde
Bitmap image is not valid. hatası alıyorum.
Cevapla