2011-02-24 5 views
1

Access db 데이터베이스의 테이블에 ADO를 통해 dbgrid 바인딩 된 Delphi 2010을 사용하고 있습니다.델파이 OnDrawColumnCell 사용하기 조건부 포맷을 적용하기 전에 레코드 값을 확인하는 방법은 무엇입니까?

이 테이블은 라디오 그룹 상자의 클릭을 기준으로 필터링됩니다.

코드 색상 코드를 테이블의 데이터를 기반으로 행을 다음 있지만, 필터가 널 데이터 집합을 반환하는 경우

 "" is not a valid integer value 

을 알리는 오류 대화 상자와 함께 실패합니다. 레코드가 반환되지 않았지만 작동하지 않는 것으로 판단되면 컬러 설정을 호출하지 못하게 할 수 있다고 생각했습니다. 아래 코드를 참조하십시오.

procedure TMainForm.DBGridAbsenceDrawColumnCell(Sender: TObject; 
    const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); 
begin 
    //Need to add code to detect if record exists 
    with DBGridAbsence.Canvas do 
    begin 
      RecordCountLabel.Caption.Text := 'Absence Records: ' + IntToStr(ADOTblAbsence.RecordCount); 
      font.color:=clBlack; 
      brush.color:=clMoneyGreen; 
      If (ADOTblAbsence.State <> dsInsert) and (ADOTblAbsence.RecordCount > 0) then 
      begin 
       Font.Color := StringToColor(ADOTblAbsenceForeground.AsString); 
       Brush.Color:= StringToColor(ADOTblAbsenceBackground.asstring); 
      end; 

      DBGridAbsence.DefaultDrawColumnCell(Rect, DataCol, Column, State); 
    end; 
end; 

모든 도움을 주신 모든 분들께 감사드립니다. 참고

if Trim(ADOTblAbsenceForeground.AsString) <> '' 

과 같은 조건부도 시도했지만이 역시 작동하지 않습니다.

답변

2

빈 문자열을 정수로 변환하려고하면 ""유효한 정수 값이 아닙니다라는 메시지가 표시됩니다. 코드 샘플에는 관련있는 것으로 보이는 것이 없습니다. 그래서 당신이 우리에게 보여주지 않은 코드 나 완전히 다른 코드에서 호출해야하는 코드가 있어야합니다.

StringToColor가 후보가 될 수 있습니다. 해당 열에 값이 비어 있으면 해당 메시지가 트리거되는 방식입니다. 따라서 테이블 브라우저 또는 데이터베이스 관리 프로그램 소프트웨어로 db 값을 점검하십시오.

또한 StrToInt를 수행하기 전에 이러한 다양한 시나리오를 모두 확인하는 대신 StrToInt를 둘러싼 try 블록을 사용하여 StrToIntDef를 사용할 수 있으며 예외가 발생하면 사용자가 제공하는 기본값을 반환합니다.

SomeInt := StrToIntDef(SomeString, 0); 
+0

귀하의 코드 샘플이 있어야한다 ** StrToIntDef **하지 ** StrToInt **. 3 자이기 때문에 직접 편집 할 수 없습니다. – stukelly

+0

@stukefly : 오, 감사합니다 !!! –

0

나는 절차의 시작 부분에 빈되는 데이터 세트에 대한 테스트에 의해 시작 했죠 :

procedure TMainForm.DBGridAbsenceDrawColumnCell(Sender: TObject; 
    const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); 
begin 
    if not DBGridAbsensce.DataSet.IsEmpty then 
    begin 
    //Need to add code to detect if record exists 
    with DBGridAbsence.Canvas do 
    begin 
     RecordCountLabel.Caption.Text := 'Absence Records: ' + 
       IntToStr(ADOTblAbsence.RecordCount); 
     font.color:=clBlack; 
     brush.color:=clMoneyGreen; 
     If (ADOTblAbsence.State <> dsInsert) then 
     begin 
     Font.Color := StringToColor(ADOTblAbsenceForeground.AsString); 
     Brush.Color:= StringToColor(ADOTblAbsenceBackground.asstring); 
     end; 
    end; 
    end; 
    DBGridAbsence.DefaultDrawColumnCell(Rect, DataCol, Column, State); 
end;