컨트롤의 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;
'Delphi Tip > +Tip' 카테고리의 다른 글
델파이 암호화 (0) | 2023.07.13 |
---|---|
가변 데이터의 저장 기법 (0) | 2023.07.10 |
프로그램 종료 막기 (0) | 2023.06.29 |
메모 프린터 기타 (0) | 2022.06.29 |
델파이 엑셀(Excel) 수식 포함 저장하기 (0) | 2022.04.18 |
댓글