![]() |
|
DBGrid resim ön izleme - Baskı Önizleme +- Delphi Can (https://www.delphican.com) +-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3) +--- Forum: Genel Programlama (https://www.delphican.com/forumdisplay.php?fid=6) +--- Konu Başlığı: DBGrid resim ön izleme (/showthread.php?tid=2783) |
DBGrid resim ön izleme - Lord_Ares - 22-10-2018 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;
DBGrid resim ön izleme - hakanharbeli - 22-10-2018 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 DBGrid resim ön izleme - Lord_Ares - 22-10-2018 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. DBGrid resim ön izleme - esistem - 22-10-2018 Bunu kayıtlar üzerinde gezerken değil de gerekirse bir butona basıp yaptır sorun kalmasın. DBGrid resim ön izleme - frmman - 22-10-2018 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ı
Cvp: DBGrid resim ön izleme - Lord_Ares - 22-10-2018 (22-10-2018, Saat: 12:01)frmman Adlı Kullanıcıdan Alıntı: Yoo bence iyi oldu cevabın. Resimleri veritabanına gömmek için bir sebep daha oldu benim için ) 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 DBGrid resim ön izleme - frmman - 22-10-2018 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 Cvp: DBGrid resim ön izleme - Lord_Ares - 22-10-2018 Şö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;
Cvp: DBGrid resim ön izleme - cinarbil - 22-10-2018 (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 . 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. DBGrid resim ön izleme - Lord_Ares - 22-10-2018 (22-10-2018, Saat: 14:47)frmman Adlı Kullanıcıdan Alıntı: Datamodul onchange olayındada 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.. |