Q&A

  • StringGrid의 Cell 입력 선택과 해제시의 특정형태로의 Cell 값처리
먼저 고수님들의 답변이 필요할 것 같군요



그리고 StringGrid에 관한 질답을 전부 보았는데도 이부분에 대해

언급이 없어서 질문올립니다.



StringGrid의 Cell에 값을 수정 입력할때 자세히 보면



StringGrid의 Edit가 가능한 특정 Cell을 마우스로 클릭하면

우선 점선으로 선택되고 다시 클릭하면 값이 반전선택되며 커서가 깜빡이고

값을 변경후 다른부분을 클릭하던지 엔터키를 치면 값이 입력되죠...



우선 제가 구현하고자 하는 StringGrid의 기능은



값이 '2,400,000'인 특정셀(아래소스:StringGrid1.Col = 5)을 마우스로 클릭하여

EditMode 상태(반전선택된 상태)에서는 '2400000'으로 바뀌고

다시 이값을 사용자가 '3000000'과 같이 다른 숫자값을 입력한후

마우스로 다른 부분(다른 셀, 다른 컨트롤...)을 클릭하면

다시 '3,000,000' 과 같은 형태로 바뀌도록 하려고 합니다.



요약하면 Cell에서 콤마가 들어있는 숫자 스트링을 입력할때는 콤마없는 형태로

입력받고 입력이 끝나면 다시 콤마가 들어간 형태로 값을 변환해 주는 것입니다.





물론 StringGrid의 OnKeyPress 함수에서 아래소스와 같이 처리하여

엔터키(key=#13)로는 구현이 되지만



마우스로 값이'2,400,000' 인 Cell을 클릭하여 OnClick 이벤트에서

'2400000'으로 바꾼뒤

마우스로 입력하고 있는 셀이 아닌 즉,다른부분(다른 셀, 다른 컨트롤...)을

클릭하였을때는 콤마가 들어있는 문자로 변환시킬 방법을 모르겠더군요



사용자들이 엔터키만 가지고 작업한다고 볼수 었잖아요...

값을 입력후 마우스로 다른 콘트롤을 클릭할 수 도 있을텐데

가령.. Cell값의 변경후 엔터키 없이 마우스로 '저장' 버튼을 바로 클릭할 수도

있잖아요?





-----------------------------------------

If (StringGrid1.Col = 5) and

(StringGrid1.EditorMode = False) and

(key = #13) then



StringGrid1.Cells[5,StringGrid1.Row] :=

InttoStr(CurrToInt(StringGrid1.Cells[5,StringGrid1.Row]));



//참고: 윗줄의 CurrToInt는 콤마형태의 숫자스트링을 콤마없는 형태의 숫자형으로

돌려주는 Function 입니다.





If (StringGrid1.Col = 5) and

(StringGrid1.EditorMode = True) and

(key = #13) then



StringGrid1.Cells[5,StringGrid1.Row] :=

FormatFloat('#,',StrToInt(StringGrid1.Cells[5,StringGrid1.Row]));

-------------------------------------------



부디 StringGrid에 대해 여러 이벤트를 처리해보신분

답변 부탁드립니다.



그리고 사실 StringGrid의 셀에 EditorMode 상태로 들어갈때의 이벤트와

나올때의 이벤트에 대해 알고싶기도 하군요....



그럼 긴내용 읽어주신 모든분께 감사드립니다.



2  COMMENTS
  • Profile
    김상호 2000.12.10 03:48
    아래 소스는 제가 프로그램한 것중에 OnDrawCell 이벤트에 추가 한것입니다.



    StringGrid 에서 이벤트를 벗어날때 수정모드에 있었다면 OnDrawCell을 실행하도록 되어

    있습니다. 그리고 제가 한 방법은 Cell 값자체는 콤마를 가지고 있지않은 값(2030000) 형식으로 가지고 있고 표시할 때만 (2,030,000) 형식으로 OnDrawCell이벤트에서 처리하도록 하였습니다.

    참고하세요..



    procedure TIndataF.SG1DrawCell(Sender: TObject; ACol,

    ARow: Integer; Rect: TRect; State: TGridDrawState);

    var

    L : integer;

    s : String;

    begin

    S := SG1.Cells[aCol,Arow];

    if S <>'' then begin

    with SG1.Canvas do begin

    FillRect(rect);

    if ((Acol =2) or (ACol =3) or (ACol=4)) and (Arow > 0) then begin

    try

    S := FormatFloat('#,##0',StrToint(s));

    except

    ShowMessage(S+'은 잘못된값입니다');

    Sg1.Cells[ACol,Arow] :='';

    s :='';

    end;

    L := (Rect.Right - TextWidth(S)) -2;

    end else begin

    if (Arow = 0) then

    L := (Rect.Right - Rect.Left-TextWidth(S)) Div 2 + Rect.Left

    else

    L := Rect.Left;

    end;

    TextOut(L,Rect.top+2,s);

    end;

    end;



    end;





    급궁금 wrote:

    > 먼저 고수님들의 답변이 필요할 것 같군요

    >

    > 그리고 StringGrid에 관한 질답을 전부 보았는데도 이부분에 대해

    > 언급이 없어서 질문올립니다.

    >

    > StringGrid의 Cell에 값을 수정 입력할때 자세히 보면

    >

    > StringGrid의 Edit가 가능한 특정 Cell을 마우스로 클릭하면

    > 우선 점선으로 선택되고 다시 클릭하면 값이 반전선택되며 커서가 깜빡이고

    > 값을 변경후 다른부분을 클릭하던지 엔터키를 치면 값이 입력되죠...

    >

    > 우선 제가 구현하고자 하는 StringGrid의 기능은

    >

    > 값이 '2,400,000'인 특정셀(아래소스:StringGrid1.Col = 5)을 마우스로 클릭하여

    > EditMode 상태(반전선택된 상태)에서는 '2400000'으로 바뀌고

    > 다시 이값을 사용자가 '3000000'과 같이 다른 숫자값을 입력한후

    > 마우스로 다른 부분(다른 셀, 다른 컨트롤...)을 클릭하면

    > 다시 '3,000,000' 과 같은 형태로 바뀌도록 하려고 합니다.

    >

    > 요약하면 Cell에서 콤마가 들어있는 숫자 스트링을 입력할때는 콤마없는 형태로

    > 입력받고 입력이 끝나면 다시 콤마가 들어간 형태로 값을 변환해 주는 것입니다.

    >

    >

    > 물론 StringGrid의 OnKeyPress 함수에서 아래소스와 같이 처리하여

    > 엔터키(key=#13)로는 구현이 되지만

    >

    > 마우스로 값이'2,400,000' 인 Cell을 클릭하여 OnClick 이벤트에서

    > '2400000'으로 바꾼뒤

    > 마우스로 입력하고 있는 셀이 아닌 즉,다른부분(다른 셀, 다른 컨트롤...)을

    > 클릭하였을때는 콤마가 들어있는 문자로 변환시킬 방법을 모르겠더군요

    >

    > 사용자들이 엔터키만 가지고 작업한다고 볼수 었잖아요...

    > 값을 입력후 마우스로 다른 콘트롤을 클릭할 수 도 있을텐데

    > 가령.. Cell값의 변경후 엔터키 없이 마우스로 '저장' 버튼을 바로 클릭할 수도

    > 있잖아요?

    >

    >

    > -----------------------------------------

    > If (StringGrid1.Col = 5) and

    > (StringGrid1.EditorMode = False) and

    > (key = #13) then

    >

    > StringGrid1.Cells[5,StringGrid1.Row] :=

    > InttoStr(CurrToInt(StringGrid1.Cells[5,StringGrid1.Row]));

    >

    > //참고: 윗줄의 CurrToInt는 콤마형태의 숫자스트링을 콤마없는 형태의 숫자형으로

    > 돌려주는 Function 입니다.

    >

    >

    > If (StringGrid1.Col = 5) and

    > (StringGrid1.EditorMode = True) and

    > (key = #13) then

    >

    > StringGrid1.Cells[5,StringGrid1.Row] :=

    > FormatFloat('#,',StrToInt(StringGrid1.Cells[5,StringGrid1.Row]));

    > -------------------------------------------

    >

    > 부디 StringGrid에 대해 여러 이벤트를 처리해보신분

    > 답변 부탁드립니다.

    >

    > 그리고 사실 StringGrid의 셀에 EditorMode 상태로 들어갈때의 이벤트와

    > 나올때의 이벤트에 대해 알고싶기도 하군요....

    >

    > 그럼 긴내용 읽어주신 모든분께 감사드립니다.

    >

  • Profile
    급궁금 2000.12.11 01:50
    직접 해보고 StringGrid에 입력되는 값을 콤마없이 입력해놓고

    DrawCell 이벤트의 내용을 부꾸어 보니 정답이네요...

    답변 감사합니다.