2012-01-31 61 views
4

我有ListView(vsReport)和StringGrid,我想要的是如果我點擊ListView中的某個元素,StringGrid中的特定單元必須更改顏色。我該怎麼做?ListView和着色celll

路徑填充1(向上移動)和0(向右移動),它從左下角開始到右上角結束,我必須爲這些單元格着色。


感謝您的答案,我與我的問題來處理,但還有另一個小問題,我怎麼能離開文本在細胞中可見? FillRect填充整個單元格。

procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); 
var aRect: TRect; 
    a,x,y:integer; 
    path:string; 
begin 
    path:=ListView1.Items[Item.Index].Caption; 

    x:=0; 
    y:=StringGrid1.RowCount; 
for a := 0 to length(path) do 
    begin 
    if path[a]='1' then y:=y-1 else x:=x+1; 
    aRect := StringGrid1.CellRect(x-1,y-1); 
    StringGrid1.Canvas.Brush.Color := clBlue; 
    StringGrid1.Canvas.FillRect(aRect); 
    end; 
end; 
+3

歡迎來到StackOverflow。你到目前爲止嘗試過哪些方法無效?這不是「請爲我做功課」的網站。我們非常樂意嘗試並指導您找到解決方案,或者幫助您弄清楚爲什麼您所做的工作無法正常工作,但您必須證明您自己已經付出了一些努力。請編輯您的問題以提供您迄今嘗試的代碼,並解釋它如何不如預期的那樣工作,並且此處的某人可以幫助您瞭解如何解決該問題。謝謝。 :) – 2012-01-31 18:11:05

+5

更好的問題。 :) +1。 – 2012-01-31 19:44:11

回答

6
  1. 認識到,一個單元格的顏色變化應該是永久性的,所以當StringGrid被塗一遍,例如當StringGrid被對話框混淆時,特殊顏色也應該再次繪製。
  2. 因此,您需要在某處存儲所需的顏色。假設你想使用一個數組,然後做出選擇:
    • 將特殊顏色與網格座標一起存儲在一維數組中。這對內存使用非常有用,但是您需要在整個數組中搜索StringGrid的OnDrawCell處理程序(參見步驟3)提供的特定座標,
    • 僅將特殊顏色存儲在二維數組中。這對繪製時的速度很有幫助,但是您需要將數組的列和行邊界同步到StringGrid的行邊界,即
    • 或者,當您不需要StringGrid的Objects屬性用於任何目的時,可以使用此屬性通過類型化來自TObject的顏色來存儲顏色。如果您需要幫助,請留言。
  3. 塗料着色細胞在StringGrid的OnDrawCell事件處理程序(這裏搜索Stack Overflow上的[Delphi] StringGrid OnDrawCell時需要援助與)。
  4. ListView的OnSelectItem事件暴露了單擊或以其他方式選擇的項目。
  5. 從該項目或其子項中檢索必要的信息,以確定哪個單元格將以何種顏色進行更改。
  6. 將該信息添加到步驟2中選定的存儲解決方案中。
  7. 意識到當所有繪畫現在完成「自動」時,只需致電StringGrid.Repaint即可。
+3

+1。很好的答案,以及沒有過度回答的良好細節水平。 :) – 2012-01-31 19:47:01