2014-02-05 54 views
0

我正在嘗試創建一個生命遊戲模擬器。我以前使用過StrGrid,但是速度較慢,我被告知要使用DrawGrid。我的程序的工作原理是有兩個數組,strArray包含下一代單元格的所有值,currentArray包含當前代單元格的所有值(都是數組類型[1..127])數組[1..127]的字符串;我知道最好使用布爾數組,但這是一個較舊的程序)。在計時器上,算法計算每個單元周圍的活細胞數,並在strArray,T(指定活細胞)或F(指定死細胞)中給它一個值。然後將此模式寫入currentArray,以便下次需要計算活細胞時使用。然後,如果相關單元格與currentArray中的「F」匹配,則將每個單元格的顏色更改爲白色,如果匹配「T」,則將其更改爲黑色。我還想爲單元格着色,然後單擊黑色,並將其在數據表中的值更改爲'T'。單擊並在計時器上在Delphi DrawGrid中着色單個單元格

但是,我不熟悉drawgrid,似乎也找不到任何對我有意義的相關信息。當我使用字符串網格時,可以通過使用stringgrid.cells [stringgrid.col,stringgrid.row]:='whatever'來訪問每個單元格的內容;但是我找不到DrawGrid的類似方法。

總之,我需要幫助:

  • 更改單元格中timer.onTick程序內drawgrid的顏色。
  • 當我單擊它時,在drawgrid中改變單元格的顏色。

我希望你能幫助我。謝謝!

+1

東西['像this'](http://pastebin.com/2Jq09SZU)? [我想知道爲什麼'InvalidateCell'方法受到保護;對於'TDrawGrid',它可能對公衆有用] – TLama

+0

@TLama:你爲什麼把這個代碼發佈到pastebin而不是在這裏發佈它作爲答案? –

+0

@Remy,因爲對於OP來說,它似乎比只是一個代碼更有用的解釋,我懶得寫一個故事。 – TLama

回答

6

TDrawGridTStringGrid之間真正的區別是,TDrawGrid不存儲任何單元格數據本身,而TStringGrid做,而且還關係到你必須自己繪製的一切在TDrawGridTStringGrid默認繪製單元帶你(但如果需要,也可以自定義繪製單元格)。你有你自己的數組來存儲你的單元格數據。不管怎樣,使用OnDrawCell事件繪製單元格。它爲您提供當前正在繪製的單元的Col和。您只需訪問相應的數組元素並相應地設置網格的屬性(如其Brush.ColorFont.Color),然後根據需要調用Canvas.FillRect()Canvas.TextRect()方法。

至於處理點擊,你只需要根據需要更新你的數組,然後使用Invalidate()網格觸發使用最新數據重繪。

例如:

procedure TForm1.TimerTick(Sender: TObject); 
begin 
    // update contents of currentArray as needed... 
    DrawGrid1.Invalidate; 
end; 

procedure TForm1.DrawGrid1Click(Sender: TObject); 
begin 
    if currentArray[DrawGrid1.Col][DrawGrid1.Row] <> 'T' then 
    begin 
    currentArray[DrawGrid1.Col][DrawGrid1.Row] := 'T'; 
    DrawGrid1.Invalidate; 
    end; 
end; 

procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Longint; Rect: TRect; State: TGridDrawState); 
begin 
    if currentArray[ACol][ARow] = 'F' then 
    begin 
    DrawGrid1.Canvas.Brush.Color := clWhite; 
    DrawGrid1.Canvas.Font.Color := clBlack; 
    end else 
    begin 
    DrawGrid1.Canvas.Brush.Color := clBlack; 
    DrawGrid1.Canvas.Font.Color := clWhite; 
    end; 
    DrawGrid1.Canvas.FillRect(Rect); 
    DrawGrid1.Canvas.TextRect(Rect, Rect.Left, Rect.Top, currentArray[ACol][ARow]); 
end; 
相關問題