2012-05-10 71 views
0

一個stringgrid列我這樣做:顏色取決於列名的文本

procedure TForm1.BitBtn1Click(Sender: TObject); 
var dtStart: TDateTime; 
    I: Integer; 
begin 
    dtStart := DateTimePicker1.Date; 
    for I := 0 to 7 do 
    AdvStringGrid1.Cells[I+1, 0] := uppercase(FormatDateTime('DD/MM/YYYY  DDD', dtStart + I)); 
    end; 

有沒有一種辦法顏色的列時(例如)週日(SUN)出現?我希望SUN專欄(一路下來)以不同於其他的顏色出現。

回答

3

您可以通過使用OnDrawCell事件(執行而不是DefaultDraw設置爲False)來執行此操作。下面是與常規TStringGrid一個例子:

上面確切的代碼的
// Sample to populate the cells with the days of the week 
procedure TForm1.FormShow(Sender: TObject); 
var 
    r, c: Integer; 
begin 
    StringGrid1.ColCount := 8; // Ignore fixed column and row for this example 
    StringGrid1.RowCount := 8; 

    for c := 1 to StringGrid1.ColCount - 1 do 
    for r := 1 to StringGrid1.RowCount - 1 do 
     StringGrid1.Cells[c, r] := FormatSettings.ShortDayNames[c]; 
end; 

// Assign this to the StringGrid's OnDrawCell using the Object Inspector 
// Events tab. 
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; 
    Rect: TRect; State: TGridDrawState); 
var 
    CellText: string; 
begin 
    if (ARow > 0) and (ACol > 0) then 
    begin 
    CellText := StringGrid1.Cells[ACol, ARow]; 
    if Pos('Sun', CellText) > 0 then 
    begin 
     StringGrid1.Canvas.Brush.Color := clRed; 
     StringGrid1.Canvas.FillRect(Rect); 
    end 
    else 
     StringGrid1.Canvas.Brush.Color := clWindow; 
    end; 

    // The '+ 4' is from the VCL; it's hard-coded when themes are enabled. 
    // You should probably check the grid's DrawingStyle to see if it's 
    // gdsThemed, and adjust as needed. I leave that as an exercise for you. 
    StringGrid1.Canvas.TextOut(Rect.Left + 4, Rect.Top + 4, CellText); 
end; 

輸出示例:

enter image description here

下面是輸出只是正是你想要的第二個例子(除了我沒有轉換太陽蓋):

procedure TForm1.FormShow(Sender: TObject); 
var 
    r, c: Integer; 
begin 
    StringGrid1.DefaultColWidth := 100; 
    StringGrid1.ColCount := 8; 
    StringGrid1.RowCount := 8; 

    for c := 1 to StringGrid1.ColCount - 1 do 
    for r := 1 to StringGrid1.RowCount - 1 do 
     StringGrid1.Cells[c, r] := FormatDateTime('mm/dd/yyyy ddd', 
               Date() + c + r - 1); 
end; 

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; 
    Rect: TRect; State: TGridDrawState); 
var 
    CellText: string; 
begin 
    if (ARow > 0) and (ACol > 0) then 
    begin 
    CellText := StringGrid1.Cells[ACol, ARow]; 
    if Pos('Sun', CellText) > 0 then 
     StringGrid1.Canvas.Brush.Color := clRed 
    else 
     StringGrid1.Canvas.Brush.Color := clWindow; 
    StringGrid1.Canvas.FillRect(Rect); 
    end; 
    StringGrid1.Canvas.TextOut(Rect.Left + 4, Rect.Top + 4, CellText); 
end; 

這裏的捕獲到第二樣品不一致:

enter image description here

+0

它不適用於我的情況。我也有這個日期。也就是這個顏色只有活動的單元格。如果在列名中存在單詞SUN,我想爲整列(包括固定單元格)着色。 – user763539

+0

你的這段代碼也清除了我的細胞內容,因此我無法看到任何東西... – user763539

+0

嗯,不,它不。 :)我會添加一個屏幕截圖。它還會爲任何包含文本「Sun」的單元格(通過使用上面代碼中的「Pos」找到)而不僅僅是活動單元格着色。您必須調整代碼以符合您的確切需求;我發佈的是如何做的例子,但這只是一個起點。 :) –

0

使用DrawCell過程是要走的路。這個例子處理了具有「Sun」的列可能在任何列中的可能性。將DefaultDrawing保留爲默認值 - true。


    procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; 
     Rect: TRect; State: TGridDrawState); 
    begin 
     with Sender as TStringGrid do 
     if Pos('Sun', Cells[ACol, 0])>0 then begin 
     Canvas.Brush.Color := clRed; 
     Canvas.FillRect(Rect); 
     Canvas.Font.Color := clwhite; 
     Canvas.TextOut(Rect.Left + 2, Rect.Top + 2, Cells[ACol, ARow]); 
     end; 
     end; 

+0

對不起,延遲迴復......我出去了幾天。 當我使用你的代碼時,我有非常奇怪的字符串網格行爲。 我的列標題名稱在2行中突然變爲1,而在第二行中的部分名稱被部分切斷。整個列也不是隻有當我點擊它下面的單元格時纔會着色。我不知道如何在這裏張貼照片,所以我可以給你看... – user763539

+0

你如何張貼照片嗎?除了我原來的問題,我沒有這個選擇......「幫助」根本沒有幫助...... – user763539

+0

我的壞 - 我沒有意識到你正在使用第三方組件。我認爲使用AdvStringGrid可以非常容易地設置顏色。你不需要使用DrawCell程序。無法幫助圖片:( – bobonwhidbey

相關問題