본문 바로가기
Delphi Tip/+Tip

컨트롤의 Enter 처리

by MonoSoft 2023. 7. 4.
728x90
반응형

컨트롤의 Enter 처리

 

 

 

DBEdit등의 Enter Key 이동은 간단하다.

 

DBGrid의 칼럼을 제외한 모든 Focus를 가질 수 있는

컴퍼넌트는 OnKeyPress 이벤트에

다음과 같이 코드를 기입하여 간단히 처리할 수 있다.

 

EnterKey처리를 원하는 컴퍼넌트의 OnKeyPress 이벤트를 한 프로시져로 통일한다.

 

procedure TFMain.MostOfControlKeyPress(Sender: TObject; var Key: Char);

begin

  if Key = #13 then

  begin

    Key := #0;

    if Sender = DBEdit1 then // 특별한 다른 처리를 원하는 Component

    begin

      // ....

    end

    else // 나머지는 아래서 처리

      SelectNext( TWinControl(Sender), True True );

    end;

end;

 

모든 컨트롤의 위의 코드에 영향을 받는 것은 아니다.

유일하다시피한 예외가 DBGrid다. DBGrid등에서

문제는 각 칼럼에 포커스가 진입할 때, Edit 박스를 '임시로' 생성해서

처리한 후 포커스를 잃을 때 소멸시켜 버리기 때문이다.

 

즉, DBGrid에서 칼럼 편집시 보여지는 Edit 컨트롤은

동적인 것으로 어느 것인지 집 어내기가 힘들다.

 

하지만 이것을 DBGrid 자신은 알고 있으므로 DBGrid1의 OnKeyPress 이벤트에

아래와 같이 넣으면 각 칼럼간의 이동이 EnterKey로 이루어 진다.

 

 

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);

begin

  if Key = #13 then

  begin

    Key := #0;

    with TDBGrid(Sender) do if SelectedIndex < (FieldCount -1) then

      SelectedIndex := SelectedIndex + 1

    else

      SelectedIndex := 0;

  end;

end;

 

그렇다면 모든 컨트롤이 EnterKey로 Tab을 대신하게 할 수 있는 방법이 있는가?

 

바로 위의 두가지 코드를 조합하면 바로 가능하다.

즉, 일반 컨트롤일 때와 DBGrid일 때를 구분해 주는 것이다.

 

procedure TForm1.AllControlKeyPress(Sender: TObject; var Key: Char);

begin

  if Key = #13 then // 엔터키가 눌려 진 경우

  begin

    if not (Sender is TDBGrid) then begin // DBGrid가 아니라면 Key := #0; // 키를 무시해 버리고

      SelectNext( TWinControl(Sender), True, True) // 다음 컨트롤로 이동한 다.

    end

    else if (Sender is TDBGrid) then // 만약 DBGrid라면

    begin

      with TDBGrid(Sender) do if selectedindex < (fieldcount -1) then // 칼럼을 이동한다

      selectedindex := selectedindex +1

    else

      selectedindex := 0; end;

  end;

end;

 

 

728x90
반응형

'Delphi Tip > +Tip' 카테고리의 다른 글

델파이 암호화  (0) 2023.07.13
가변 데이터의 저장 기법  (0) 2023.07.10
프로그램 종료 막기  (0) 2023.06.29
메모 프린터 기타  (0) 2022.06.29
델파이 엑셀(Excel) 수식 포함 저장하기  (0) 2022.04.18

댓글