수백개의 컴포넌트에서 방향키로 커서 이동하기
참조로 저는 TKNumberEdit 컴포넌트로 작업을 하고 이름을 규칙적으로 주었습니다
또한 F1키를 눌렀을때 바로전에 입력한 금액을 가져오도록 했습니다.
워낙 초보라 고수님들이 보면 창피하지만 보시고 고쳐주세요
또한 도움이 될만한 분들은 많이 참조하고 다듬어서 사용하세요.
아래는 컴포넌트 이름 및 폼에서의 배열형태 입니다.
a01 a02 a03 a04 a05 a06 a07 a08 a09 a10 a11 a12
b01 b02 b03 b04 b05 b06 b07 b08 b09 b10 b11 b12
중 략
m01 m02 m03 m04 m05 m06 m07 m08 m09 m10 m11 m12
프로그램 설명은 길어 지니까 그냥 참고 하세요.중간과 우측과 아래에 합계도 냅니다.
방향키중 위,아래 화살표는 KeyDown 이벤트에서 작동되지 않아 KeyUP 이벤트에서 구현함.
procedure TFm107.b02KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var am_name,am_tnum,am_name1,am_tnum1,OldName,Nowname : string;
am_numb,am_numb1 : integer;
am ,Oldamnt : TKNumberedit;
begin
if key = vk_left then begin //커서를 왼쪽으로 이동시킨다.
OldName := Activecontrol.Name;
am_name := copy(OldName,1,1);
am_numb := strtoint(copy(OldName,2,2));
if (am_name = 'a') and (am_numb = 1) then begin
showmessage('더이상 갈 곳이 없습니다.^-^ ');
Exit;
end;
if am_numb <> 1 then begin
am_numb := am_numb - 1;
am_tnum := inttostr(am_numb);
if length(am_tnum) = 1 then am_tnum := '0' + am_tnum;
am_name := am_name + am_tnum;
end else
begin
if am_name = 'b' then am_name := 'a' else
if am_name = 'c' then am_name := 'b' else
if am_name = 'd' then am_name := 'c' else
if am_name = 'e' then am_name := 'd' else
if am_name = 'f' then am_name := 'e' else
if am_name = 'g' then am_name := 'f' else
if am_name = 'h' then am_name := 'g' else
if am_name = 'i' then am_name := 'h' else
if am_name = 'j' then am_name := 'i' else
if am_name = 'k' then am_name := 'j' else
if am_name = 'l' then am_name := 'k' else
if am_name = 'm' then am_name := 'l';
am_tnum := '12';
am_name := am_name + am_tnum;
end;
ActiveControl := findcomponent(am_name) as TKNumberedit;
end;
if key = vk_right then begin //커서를 오른쪽으로 이동시킨다.
OldName := Activecontrol.Name;
am_name := copy(OldName,1,1); //a 부터 m까지
am_numb := strtoint(copy(OldName,2,2));
if (am_name = 'm') and (am_numb = 12) then begin
showmessage('더이상 갈 곳이 없습니다. Enter를 누르세요.^-^ ');
Exit;
end;
if am_numb <> 12 then begin
am_numb := am_numb + 1;
am_tnum := inttostr(am_numb);
if length(am_tnum) = 1 then am_tnum := '0' + am_tnum;
am_name := am_name + am_tnum;
end else
begin
if am_name = 'a' then am_name := 'b' else
if am_name = 'b' then am_name := 'c' else
if am_name = 'c' then am_name := 'd' else
if am_name = 'd' then am_name := 'e' else
if am_name = 'e' then am_name := 'f' else
if am_name = 'f' then am_name := 'g' else
if am_name = 'g' then am_name := 'h' else
if am_name = 'h' then am_name := 'i' else
if am_name = 'i' then am_name := 'j' else
if am_name = 'j' then am_name := 'k' else
if am_name = 'k' then am_name := 'l' else
if am_name = 'l' then am_name := 'm';
am_tnum := '01';
am_name := am_name + am_tnum;
end;
ActiveControl := findcomponent(am_name) as TKNumberedit;
end;
if key = vk_end then processBtn.SetFocus; //커서를 입력버튼으로 이동시킴
if key = vk_F1 then begin //전월금액을 현재월에 뿌려줌
OldName := Activecontrol.Name;
Nowname := Activecontrol.Name;
am_name := copy(OldName,1,1);
am_numb := strtoint(copy(OldName,2,2));
if am_numb = 1 then begin
showmessage('F1 키는 2월부터 적용 됩니다. Enter 를 누르세요.^-^ ');
Exit;
end;
if am_numb <> 1 then begin
am_numb := am_numb - 1;
am_tnum := inttostr(am_numb);
if length(am_tnum) = 1 then am_tnum := '0' + am_tnum;
end;
am_name := am_name + am_tnum;
Oldamnt := findcomponent(am_name) as TKNumberedit;//전월금액
am_name1 := copy(NowName,1,1);
am_numb1 := strtoint(copy(NowName,2,2));
if am_numb1 <> 1 then begin
am_numb1 := am_numb1;
am_tnum1 := inttostr(am_numb1);
if length(am_tnum1) = 1 then am_tnum1 := '0' + am_tnum1;
end;
am_name1 := am_name1 + am_tnum1;
am := findcomponent(am_name1) as TKNumberedit;
am.Value := Oldamnt.Value; //당월금액에 전월금액(Oldamnt)를 나타냄
//======= 커서를 다음칸으로 이동 =========================================
OldName := Activecontrol.Name;
am_name := copy(OldName,1,1);
am_numb := strtoint(copy(OldName,2,2));
if am_numb <> 12 then begin
am_numb := am_numb + 1;
am_tnum := inttostr(am_numb);
if length(am_tnum) = 1 then am_tnum := '0' + am_tnum;
am_name := am_name + am_tnum;
end else //12월인 경우 다음매체01월로 커서 이동
begin
if am_name = 'a' then am_name := 'b' else
if am_name = 'b' then am_name := 'c' else
if am_name = 'c' then am_name := 'd' else
if am_name = 'd' then am_name := 'e' else
if am_name = 'e' then am_name := 'f' else
if am_name = 'f' then am_name := 'g' else
if am_name = 'g' then am_name := 'h' else
if am_name = 'h' then am_name := 'i' else
if am_name = 'i' then am_name := 'j' else
if am_name = 'j' then am_name := 'k' else
if am_name = 'k' then am_name := 'l' else
if am_name = 'l' then am_name := 'm';
am_tnum := '01';
am_name := am_name + am_tnum;
end;
ActiveControl := findcomponent(am_name) as TKNumberedit;
end;
end;
procedure TFm107.b02KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
var OldName,am_name,am_tnum : string;
begin
if key = vk_up then begin //커서를 위로 이동 시킵니다.
OldName := Activecontrol.Name;
am_name := copy(OldName,1,1);
am_tnum := copy(OldName,2,2);
if am_name <> 'a' then begin
if am_name = 'b' then am_name := 'a' else
if am_name = 'c' then am_name := 'b' else
if am_name = 'd' then am_name := 'c' else
if am_name = 'e' then am_name := 'd' else
if am_name = 'f' then am_name := 'e' else
if am_name = 'g' then am_name := 'f' else
if am_name = 'h' then am_name := 'g' else
if am_name = 'i' then am_name := 'h' else
if am_name = 'j' then am_name := 'i' else
if am_name = 'k' then am_name := 'j' else
if am_name = 'l' then am_name := 'k' else
if am_name = 'm' then am_name := 'l';
am_name := am_name + am_tnum;
ActiveControl := findcomponent(am_name) as TKNumberedit;
end else
begin
showmessage('더이상 갈곳이 없습니다.! ^-^ ');
Exit;
end;
end;
if key = vk_down then begin //커서를 아래로 이동 시킵니다.
OldName := Activecontrol.Name;
am_name := copy(OldName,1,1);
am_tnum := copy(OldName,2,2);
if am_name <> 'm' then begin
if am_name = 'a' then am_name := 'b' else
if am_name = 'b' then am_name := 'c' else
if am_name = 'c' then am_name := 'd' else
if am_name = 'd' then am_name := 'e' else
if am_name = 'e' then am_name := 'f' else
if am_name = 'f' then am_name := 'g' else
if am_name = 'g' then am_name := 'h' else
if am_name = 'h' then am_name := 'i' else
if am_name = 'i' then am_name := 'j' else
if am_name = 'j' then am_name := 'k' else
if am_name = 'k' then am_name := 'l' else
if am_name = 'l' then am_name := 'm';
am_name := am_name + am_tnum;
ActiveControl := findcomponent(am_name) as TKNumberedit;
end else
begin
showmessage('더이상 갈곳이 없습니다.! ^-^ ');
Exit;
end;
end;
end;
흠~ 너무 복잡하네요... 좀 간단히...
컨트롤 이름은 01, 02, ... 로 시작하는 것보다 00부터 시작하는 zero-base index를
사용하시는 것이 계산에 더 편리합니다.(a00, a01, a02, ..., a11) 아래에서는 상하좌우
포커스가 순환하도록 만들었습니다. 적당히 바꾸세요...
TEdit에서는 OnKeyDown에서 네개의 방향키가 다 들어오는데 TKNumberEdit에서는 써보질
않아서 잘 모르겠네요... 님 말씀들어보면 위아래 방향키는 안먹는다는데 따로 빼내어서
하셔야 겠죠...
const
MaxColCount = 12; // 좌우로 12개 컨트롤... 00 ~ 11
MaxRowCount = 13; // 상하로 13개 컨트롤... a ~ m
type
TForm1 = class(TForm)
procedure EditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
private
function GetNextControl(Name: string; Direction: Word): TWinControl;
...
end;
implementation
{$R *.DFM}
// 모든 에디트 컨트롤의 OnKeyDown이벤트
procedure TForm1.EditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var
NextControl: TWinControl;
begin
if Key in [vk_Left, vk_Up, vk_Right, vk_Down] then
begin
NextControl := GetNextControl(TEdit(Sender).Name, Key);
NextControl.SetFocus;
end;
end;
// 방향키에 따라 다음 컨트롤을 찾는 함수
function TForm1.GetNextControl(Name: string; Direction: Word): TWinControl;
var
Col, Row: Integer;
begin
Row := Byte(Name[1]) - Byte('a');
Col := StrToInt(Copy(Name, 2, 2));
case Direction of
vk_Left: Col := (Col - 1 + MaxColCount) mod MaxColCount;
vk_Up: Row := (Row - 1 + MaxRowCount) mod MaxRowCount;
vk_Right: Col := (Col + 1 + MaxColCount) mod MaxColCount;
vk_Down: Row := (Row + 1 + MaxRowCount) mod MaxRowCount;
end;
Row := Row + Byte('a');
Result := TWinControl(FindComponent(Char(Row) + IntToHex(Col, 2)));
end;
^^ 항상 즐코하세요...
초보 wrote:
> 수백개의 컴포넌트에서 방향키로 커서 이동하기
> 참조로 저는 TKNumberEdit 컴포넌트로 작업을 하고 이름을 규칙적으로 주었습니다
> 또한 F1키를 눌렀을때 바로전에 입력한 금액을 가져오도록 했습니다.
> 워낙 초보라 고수님들이 보면 창피하지만 보시고 고쳐주세요
> 또한 도움이 될만한 분들은 많이 참조하고 다듬어서 사용하세요.
>
> 아래는 컴포넌트 이름 및 폼에서의 배열형태 입니다.
>
> a01 a02 a03 a04 a05 a06 a07 a08 a09 a10 a11 a12
> b01 b02 b03 b04 b05 b06 b07 b08 b09 b10 b11 b12
>
> 중 략
>
>
> m01 m02 m03 m04 m05 m06 m07 m08 m09 m10 m11 m12
>
> 프로그램 설명은 길어 지니까 그냥 참고 하세요.중간과 우측과 아래에 합계도 냅니다.
>
>
> 방향키중 위,아래 화살표는 KeyDown 이벤트에서 작동되지 않아 KeyUP 이벤트에서 구현함.
>
> procedure TFm107.b02KeyDown(Sender: TObject; var Key: Word;
> Shift: TShiftState);
> var am_name,am_tnum,am_name1,am_tnum1,OldName,Nowname : string;
> am_numb,am_numb1 : integer;
> am ,Oldamnt : TKNumberedit;
> begin
> if key = vk_left then begin //커서를 왼쪽으로 이동시킨다.
> OldName := Activecontrol.Name;
> am_name := copy(OldName,1,1);
> am_numb := strtoint(copy(OldName,2,2));
> if (am_name = 'a') and (am_numb = 1) then begin
> showmessage('더이상 갈 곳이 없습니다.^-^ ');
> Exit;
> end;
> if am_numb <> 1 then begin
> am_numb := am_numb - 1;
> am_tnum := inttostr(am_numb);
> if length(am_tnum) = 1 then am_tnum := '0' + am_tnum;
> am_name := am_name + am_tnum;
> end else
> begin
> if am_name = 'b' then am_name := 'a' else
> if am_name = 'c' then am_name := 'b' else
> if am_name = 'd' then am_name := 'c' else
> if am_name = 'e' then am_name := 'd' else
> if am_name = 'f' then am_name := 'e' else
> if am_name = 'g' then am_name := 'f' else
> if am_name = 'h' then am_name := 'g' else
> if am_name = 'i' then am_name := 'h' else
> if am_name = 'j' then am_name := 'i' else
> if am_name = 'k' then am_name := 'j' else
> if am_name = 'l' then am_name := 'k' else
> if am_name = 'm' then am_name := 'l';
> am_tnum := '12';
> am_name := am_name + am_tnum;
> end;
> ActiveControl := findcomponent(am_name) as TKNumberedit;
> end;
> if key = vk_right then begin //커서를 오른쪽으로 이동시킨다.
> OldName := Activecontrol.Name;
> am_name := copy(OldName,1,1); //a 부터 m까지
> am_numb := strtoint(copy(OldName,2,2));
> if (am_name = 'm') and (am_numb = 12) then begin
> showmessage('더이상 갈 곳이 없습니다. Enter를 누르세요.^-^ ');
> Exit;
> end;
> if am_numb <> 12 then begin
> am_numb := am_numb + 1;
> am_tnum := inttostr(am_numb);
> if length(am_tnum) = 1 then am_tnum := '0' + am_tnum;
> am_name := am_name + am_tnum;
> end else
> begin
> if am_name = 'a' then am_name := 'b' else
> if am_name = 'b' then am_name := 'c' else
> if am_name = 'c' then am_name := 'd' else
> if am_name = 'd' then am_name := 'e' else
> if am_name = 'e' then am_name := 'f' else
> if am_name = 'f' then am_name := 'g' else
> if am_name = 'g' then am_name := 'h' else
> if am_name = 'h' then am_name := 'i' else
> if am_name = 'i' then am_name := 'j' else
> if am_name = 'j' then am_name := 'k' else
> if am_name = 'k' then am_name := 'l' else
> if am_name = 'l' then am_name := 'm';
> am_tnum := '01';
> am_name := am_name + am_tnum;
> end;
> ActiveControl := findcomponent(am_name) as TKNumberedit;
> end;
>
> if key = vk_end then processBtn.SetFocus; //커서를 입력버튼으로 이동시킴
>
> if key = vk_F1 then begin //전월금액을 현재월에 뿌려줌
> OldName := Activecontrol.Name;
> Nowname := Activecontrol.Name;
> am_name := copy(OldName,1,1);
> am_numb := strtoint(copy(OldName,2,2));
> if am_numb = 1 then begin
> showmessage('F1 키는 2월부터 적용 됩니다. Enter 를 누르세요.^-^ ');
> Exit;
> end;
> if am_numb <> 1 then begin
> am_numb := am_numb - 1;
> am_tnum := inttostr(am_numb);
> if length(am_tnum) = 1 then am_tnum := '0' + am_tnum;
> end;
> am_name := am_name + am_tnum;
> Oldamnt := findcomponent(am_name) as TKNumberedit;//전월금액
> am_name1 := copy(NowName,1,1);
> am_numb1 := strtoint(copy(NowName,2,2));
> if am_numb1 <> 1 then begin
> am_numb1 := am_numb1;
> am_tnum1 := inttostr(am_numb1);
> if length(am_tnum1) = 1 then am_tnum1 := '0' + am_tnum1;
> end;
> am_name1 := am_name1 + am_tnum1;
> am := findcomponent(am_name1) as TKNumberedit;
> am.Value := Oldamnt.Value; //당월금액에 전월금액(Oldamnt)를 나타냄
> //======= 커서를 다음칸으로 이동 =========================================
> OldName := Activecontrol.Name;
> am_name := copy(OldName,1,1);
> am_numb := strtoint(copy(OldName,2,2));
> if am_numb <> 12 then begin
> am_numb := am_numb + 1;
> am_tnum := inttostr(am_numb);
> if length(am_tnum) = 1 then am_tnum := '0' + am_tnum;
> am_name := am_name + am_tnum;
> end else //12월인 경우 다음매체01월로 커서 이동
> begin
> if am_name = 'a' then am_name := 'b' else
> if am_name = 'b' then am_name := 'c' else
> if am_name = 'c' then am_name := 'd' else
> if am_name = 'd' then am_name := 'e' else
> if am_name = 'e' then am_name := 'f' else
> if am_name = 'f' then am_name := 'g' else
> if am_name = 'g' then am_name := 'h' else
> if am_name = 'h' then am_name := 'i' else
> if am_name = 'i' then am_name := 'j' else
> if am_name = 'j' then am_name := 'k' else
> if am_name = 'k' then am_name := 'l' else
> if am_name = 'l' then am_name := 'm';
> am_tnum := '01';
> am_name := am_name + am_tnum;
> end;
> ActiveControl := findcomponent(am_name) as TKNumberedit;
> end;
> end;
>
>
> procedure TFm107.b02KeyUp(Sender: TObject; var Key: Word;
> Shift: TShiftState);
> var OldName,am_name,am_tnum : string;
> begin
> if key = vk_up then begin //커서를 위로 이동 시킵니다.
> OldName := Activecontrol.Name;
> am_name := copy(OldName,1,1);
> am_tnum := copy(OldName,2,2);
> if am_name <> 'a' then begin
> if am_name = 'b' then am_name := 'a' else
> if am_name = 'c' then am_name := 'b' else
> if am_name = 'd' then am_name := 'c' else
> if am_name = 'e' then am_name := 'd' else
> if am_name = 'f' then am_name := 'e' else
> if am_name = 'g' then am_name := 'f' else
> if am_name = 'h' then am_name := 'g' else
> if am_name = 'i' then am_name := 'h' else
> if am_name = 'j' then am_name := 'i' else
> if am_name = 'k' then am_name := 'j' else
> if am_name = 'l' then am_name := 'k' else
> if am_name = 'm' then am_name := 'l';
> am_name := am_name + am_tnum;
> ActiveControl := findcomponent(am_name) as TKNumberedit;
> end else
> begin
> showmessage('더이상 갈곳이 없습니다.! ^-^ ');
> Exit;
> end;
> end;
>
> if key = vk_down then begin //커서를 아래로 이동 시킵니다.
> OldName := Activecontrol.Name;
> am_name := copy(OldName,1,1);
> am_tnum := copy(OldName,2,2);
> if am_name <> 'm' then begin
> if am_name = 'a' then am_name := 'b' else
> if am_name = 'b' then am_name := 'c' else
> if am_name = 'c' then am_name := 'd' else
> if am_name = 'd' then am_name := 'e' else
> if am_name = 'e' then am_name := 'f' else
> if am_name = 'f' then am_name := 'g' else
> if am_name = 'g' then am_name := 'h' else
> if am_name = 'h' then am_name := 'i' else
> if am_name = 'i' then am_name := 'j' else
> if am_name = 'j' then am_name := 'k' else
> if am_name = 'k' then am_name := 'l' else
> if am_name = 'l' then am_name := 'm';
> am_name := am_name + am_tnum;
> ActiveControl := findcomponent(am_name) as TKNumberedit;
> end else
> begin
> showmessage('더이상 갈곳이 없습니다.! ^-^ ');
> Exit;
> end;
> end;
> end;