2016-08-18 71 views
0

在Linux上運行的Lazarus中有一個TStringGrid。我有一個編輯器類型爲cbsButton的列。我希望按鈕顯示某個圖像,而不是省略號。我有以下的代碼,這將導致一個錯誤:在TStringGrid中單元格中的按鈕上繪製圖像

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; 

的錯誤是:

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

在這一點上,我相信我在完全錯誤的方式去了解這一點。有人能讓我回到正確的道路上嗎?

+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

我還沒有嘗試過,但它非常有意義。謝謝你,接受並贊成。 – lk75

0

Editor.Brush.ImageTFPCustomImage類型的財產。這是一個TPersistent後裔。 TImageTCustomImage的後代,因此TGraphicControlTControl。所以這些是完全不同的類,不兼容。

因此,您不需要投入(Editor.Brush.Image as TImage)併爲其分配任何TImage實例。

+0

謝謝,我意識到這一點。我並沒有真正質問爲什麼上面的代碼不起作用,但更多的是,什麼是正在做我想做的事情的方法(顯然是錯誤的)。 :)謝謝,我相信wp_1233996的答案將是正確的。 – lk75

相關問題