Q&A

  • 스트링그리드 방향키이동시...
안녕하세요.
월요일 아침이구.. 내일은 휴일인데... 근데 비가 오시네요...

다름이 아니라 뭐좀 여쭐려구요.

StringGrid를 이용해서, 데이타를 직접 입려하는 프로그램이 하나 있습니다.
칼럼이 자그마치 150개 정도의 칼럼으로 구성되어있구요...
입력및 수정을 위해서 몇개의 칼럼의 길이가 0으로 해서 들어가 있습니다.
값을 읽어가면서 해야 하는 업무인지라..

근데.. 문제는 이 스트링그리드의 이동시 colwidths[xcol] := 0 으로 해놓은 칼럼에
포커스가 가서, 방향키로 이동시 (<-, -> ) 컬럼의 이동시 포커스가 보였다 않보였다 하는겁니다.
colwidths[xcol]:=0 이면 포커스가 숨었다가, colwidths[xcol] >0 인 컬럼에는 포커스가
보인다는 거죠...ㅠ.ㅠ

colwidths[col] := 0 일때 포커스를 아예가지 않게 하고, 다음 colwidths[xcol]>0 인
컴럼에 포커스를 보내려구 하는데... 간단한줄 알구 뒤로 미뤘더니.. 골치네요..

전체 스트링 그리드의 옵션은 goEditing 이 true 로 설정된 상태입니다.

도움 주실 분들께 감사드립니다. 끝. ~
1  COMMENTS
  • Profile
    Joe Cho 2007.07.20 19:39
    unit Unit1;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Grids, StdCtrls, Buttons;

    type
      TForm1 = class(TForm)
        StringGrid1: TStringGrid;
        BitBtn1: TBitBtn;
        procedure FormCreate(Sender: TObject);
        procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
      private
        { Private declarations }
        FPrevCol: integer;
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      StringGrid1.ColWidths[2] := 0;   //for testing purposes
      FPrevCol := 1;  //the first collumn: this should be changed if the first column's width is 0
    end;

    procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
    begin
      if StringGrid1.ColWidths[ACol] = 0 then
      begin
        CanSelect := False;
        if FPrevCol < ACol then  //moving from left to right
        begin
          if ACol + 1 <= StringGrid1.ColCount then
            StringGrid1.Col := StringGrid1.Col + 2;
        end
        else   //moving from right to left
        begin
          if ACol > 1 then
            StringGrid1.Col := StringGrid1.Col - 2;
        end;
      end
      else
        FPrevCol := ACol;
    end;