Q&A

  • DBGrid 색변경 고수님의 도움이 필요합니다.
아래 예제는 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;

2  COMMENTS
  • Profile
    최용일 2000.04.08 10:52
    안녕하세요. 최용일입니다.



    에고~ 에고~ 두가지가 있다고 했는데 한가지만 설명드렸네요. 날이 갈수록



    머리가 퇴화하는 느낌이 듭니다. 서러워라...



    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;

  • Profile
    최용일 2000.04.08 08:15
    안녕하세요. 최용일입니다.



    오른쪽 정렬은 아래와 같이 텍스트 출력하는 부분만 약간 수정하시면 될것 같습니다.



    var

    LeftPos: Integer;



    begin

    ...

    LeftPos := Rect.Right - TDBGrid(Sender).Canvas.TextWidth(Column.Field.AsString);

    TextOut(LeftPos-2, Rect.Top+2, Column.Field.AsString);

    ..

    end;



    아래와 같은 두세번 정도의 중첩 if 문은 별문제 없을것 같은데요. 근데 30개정도의



    if문이 한꺼번에 중첩된다면 case문이 더 나을것 같습니다. 제가 며칠전에 웹서핑하



    면서 발견한 건데 아실지 모르겠는데요. 스트링을 가지고도 case문을 만들수 있더군요.



    전 첨 알았습니다. 하나는 열거형을 쓰는 것이고 이건 라벨이 좀 적을때 좋겠더군요.



    하난 TStringList를 이용하는 건데 둘 다 훌륭하더군요. 아랜 인터넷에서 퍼 온



    글입니다. 어딘진까먹었네요. 델파이3000이던가...



    TStringList(or TStrings)를 이용한 case문



    var

    SelectStrings: TStringList;



    ...



    { Initialization }

    SelectStrings := TStringList.Create;

    SelectStrings.Add('First');

    SelectStrings.Add('Second');

    SelectStrings.Add('Third');



    ...



    { Use it }



    case SelectStrings.IndexOf(sPassedString) of

    0: //First

    begin



    end;

    1: //Second

    begin



    end;

    2: //Third

    begin



    end;

    end;



    ...

    { Finalization }

    SelectStrings.Free;





    TStringList(or TStrings)를 이용한 case문 - case sensitive comparison



    SelectStrings.Add(AnsiUpperCase('First'));

    SelectStrings.Add(AnsiUpperCase('Second'));

    SelectStrings.Add(AnsiUpperCase('Third'));



    case SelectStrings.IndexOf(AnsiUpperCase(sPassedString)) of

    ...

    end;



    NOTE:

    영어이외의 다른나라 문자를 위해서 UpperCase대신 AnsiUpperCase사용을 권장.

    좀더 효율적인 IndexOf검색을 위하여: 알파벳 순서로 스트링 삽입,



    TStringList.Sorted를 True로 하기를 권장



    프로젝트가 커지면서 수 많은 case 라벨을 추가/삭제하게 되는데 이러한 작업에는 상당



    한 주의가 필요하고 매번 case 라벨을 바꾸어 주어야 한다. 이러한 문제를 미연에 방지



    하기위한 미래지향적인 방법은 Add메소드 대신에 AddObject를 사용하여 case 라벨로 쓰



    는 스트링에 인덱스를 추가하는 것이다. 리스트에 들어간 인덱스는 Objects[]프로퍼티



    를 참조한다. 아래는 Add대신에 AddObject를 사용했다.



    SelectStrings.AddObject('First', Pointer(0));

    SelectStrings.AddObject('Second', Pointer(1));

    SelectStrings.AddObject('Third', Pointer(2));

    SelectStrings.Sorted := True; // 빠른 검색을 위해서 리스트를 정렬한다.



    case Integer(SelectStrings.Objects[SelectStrings.IndexOf(sPassedString)]) of

    ...

    end;



    혹은



    iNdx := SelectStrings.IndexOf(sPassedString);

    if iNdx >= 0 then begin

    case Integer(SelectStrings.Objects[iNdx]) of

    ...

    end {case}

    end

    else begin

    < sPassedString not in SelectStrings >

    end;



    강인규 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;

    • hj998811
    • 2000.04.08 21:12
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 윤진화
      2000.04.11 06:09
      제 나름대로 간략한 그림그리기 기법을 통해서 그 그려진 그림을 BMP파일로 저장하는 예제를 아래에 올립...
    • 정상락
      2000.04.15 02:13
      윤진화씨 정말로 감사합니다. 덕분에 간단하게 해결이 되었습니다. 진심으로 감사드리며 좋은 하루가 되...
    • 장민석
    • 2000.04.08 20:46
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이치형
      2000.04.08 21:19
      장민석 wrote: > 잘되던 프로그램이었는데 IP를 바꾸고 나서 다음과 같은 error 가 뜨네요 > 해결방법은 ...
    • 강동길
    • 2000.04.08 20:39
    • 3 COMMENTS
    • /
    • 0 LIKES
    • OD
      2000.04.09 03:08
      안녕하세요. OD입니다. OnDataChange Event의 맨 처음 부분에 다음을 추가해 보세요. if Field = nil the...
    • 이치형
      2000.04.08 21:33
      강동길 wrote: > 사용환경 : WIN98, DELPHI 4, MS-SQL SERVER 7.0 > 안녕하세요... > 실력이 미흡하여 ...
    • 강동길
      2000.04.08 22:32
      이치형님 답변에 감사드립니다. 에러 위치는 알고 있는데 왜 에러가 나는지 잘 모르거든요... qry_nego...
    • 창백한달빛
      2000.04.08 20:49
      hee wrote: > 제목 그대로 입니다. bde나 odbc를 이용하지 않고 직접 연결 하는 방법이 없나해서요. ...
    • 조규춘
      2000.04.08 20:55
      타락천사 wrote: > 안녕하세여.. 타락임다.. 꾸벅.. > > 한델에서 열쒸미 배우고 있섭니다.. 감사함다....
    • 이치형
      2000.04.08 21:10
      타락천사 wrote: > 안녕하세여.. 타락임다.. 꾸벅.. > > 한델에서 열쒸미 배우고 있섭니다.. 감사함다....
    • 타락천사
      2000.04.08 21:06
      안녕하세여.. 타락임다.. ^^ 3개 이상의 조합키가 궁금했는데, 해보니까 돼더군여..^^ ..님 감사합니...
    • 사노테
    • 2000.04.08 19:37
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이치형
      2000.04.08 20:58
      사노테 wrote: > BDE Administrator을 써서 DataBase DB 라고 하나 만들어 넣고여.. > 아무것두 안하구 ...
    • 타락천사
      2000.04.08 23:56
      안녕하세여. 타락임다.. 꾸벅... 흠.. ..님이 답변해 주셨는데, 제 질문은 그게 아니였는데.. ^^;;;; ...
    • 타락천사
      2000.04.09 02:58
      안녕하세여.. 타락임다.. 꾸벅.. ShortString 과 AnsiString을 구분해서 써야해여.. 제가 통신에 쓰...
    • 황 현
    • 2000.04.08 19:03
    • 0 COMMENTS
    • /
    • 0 LIKES
    • mr.Q
    • 2000.04.08 12:16
    • 3 COMMENTS
    • /
    • 0 LIKES
    • mr.Q
      2000.04.08 13:18
      헉~ i1이 하나의 변수인데, 제가 잘못봤습니다. 죄송~
    • 최용일
      2000.04.08 12:32
      울랄랄라~ 델파이 6이 새로 나왔나 보네요... 저두 하나 보내주세요... 델파이 1~5까진 안되는 내용인데...
    • mr.Q
      2000.04.08 12:48
      헉~~ 아직 안주무시나요? 무지 배고픈 밤이네요. ^^ 저 코드를 쓴 사람은, 델4를 썼는데, 문법을 개조한 ...
    • mr.Q
      2000.04.08 12:43
      이렇게 하니 되는군요. implementation {$R *.DFM} var keyTag:integer; procedure TForm1...
    • mr.Q
      2000.04.08 13:16
      일부 수정 mr.Q wrote: > > 이렇게 하니 되는군요. > > implementation > > {$R *.DFM} > va...
    • 이용현
    • 2000.04.08 08:33
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2000.04.08 23:01
      안녕하세요. 최용일입니다. constructor는 객체에 인스턴스를 링크시키는 역활을 할 뿐 어떤 에러 코드...
    • 음냐~
      2000.04.08 08:47
      이 질문은 밑빠진 독에 불부으면 물이 가득차냐는 질문이랑 같습니다. 이용현 wrote: > TFilestream.Cr...
    • 강인규
    • 2000.04.08 07:19
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2000.04.08 10:52
      안녕하세요. 최용일입니다. 에고~ 에고~ 두가지가 있다고 했는데 한가지만 설명드렸네요. 날이 갈수록 ...
    • 최용일
      2000.04.08 08:15
      안녕하세요. 최용일입니다. 오른쪽 정렬은 아래와 같이 텍스트 출력하는 부분만 약간 수정하시면 될것 ...
    • 황현동
    • 2000.04.08 05:28
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 조규춘
      2000.04.08 06:17
      황현동 wrote: > 무슨 키 누르면 뭐해라 (폼에서) > > 대충 아주 간단한 예제라도 하나 알려주세요 ...
    • 황현동
    • 2000.04.08 05:26
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2000.04.08 23:16
      안녕하세요. 최용일입니다. FindFirst, FindNext, FindClose함수를 이용하면 구현하실 수 있습니다. ...