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;
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
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.
Bunu kayıtlar üzerinde gezerken değil de gerekirse bir butona basıp yaptır sorun kalmasın.
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ı

(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ı 
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
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
Şö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;
(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.
(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..