아래 예제는 DBGrid에서 조건을 만족하는 값에 색을 입히는 코딩입니다.
저의 경우 조건을 찾아야 하는 필드가 많은데(약30개) 이런식(if~else로 계속 묶는...)의 코딩이 문제가 되지 않는지 하는지하구
마지막에 그리기 영역을 설정하여 필드의 값을 입력할때 스트링형으로 그려지는 데이터를 오른쪽 정렬이 가능한지 입니다.
고수님들의 따뜻한 답변 기다리겠습니다.
with TDBGrid(Sender).Canvas do begin
if Column.FieldName = 'GGcha' then begin
if MainTGGcha.Value < 0 then
Font.Color := clred;
end
else if Column.FieldName = 'GGgocha' then begin
if MainTGGgocha.Value < 0 then
Font.Color := clred;
end
else begin
Brush.Color := clWindow;
Font.Color := clWindowText;
end;
if (gdFocused in State) or (gdSelected in State) then begin
Brush.Color := clHighlight;
Font.Color := clHighlightText;
end;
FillRect(Rect);
TextOut(Rect.Left+2,Rect.Top+2,Column.Field.AsString);
Brush.Style := bsSolid;
Brush.Color := clWindow;
에고~ 에고~ 두가지가 있다고 했는데 한가지만 설명드렸네요. 날이 갈수록
머리가 퇴화하는 느낌이 듭니다. 서러워라...
RTTI 함수를 사용하여 스트링을 열거형 인덱스로 변환한 후 case 라벨로 사용합니다.
아래에서 쓸 함수들입니다. TypInfo유닛에 들어있습니다. 델파이 헬프에는 안나
오네요.
case문에서 쓸 두가지 함수의 프로토타입입니다.
// Ordinal 값으로 열거형타입 문자열을 구한다.
// 아래의 TStringSet인 경우 Value에 0을 주면 First를 돌려줍니다.
function GetEnumName(TypeInfo: PTypeInfo; Value: Integer): string;
// 문자열로 열거형타입 Ordinal 값을 구한다.
// 아래의 TStringSet인 경우 Name에 First를 주면 0을 돌려줍니다.
function GetEnumValue(TypeInfo: PTypeInfo; const Name: string): Integer;
uses TypInfo; // TypInfo 유닛 추가
type
TStringSet = (First, Second, Third); // case 라벨로 쓸 문자열을 열거형으로 선언
procedure TestString(StrIn: String); // StrIn - Case 라벨로 쓸 문자열
var
CaseLabel: TStringSet;
begin
CaseLabel := TStringSet(GetEnumValue(TypeInfo(TStringSet), StrIn));
case CaseLabel of
// ShowMessage 출력 - 1: First
First : ShowMessage('1: '+ GetEnumName(TypeInfo(TStringSet),
Ord(CaseLabel)));
// ShowMessage 출력 - 2: Second
Second : ShowMessage('2: '+ GetEnumName(TypeInfo(TStringSet),
Ord(CaseLabel)));
// ShowMessage 출력 - 3: Third
Third : ShowMessage('3: '+ GetEnumName(TypeInfo(TStringSet),
Ord(CaseLabel)));
else
ShowMessage('라벨에 없는 문자열입니다.');
end;
end;
위의 RTTI함수를 쓰니까 컨트롤의 프로퍼티를 스트링으로 바꾸는것이 간단하게
되더군요.
Label1.Caption := GetEnumName(Typeinfo(TAlignment), Ord(label1.Alignment));
위와 같이 하면 Label1의 캡션을 'taLeftJustify' 이런식으로 표현할 수 있습니다.
main code written by Peter Below (TeamB)
강인규 wrote:
> 아래 예제는 DBGrid에서 조건을 만족하는 값에 색을 입히는 코딩입니다.
> 저의 경우 조건을 찾아야 하는 필드가 많은데(약30개) 이런식(if~else로 계속 묶는...)의 코딩이 문제가 되지 않는지 하는지하구
>
> 마지막에 그리기 영역을 설정하여 필드의 값을 입력할때 스트링형으로 그려지는 데이터를 오른쪽 정렬이 가능한지 입니다.
>
> 고수님들의 따뜻한 답변 기다리겠습니다.
>
> with TDBGrid(Sender).Canvas do begin
> if Column.FieldName = 'GGcha' then begin
> if MainTGGcha.Value < 0 then
> Font.Color := clred;
> end
> else if Column.FieldName = 'GGgocha' then begin
> if MainTGGgocha.Value < 0 then
> Font.Color := clred;
> end
> else begin
> Brush.Color := clWindow;
> Font.Color := clWindowText;
> end;
>
> if (gdFocused in State) or (gdSelected in State) then begin
> Brush.Color := clHighlight;
> Font.Color := clHighlightText;
> end;
> FillRect(Rect);
> TextOut(Rect.Left+2,Rect.Top+2,Column.Field.AsString);
> Brush.Style := bsSolid;
> Brush.Color := clWindow;