2016-08-11 4 views
2

MyDAC-SQL-Query가 RowSelect로 설정된 dbGrid가 있습니다. 하나의 열에 위치 문자열이 들어 있고 각 위치에 대해 여러 행이있을 수 있습니다.DrawColumnCell의 이전 행에서 값 가져 오기

내가 원하는 것은 시각적 피드백을 제공하여 서로 다른 위치를 더 잘 구분할 수있게하는 것입니다. 그래서 첫 번째 위치에 행이

example

내가 모든 두 번째 행에 다른 배경을 제공하는 방법을 알고 등등 흰색 배경 및 두 번째 회색 하나, 흰색 세 번째,와 ...해야 ,하지만 나는 어떤 행이 바뀌는지를 감지하려고 힘들다.

따라서 DrawColumnCell 절차에서 변경을 감지하기 위해 이전 행의 위치 값을보고 싶습니다. 나는 그것을 어떻게 얻을 수 있습니까?

답변

2

이전 필드의 값을 저장하고 새 색상이 필요한지 여부를 결정하기 위해 일부 논리를 구현해야합니다.

빠른 예입니다. 이를 설정하려면 몇 단계 만 거치면됩니다. 간단하게 비어있는 새 VCL 양식 응용 프로그램부터 시작했습니다.

    TClientDataSet을 양식에 놓고 그 이름을 CDS로 변경하십시오.
  • TDataSource를 추가하고 DataSet을 CDS로 설정하십시오.
  • 다음으로 TDBGrid를 추가하고 데이터 소스를 DataSource1로 설정하십시오.
  • DBGrid.DefaultDrawing을 False로 변경하십시오.
  • 형태의 private 부분에 세 개의 새로운 변수를 추가

    procedure TForm1.FormCreate(Sender: TObject); 
    var 
        i: Integer; 
    begin 
        // One field dataset, with the exact same cities and rows 
        // you've shown in your question 
        CDS.FieldDefs.Add('City', ftString, 10); 
        CDS.CreateDataSet; 
        for I := 1 to 3 do 
        CDS.AppendRecord(['London']); 
        for i := 1 to 2 do 
        CDS.AppendRecord(['Paris']); 
        CDS.AppendRecord(['Berlin']); 
        for i := 1 to 2 do 
        CDS.AppendRecord(['New York']); 
        CDS.Open; 
    
        // Initialize variables for first use 
        LastCity := ''; 
        SameColor := False; 
        SameCity := False; 
    end; 
    
  • 추가 :

    private 
        SameCity, SameColor: Boolean; 
        LastCity: string; 
    
  • 가 변수 데이터를 설정하고 초기화하는 형태의 OnCreate 이벤트에 다음 코드를 추가합니다 이벤트의 DBGrid에 대한 이벤트 처리기이며 다음 코드를 사용합니다.

    procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; 
    Field: TField; State: TGridDrawState); 
    const 
        RowColors: array[Boolean] of TColor = (clWindow, clLtGray); 
    begin 
        // See if we're on the same city as the last row, and save the 
        // value in the current row for use next row. 
        SameCity := (Field.AsString = LastCity); 
        LastCity := Field.AsString; 
    
        // If they weren't the same, toggle the color value 
        if not SameCity then 
        SameColor := not SameColor; 
    
        // Set the row color and tell the grid to draw the row 
        (Sender as TDBGrid).Canvas.Brush.Color := RowColors[SameColor]; 
        (Sender as TDBGrid).DefaultDrawDataCell(Rect, Field, State); 
    end; 
    
    DBGrid를 완전히 그 그리기의 처리됩니다 그래서, OnDrawDataCell 대신 OnDrawColumnCell이 머리글 행 또는 고정 칼럼에서 호출되지 않기 때문에 을 사용했습니다

.

응용 프로그램을 실행하면 이러한 결과가 생성됩니다.

Grid drawn with colored sets of rows

+0

도움 주셔서 감사합니다. 불행히도'CDS.CreateDataSet;을 호출 할 때 액세스 위반이 발생합니다. 이것은 그리드를 채우기위한 것일 뿐이므로 내 기본 프로젝트에 코드를 구현하려고했습니다. 그러나 DrawDataCell은 호출되지 않습니다 ... –

+1

1) 디자인 타임에 ClientDataSet을 폼에 드롭해야합니다. 2) DBGrid.DefaultDrawing을 False로 설정해야합니다. 게시하기 전에 코드를 컴파일하고 실행했습니다 (화면 캡처 방법). 지침을 제대로 따르면 제대로 작동합니다. –

+0

글쎄, 나는 그 모든 것을했다. 델파이 버전에서 뭔가 다른 점이 있습니까? 나는 XE5를 사용하고 있습니다. –