2016-08-18 11 views
0

Linux上で実行されているLazarusにTStringGridがあります。エディタタイプcbsButtonを持つカラムがあります。私はボタンに省略記号の代わりに特定の画像を表示させたい。私は完全に間違った方法でこのことについてつもりだと確信している、この時点でTStringGrid内のセルにあるボタンの描画とイメージ

mainform.pas(156,23) Error: Class or Object types "TFPCustomImage" and "TImage" are not related

procedure TForm1.streams_gridDrawCell(Sender: TObject; aCol, aRow: Integer; aRect: TRect; aState: TGridDrawState); 
var 
    aCanvas: TCanvas; 
    aGrid: TStringGrid; 
    Editor: TWinControl; 
    image: TImage; 
begin 
    if (aCol <> 1) or (aRow = 0) then begin 
     Exit; 
    end; 

    aGrid := (Sender as TStringGrid); 

    aCanvas := image.Canvas; 
    aCanvas.FillRect(aRect); 
    imagelist1.Draw(aCanvas, aRect.Left+2, aRect.Top+2, 8); 

    Editor := (aGrid.EditorByStyle(cbsButton) as TButtonCellEditor); 
    Editor.Brush.Style := TBrushStyle.bsImage; 
    (Editor.Brush.Image as TImage) := image; // causes the error below 
end; 

エラーがある:私は、エラーが発生し、次のコードを、持っています。誰かが私を正しい道に戻してください。

+0

あなたはコンポーネントを構築する前に、TImageのキャンバスにアクセスするための代わりに、アクセス違反を取得する必要があります。 –

+0

アクセス違反は実行時です。上記のエラーはコンパイル時です。 – lk75

答えて

3

セルがペイントされたときにおそらく正しいセルエディタが存在しないため、OnDrawCellイベントがセルエディタを修正する正しい場所であるとは限りません。

セルエディタを定義する正しいイベントは、グリッドのOnSelectEditorイベントです。 wiki(http://wiki.lazarus.freepascal.org/Grids_Reference_Page)をお読みください。

使用するcbsButtonエディタは、TButtonから継承します。 TButtonにはGlyphプロパティがありません。ボタンにビットマップを割り当てることはできません。しかし、あなたは簡単に独自のセルエディタを書くことができ、ちょうど例/ gridexamples/gridcelleditorで標準例に従います。

  • フォームにTBitBtnを追加します。キャプションを削除し、要求されたイメージをGlyphプロパティに追加します。 Visibleプロパティをfalseに設定します。
  • このボタンのOnClickイベントでは、セルの編集方法を記述します。グリッドのColとRowプロパティで指定されたセルにアクセスします。例として、私はあなただけのInputBoxを開きたいことをここに想定しています
 
    procedure TForm1.BitBtn1Click(Sender: TObject); 
    begin 
     StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row] := 
     InputBox('Input some text', 'Text:', ''); 
    end;
  • 今すぐグリッドのOnSelectEditorイベントのイベントハンドラを記述します。 BitBtnをイベントのエディタパラメータに割り当て、ボタンが選択されたセル内の正しい位置にあることを確認する必要があります - それだけです!
 
    procedure TForm1.StringGrid1SelectEditor(Sender: TObject; aCol, aRow: Integer; 
     var Editor: TWinControl); 
    var 
     R: TRect; 
    begin 
     if (aCol=2) and (aRow > 0) then begin 
     R := StringGrid1.CellRect(aCol, ARow); 
     R.Left := R.Right - (R.Bottom - R.Top); 
     BitBtn1.BoundsRect := R; 
     Editor := BitBtn1; 
     end; 
    end;
+0

私はこれをまだ試していませんが、それは完璧な意味を持っています。ありがとう、受け入れられupvoted。 – lk75

0

Editor.Brush.Imageは、タイプTFPCustomImageのプロパティです。これはTPersistentの子孫です。 TImageTCustomImageの子孫であり、したがってTGraphicControlTControlです。したがって、これらは完全に異なるクラスで、互換性がありません。

したがって、(Editor.Brush.Image as TImage)をキャストしてTImageインスタンスを割り当てる必要はありません。

+0

ありがとう、私はそれを実現しました。私は本当に上記のコードがうまくいかない理由を尋ねていませんでしたが、もっと似ています、私がやろうとしていることを正しく行う方法は間違っています。 :)ありがとう、私はwp_1233996の答えが正しいものになると信じています。 – lk75

関連する問題