Cześć.
Potrzebuję pomocy w przerobieniu kodu. Teraz jest wszystko dobrze tylko chcę przerobić kod w miejscu wyświetlania obrazka w DBGrid. Chodzi mi by w wypadku braku obrazka wyświetlić brazek zastępczy pobierany z zasobów. Mam dwie ogólne metody, w tym: samo wczytanie które to chce podpiąć teraz w miejsce wyświetlania, a w nim jeszcze jedną metodę ładowanie z zasobów. A oto cześć kodu którą chcę przerobić: Na samym dole załączam działające całe malowanie DBGrida
lImage.LoadFromFile(extractfilepath(paramstr(0)) + lDataset.FieldByName(aGraphicFieldName).AsString);
aDBGrid.canvas.StretchDraw(lRect, lImage);
próbowałam to przerobić tak jak niżej oraz na parę innych sposobów lecz nie skutecznie. W tym wypadku drugim parametrem StretchDraw musi być Vcl.Graphics.TGraphics więc na pewno jest to źle.
LoadImage(extractfilepath(paramstr(0)) + lDataset.FieldByName(aGraphicFieldName).AsString);
aDBGrid.canvas.StretchDraw(lRect, LoadImage);
Ogólna moje dwie metody:
procedure LoadImage(aFileName: string);
var
lImage: TJPEGImage;
begin
lImage := TJPEGImage.Create;
try
lImage.LoadFromFile(aFileName);
except
LoadDefaultImage('Brak_Zdjecia');
end;
end;
procedure LoadDefaultImage(aPngName: string);
var
lImage: TPngImage;
begin
lImage := TPngImage.Create();
try
lImage.LoadFromResourceName(hInstance, aPngName);
finally
lImage.Free();
end;
end;
Malowanie DBGrida
procedure DrawDBGrid(aDBGrid: TDBGrid; aGraphicFieldName: string; Column: TColumn; State: TGridDrawState; Sender: TObject;
const Rect: TRect; DataCol: Integer);
var
lRect: TRect;
lImage: TJPEGImage;
lPicturePath: string;
lDataset: TclientDataSet;
lIsFile: Boolean;
begin
lDataset := TclientDataSet(aDBGrid.DataSource.DataSet);
lPicturePath := extractfilepath(paramstr(0)) + lDataset.FieldByName(aGraphicFieldName).AsString;
lIsFile := fileexists(lPicturePath);
if (Column.Field.FieldName <> aGraphicFieldName) or (not lIsFile) then
begin
if (gdSelected in State) and (TDBGrid(Sender).Focused) then
TDBGrid(Sender).canvas.Brush.color := $E8E3A8
else
TDBGrid(Sender).canvas.Brush.color := clWhite;
aDBGrid.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end
else
begin
lRect.left := Rect.left + 1;
lRect.Top := Rect.Top + 1;
lRect.Right := Rect.Right - 1;
lRect.Bottom := Rect.Bottom - 1;
lImage := TJPEGImage.Create;
try
try
lImage.LoadFromFile(extractfilepath(paramstr(0)) + lDataset.FieldByName(aGraphicFieldName).AsString);
aDBGrid.canvas.StretchDraw(lRect, lImage);
except
on e: exception do
begin
raise exception.Create('Błąd wyświetlania pliku ' + lDataset.FieldByName(aGraphicFieldName)
.AsString + ''#13'' + ''#10'' + e.Message);
end;
end;
finally
lImage.Free;
end;
end;
end;