2011-04-07 8 views
1

선택한 행 (최대 1, 다중 선택 없음)이 항상 다른 배경 colo (u) r을 가져야하는 TStringGrid가 있습니다.TStringGrid에서 선택한 행의 배경색 설정

DefaultDrawing 속성을 false로 설정하고 아래에 표시된 OnDrawCell 이벤트에 대한 메서드를 제공합니다. 그러나 작동하지 않습니다. 어떻게 작동하지 않는지도 정확히 설명 할 수는 없습니다. 내가 할 수만 있다면 나는 이미 문제를 해결했을 것이라고 생각합니다. 모든 배경색이 같은 전체 행을 갖는 대신에 mish-mash라고 말하면 충분합니다. 다중 행에는 "선택됨"색상의 일부 셀이 있고 선택된 색상의 모든 셀에는 선택한 색상이 적용되지 않습니다.

셀의 행을 스트링 그리드의 행과 비교합니다. 선택한 행의 셀만 선택 되었기 때문에 선택한 셀 상태를 확인할 수 없습니다.

procedure TForm1.DatabaseNamesStringGridDrawCell(Sender: TObject; 
               ACol, ARow: Integer; 
               Rect: TRect; 
               State: TGridDrawState); 

    var cellText :String; 
begin 
    if gdFixed in State then 
     DatabaseNamesStringGrid.Canvas.Brush.Color := clBtnFace 
    else 
    if ARow = DatabaseNamesStringGrid.Row then 
     DatabaseNamesStringGrid.Canvas.Brush.Color := clAqua 
    else 
     DatabaseNamesStringGrid.Canvas.Brush.Color := clWhite; 

    DatabaseNamesStringGrid.Canvas.FillRect(Rect); 
    cellText := DatabaseNamesStringGrid.Cells[ACol, ARow]; 
    DatabaseNamesStringGrid.Canvas.TextOut(Rect.Left + 2, Rect.Top + 2, cellText); 
end; 
+1

Mawg,이 주제는 아니지만 clAqua가 이상하게 보일 것입니다. 매우 선명한 색상입니다! 강조 표시된/선택된 객체를 나타내는 시스템 색상이므로 clHighlight를 대신 사용해보십시오. –

+0

배경색을 설정할 경우 전경색을 명시 적으로 설정해야합니다. AFAICT는 clAqua BG를 clWindowText FG와 결합하고 후자는 시스템의 그래픽 설정을 통해 사용자가 변경할 수 있습니다. –

답변

4

다른 색상으로 선택한 행이나 셀을 페인트하려면 state var의 gdSelected 값을 확인해야합니다.

procedure TForm1.DatabaseNamesStringGridDrawCell(Sender: TObject; 
               ACol, ARow: Integer; 
               Rect: TRect; 
               State: TGridDrawState); 
var 
    AGrid : TStringGrid; 
begin 
    AGrid:=TStringGrid(Sender); 

    if gdFixed in State then //if is fixed use the clBtnFace color 
     AGrid.Canvas.Brush.Color := clBtnFace 
    else 
    if gdSelected in State then //if is selected use the clAqua color 
     AGrid.Canvas.Brush.Color := clAqua 
    else 
     AGrid.Canvas.Brush.Color := clWindow; 

    AGrid.Canvas.FillRect(Rect); 
    AGrid.Canvas.TextOut(Rect.Left + 2, Rect.Top + 2, AGrid.Cells[ACol, ARow]); 
end; 
+0

* 확실 *할까요? 나는 너와 내가 과거에 나에게 주었던 도움에 대해 대단한 경의를 표한다. * 그러나 * 확실히 한 셀을 클릭하면 그 셀만이 선택된다. 전체 행이 아닌가요? 그것이 (나는 의심 스럽지만) 내 코드로 무엇이 worng인지? 똑같은 것을 지정하는 두 가지 방법이 아닌가? 왜 작동하지 않습니까? – Mawg

+1

Uff, @Mawg 당신이 무엇을 의미하는지 이해하지 못한다. 제공된 응답에서 선택된 행이나 셀 ('Options' 속성에서'goRowSelect'를 설정하는 것에 따라 다름)은 당신이 선택하는 색으로 그려진다. 이 사건을 'claqua'라고 말하면서 다른 것을 만들려면 당신의 질문을 다시 말해야합니다. – RRUZ

+1

달성해야 할 것이 무엇인지 설명하기 어려운 경우 질문에 표본 이미지를 구현하고 원하는 구현 방식을 적용 할 수 있습니다 (그림은 수천 단어의 가치가 있습니다). 두 가지 모두의 경우 – RRUZ

2

런타임 테마를 사용하도록 설정 했습니까? 런타임 테마는 Windows Vista 이상을 위해 적용하려는 모든 색 구성표보다 우선합니다.

+0

XP,하지만 어쨌든, 확실하게 세포가 선택되는 "splodgy"방식을 설명하지 못했을까요? 네가 옳다면 주어진 열의 각 셀이 똑같이 보이지 않을까? – Mawg

2

문자열 그리드에서 새 셀을 선택한 경우 이전 셀과 선택한 새 셀만 무효화됩니다. 따라서 이전 행과 새 행의 나머지 셀은 다시 그려지지 않으므로 설명하는 효과가 나타납니다.

한 가지 해결 방법은 영향을받는 두 행 모두에 대해 InvalidateRow를 호출하는 것이지만이 방법은 보호 된 방법이므로 OnSelectCell 이벤트 처리기에서이 메서드에 도달하는 방법을 찾아야합니다. 델파이 버전에 따라 다양한 방법으로이를 수행 할 수 있습니다.

가장 깨끗한 방법은 TStringGrid에서 파생되는 것이지만 대부분의 경우 가능하지 않습니다. 새로운 Delphi 버전을 사용하면 클래스 도우미를 사용하여이를 수행 할 수 있습니다. 그렇지 않으면 보통 protected hack에 의지해야합니다.

2

이 날

procedure TFmain.yourStringGrid(Sender: TObject; ACol, ARow: Integer; Rect: TRect; 
    State: TGridDrawState); 
var 
    md: integer; 
begin 
    with yourStringGrid do 
    begin 
      if yourStringGrid,Row = ARow then 
       Canvas.Brush.Color:= clYellow //your highlighted color 
      else begin 
       md := Arow mod 2; 
       if md <> 0 then Canvas.Brush.Color:= $00BADCC1 else //your alternate color 
       Canvas.Brush.Color:= clwhite; 
      end; 
      Canvas.FillRect(Rect); 
      Canvas.TextOut(L, Rect.top + 4, cells[ACol, ARow]); 
     end; 
end; 

그리드를

procedure TFmain.yourStringGridClick(Sender: TObject); 
begin 
    yourStringGrid.Refresh; 
end; 

주 새로 고침 작동 : 약간의 대기 시간을 가지고 있지만, 그렇지 않으면 잘 작동합니다.
(Delphi XE2에서 사용)

관련 문제