2017-05-20 7 views
-2

私はあなたの助けが必要です。 DBGridメソッドを描画します。私はテーブルDBGridを持っています。DBGridを描画する(リソースからの置き換えイメージ)

どのようにですか?私のメソッド "DrawDBGrid"にメソッド "LoadDefaultImage"を追加 ファイルパス(イメージ)がない場合、リソースからの置き換えイメージが表示されます。

マイ "LoadDefaultImage"

procedure LoadDefaultImage(AImage: TImage; aPngName: string); 
var 
    lImage: TPngImage; 
begin 
    lImage := TPngImage.Create(); 
    try 
    lImage.LoadFromResourceName(hInstance, aPngName); 
    AImage.picture.Graphic := lImage; 
    finally 
    lImage.Free(); 
    end; 
end; 

呼び出し方法

LoadDefaultImage(AImage, 'No image'); 

マイ "DrawDBGrid"

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; 
+0

さまざまなアカウント(RedWomenなど)のいずれかで質問を投稿してから**削除し、別のアカウントから同じqを求めてください**。 – MartynA

+0

私は同じことを尋ねるのではなく、問題を解決したので、私はそれを取り除いて、できないことを尋ねました。 – Maryna

+1

あなたは他のユーザーのことを少しでも心配するべきです。最初に、あなたの以前のqへの回答を書いている途中に誰かがそれを削除したために投稿できなかったとします。第二に、SOのqは、それを求めた人の利益のためだけではありません。だから、自分でqの問題を解決することができれば、今後の読者の便宜のために、あなたがしたことを答弁することを検討するべきです。いずれにしても、あなたはqを求めてそれに固執するために一つの口座を選ぶべきです。 – MartynA

答えて

0

DrawDBGridがレンダリングイベントから呼び出されたスタンドアロンの手順がある場合は、次のようにプリロードされたデフォルトイメージを渡すためにそれを変更することができます:

procedure DrawDBGrid(aDBGrid: TDBGrid; aGraphicFieldName: string; Column: TColumn; State: TGridDrawState; Sender: TObject; 
    const Rect: TRect; DataCol: Integer; DefaultImage: TPngImage); 

そして、その中に、あなたはこれを行うことができます。

... 
    lIsFile := FileExists(lPicturePath); 
    // if not the desired column 
    if (Column.Field.FieldName <> aGraphicFieldName) 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 // the right column 
    begin 
    // if the file was not found, draw the default image that was passed 
    if not lIsFile then 
    begin 
     aDBGrid.canvas.Draw(Rect, DefaultImage); 
    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; 
    ... 

レゴの最後のピースがここにフォームが作成されたときに、たとえば、デフォルトのイメージを事前にロードしておこうということです保存されたフォームクラスにTPngImageのプライベートフィールドとして入力し、スタンドアロンプ​​ロシージャに渡します。

関連する問題