Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
DBGrid resim ön izleme
#1
Merhaba, 
Dbgrid üzerinde klavyenin yön tuşları ile kayıtları gezerken, ilgili kaydın resmini  image bileşeni ile göstermek için şöyle yaptım .  Querye bağlı datasource ondatachance olayına aşağıdaki kodu yazdım. Bu şekil kullanmak pek doğru olmadı. Çünkü aynı queryi image bileşeni olmadan kullandığım formlarımda var. Yükleyecek bir image bulamadığı için haliyle aşağıdaki kod hata verdi ve programın kırılmasına neden oldu.  Nasıl yapmalıyım ? 



 if QGENEL.RecordCount>0 then BEGIN

      if  QGENEL.FieldByName('RESIM_YOLU').AsString='' then FANA.IMG_ANARES.Picture:=nil  else
          begin
           if fileexists(QGENEL.FieldByName('RESIM_YOLU').AsString) then
              FANA.IMG_ANARES.Picture.LoadFromFile(QGENEL.FieldByName('RESIM_YOLU').AsString);
          end;
   END;
#2
Eğer resim varsa resmi göster demişsiniz anladığım kadarıyla peki ya resim yoksa ? bence else ile resim yoksa başka resme geç ya da hiçbirşey yapma gibi bir seçenek eklenirse sorun çözülebilir
#3
Sorun resimde değil gözünüzden kaçtı sanırım zaten varlığı ve yokluğu kontrol ediliyor. Sorunu şöyle açıklayayım.
Form1 ve Form2 adında iki formum var. Form1 de 1 adet dbgrid ve 1 adet image bileşini var. Form2 de sadece dbgrid var.
Yukarıdaki kodu form1 de kullanırsam sorun yok, fakat form2  dbgrid üzerinde herhangi bir kaydın üzerine gelirsem hata verecek. Çünkü form2 de image bileşini yok. Datasoruce kayıt değiştikçe resim göstermek için bir image bileşeni arıyacak olmayıncada hata vericek.
#4
Bunu kayıtlar üzerinde gezerken değil de gerekirse bir butona basıp yaptır sorun kalmasın.
WWW
#5
Resmi veritabanında ham haliyle bulunuyorsa Forma DBimage nesnesi koyarak bağlantı yaparsanız kod yazmanıza gerek kalmaz. İlgili kayıtdaki resim field inde  resim datası varsa görünür. Base64 vb gibi kodlanmış olarak duruyorsa ilgili kayıt verisi çekildikden sonra kod ile dönüşüm işlemi yapmak gerekir. Tasarım aşamasında iseniz resimleri jpg gibi sıkıştırılmış bir formatta veritabanına doğrudan kaydedin.


Soruda databsede resimin diskdeki yolu tutuluyor kısmını gözden kaçırmışım. Yukarıdaki açıklamalar bu sorunun cevabı ile ilgili değil. Fakat geçen günlerde forumda açılan resimler veritabanında saklanmalımı saklanmamlımı konusunu hatırlattı Smile
#6
(22-10-2018, Saat: 12:01)frmman Adlı Kullanıcıdan Alıntı: Resmi veritabanında ham haliyle bulunuyorsa Forma DBimage nesnesi koyarak bağlantı yaparsanız kod yazmanıza gerek kalmaz. İlgili kayıtdaki resim field inde  resim datası varsa görünür. Base64 vb gibi kodlanmış olarak duruyorsa ilgili kayıt verisi çekildikden sonra kod ile dönüşüm işlemi yapmak gerekir. Tasarım aşamasında iseniz resimleri jpg gibi sıkıştırılmış bir formatta veritabanına doğrudan kaydedin.


Soruda databsede resimin diskdeki yolu tutuluyor kısmını gözden kaçırmışım. Yukarıdaki açıklamalar bu sorunun cevabı ile ilgili değil. Fakat geçen günlerde forumda açılan resimler veritabanında saklanmalımı saklanmamlımı konusunu hatırlattı Smile

Yoo bence iyi oldu cevabın. Resimleri veritabanına gömmek için bir sebep daha oldu benim için Smile) Veritabanın da saklarkern dikkatimi çeken ve bilmediğim iki şey gördüm. 
1) Blob alan oluştururken Size ve Subtype alanlarını ne olmalı ?  Size alanında varsayılan 80  Subtype ise binary.. 
2) DBimage kullanırsam jpeg desteği yok diye biliyorum. Gösterirken nasıl olacak
#7
1. Sorunuzun için kullanıdığınız databaseye göre değişir.

SQL server için Filed tanımlamalarında "image" diye tip tanımı yapabiliyorsunuz.

Mysql için
tinyblob :256byte
blob: 65Kb
mediumblob:16Mb
Longblog: 4Gb

Saklamayı düşündüğünüz maximum veri miktarına göre uygun olanı seçmelisiniz. Diğer database sistemleri için malesef bilgim yok.


2. Jedi kütüphanesindeki DBimage nesnesi jpeg formatındaki resimleride otomatik olarak destekliyor.  (VCL projelerde alışınca bırakamayacağınız bir kütüphane)

Jedi kullanmadan önce datamodulün ondatachange olayında sizin ilk sorunuzda yaptığınız gibi veriyi işleyip(jpeg formatını bmp ye dönüştürüp image1.picture  ' e aktarma) normal image nesnesinde gösteriyordum.

Eskiden kullandığım yöntemi paylaşayım.

uses jpeg; 


Function TDataModul.JPEGSentinelsAreOK (Const Filename: TBlobField): Boolean;
Var
   FileStream: TStream;
   w1: Word; // a "word" is always 2 bytes long
   w2: Word;
Begin
   ASSERT (SizeOf (Word) = 2);
   FileStream := TBlobStream.Create (Filename, bmRead);
   Try
       FileStream.Seek (0, soFromBeginning); // use seek or position
       FileStream.Read (w1, 2);
       FileStream.Position := FileStream.Size - 2;
       FileStream.Read (w2, 2)
   Finally
       FileStream.Free
   End;
   Result := (w1 = $D8FF) And (w2 = $D9FF);
End;

Procedure TDataModul.ResimOku (ResimField: TBlobField; Resim: TPicture);
Var
   jpg: TJPEGImage;
   stbmp: TStream;
   bmp: TBitmap;
   stjpg: TStream;
Begin
   If Resimfield.isnull Then
   Begin
       Resim.Assign (Nil);
       Exit;
   End;
   If JPEGSentinelsAreOK (ResimField) Then
   Begin //1
       jpg := TJPEGImage.Create;
       bmp := Tbitmap.Create;
       stjpg := TBlobStream.Create (ResimField, bmRead);
       stbmp := TMemoryStream.Create;
       jpg.LoadFromStream (stjpg);
       If Jpg.PixelFormat = jf24bit Then
           Bmp.PixelFormat := pf24bit
       Else
           Bmp.PixelFormat := pf8bit;
       Bmp.Width := Jpg.Width;
       Bmp.Height := Jpg.Height;
       Bmp.Canvas.Draw (0, 0, Jpg);
       Bmp.SaveToStream (stbmp);
       Resim.Assign (bmp);
       bmp.Free;
       jpg.Free;
       stjpg.Free;
       stbmp.Free;
   End;
End;

Datamodul onchange olayındada

Datamodul.ResimOku (Datamodul.QSorguRESIM, image1.picture);


Şeklinde kullanıyordum.

Şimdi ise jedi DBimage nesnesini, dbediti datasource ile bağlar gibi bağlıyorum
#8
Şöyle bir çözüm buldum ama pek sağlıklı değil araştırıyorum . 


procedure TFSTOK_KARTI.DBGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if (key=VK_UP) or (key=VK_DOWN)then begin


    if FDATA_M.QSTOK_KARTLARI.RecordCount>0 then BEGIN

      if  FDATA_M.QSTOK_KARTLARI.FieldByName('RESIM_YOLU').AsString='' then FSTOK_KARTI.IMAGE_STOKKART.Picture:=nil  else
          begin
           if fileexists(FDATA_M.QSTOK_KARTLARI.FieldByName('RESIM_YOLU').AsString) then
              FSTOK_KARTI.IMAGE_STOKKART.Picture.LoadFromFile(FDATA_M.QSTOK_KARTLARI.FieldByName('RESIM_YOLU').AsString);
          end;
   END;
 end;
end;
#9
(22-10-2018, Saat: 14:48)Lord_Ares Adlı Kullanıcıdan Alıntı: Şöyle bir çözüm buldum ama pek sağlıklı değil araştırıyorum . 


procedure TFSTOK_KARTI.DBGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if (key=VK_UP) or (key=VK_DOWN)then begin


    if FDATA_M.QSTOK_KARTLARI.RecordCount>0 then BEGIN

      if  FDATA_M.QSTOK_KARTLARI.FieldByName('RESIM_YOLU').AsString='' then FSTOK_KARTI.IMAGE_STOKKART.Picture:=nil  else
          begin
           if fileexists(FDATA_M.QSTOK_KARTLARI.FieldByName('RESIM_YOLU').AsString) then
              FSTOK_KARTI.IMAGE_STOKKART.Picture.LoadFromFile(FDATA_M.QSTOK_KARTLARI.FieldByName('RESIM_YOLU').AsString);
          end;
   END;
 end;
end;


Bende sizin yukarıdaki kodunuz gibi kullanıyorum.
Kodu procedure resim_kontrol  yaptım.

Tuş aşağı, yukarı, grid cell select, mouse tekerlek, sorgu ve varsa diğer olaylarda   
resim_kontrol procedure çağırıyorum uzun zamandır sorunsuz çalışıyor.
"…De ki: "Hiç bilenlerle bilmeyenler bir olur mu? Şüphesiz, temiz akıl sahipleri öğüt alıp-düşünürler" (Zümer Suresi, 9)
#10
(22-10-2018, Saat: 14:47)frmman Adlı Kullanıcıdan Alıntı: Datamodul onchange olayındada

Datamodul.ResimOku (Datamodul.QSorguRESIM, image1.picture);


Şeklinde kullanıyordum.

Şimdi ise jedi DBimage nesnesini, dbediti datasource ile bağlar gibi bağlıyorum

Peki bu şekilde kullanım size sorun yaratmıyor mu ? Çünkü gördüğü kadarıyla sizde de aynı sorun olabilir. Örnek Form1 de dbgridiniz var ama image1 yok kayıt değiştirdiğinizde image nesnesini o formda bulamayacağı için program kırılmıyor mu ? Sonuçta bu queryi (QSorguRESIM) image bileşeni kullanmadan bir çok formda da kullanmış olabilirsiniz..


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  DBGrid Detay Gösterilmesi. OZCANK 11 8.599 20-03-2024, Saat: 20:10
Son Yorum: mrmarman
  DbGrid'de Seçili Satırların Fast Reportta Raporlanması [ÇÖZÜLDÜ] bünyamin68 4 637 17-12-2023, Saat: 15:08
Son Yorum: bünyamin68
  dxRichEditControl Resim Kaydı m_ekici 0 206 31-10-2023, Saat: 01:42
Son Yorum: m_ekici
  DBGRID Otomatik Sıra No Alanı [ÇÖZÜLDÜ] bünyamin68 2 393 18-10-2023, Saat: 21:00
Son Yorum: bünyamin68
  DbGrid tüm satırların yüksekliğini ayarlama delphicim 2 329 16-10-2023, Saat: 23:06
Son Yorum: delphicim



Konuyu Okuyanlar: 1 Ziyaretçi