2012-03-05 6 views
1

저는 Lazarus 0.9.30.2를 사용하고 있습니다.TStringGrid의 모든 열 제목 셀을 어떻게 색칠 할 수 있습니까?

TStringGrid가있는 TForm이 있습니다. 각 열 제목은 런타임에 그리드에 동적으로 추가 한 TGridColumns 개체입니다. 각 열 제목에는 그와 연관된 객체 (내가 작성하여 TList에 저장 한 객체)가 있습니다. 문자열 격자의 열 제목 셀의 배경을 페인트하고 싶지만 모든 셀이 같은 색이되는 것은 원하지 않습니다. 열 제목과 연관된 개체의 속성 중 하나의 값에 따라 색이 달라집니다.

Stackoverflow (example)에서 TStringGrid 셀을 그리는 방법에 대한 답변이 있다는 것을 알고 있습니다. 그리드 문자열 DrawCell 이벤트를 사용하여 셀을 그리는 방법에 대해 이야기하지만이 절차를 호출하는 방법을 모르겠습니다.

관심있는 셀 (즉, 셀의 'Rect'속성 식별)을 식별하고 원하는 색상을 설정 한 다음 그리드의 일반적인 DrawCell 프로 시저를 호출하여 실제 작업을 수행하는 올바른 절차가 있습니까? 착색?

답변

2

이 목적으로 더 좋은 이벤트 인 OnPrepareCanvas이 있습니다. 이 이벤트는 셀이 자체 그리기를 준비하고있을 때마다 시작되며 배경을 그림하기위한 브러시 색상과 같은 일부 캔버스 특성을 수정할 수 있습니다. OnPrepareCanvas 이벤트가 표시

procedure TForm1.StringGrid1PrepareCanvas(sender: TObject; aCol, aRow: Integer; 
    aState: TGridDrawState); 
var 
    ColumnTitle: TTmColumnTitle; 
begin 
    if ARow = 0 then 
    begin 
    ColumnTitle := TTmColumnTitle(StringGrid1.Objects[ACol, ARow]); 
    if Assigned(ColumnTitle) then 
     StringGrid1.Canvas.Brush.Color := ColumnTitle.CellColor; 
    end; 
end; 

오브젝트 인스펙터와 함께 :

type 
    TTmColumnTitle = class(TTmObject) 
    private 
    FCellColor: TColor; 
    public 
    property CellColor: TColor read FCellColor write FCellColor; 
    end; 

그리고 OnPrepareCanvas 이벤트에 대한 처리기를 작성 : 그래서 당신이 필요 어딘가에 색상을 저장하는 것입니다

+0

감사합니다 대답은. 그리드 열을로드하고 TForm1.Create 생성자의 일부로 셀에 TTmColumnTitle 개체를 할당합니다. OnPrepareCanvas 이벤트는 TForm1.Create보다 먼저 호출되므로 'ColumnTitle : = TTmColumnTitle (StringGrid1.Objects [ACol, ARow])'는 Nil 개체를 반환합니다. OnPreparecanvas 이벤트 이전에 그리드 열로드를 이동하는 방법이 있습니까? 아니면 TForm1.Create 후에이 이벤트를 어떻게 든 트리거 할 수 있습니까? – user1174918

+1

폼의'OnCreate' 이벤트는 문자열 그리드의'OnPrepareCanvas' 전에 한 번 실행됩니다. 'OnPrepareCanvas'는 그린 될 때 각 셀에 대해 실행됩니다. 한번만 실행되는 것이 아니라 셀이 시각적 리프레쉬를 필요로 할 때마다 실행됩니다. 해고 될 이벤트를 호출하는 방법에 대한 질문에 예를 들어 'StringGrid1.DrawRow (0);',하지만 설명하는 것은 이상합니다. 이벤트는 구성 요소에 의해 자동으로 실행됩니다. 핸들러에서 수행되는 코드 만 작성합니다. – TLama

+1

구성 요소 이벤트 처리를 잘못 이해했다고 생각합니다. ['이 튜토리얼'] (http://delphi.about.com/od/beginners/l/aa052802b.htm). 또한 폼의 생성자를 재정의 할 필요도 없으므로 이벤트 처리기를 작성해야합니다 (내 대답의 스크린 샷 참조). 마우스로 폼을 선택하기 만하면,'Object Inspector','Events' 탭으로 가서'OnCreate'에서'...'버튼을 클릭하고 코드를 작성하십시오. – TLama