繰り返し移動するには?

解決


ONE  2003-12-21 20:38:39  No: 6339

初心者のONEともします
Edit1〜Edit15に数字を入力しEnterキーを押す。
Edit1〜Edit15の間を繰り返し移動するにはどうしたらよいのでしょうか?
教えてください。


にしの  2003-12-22 02:21:08  No: 6340

Edit1〜Edit15だけしかないのであれば、OnKeyPressイベントに

procedure TForm1.EditKeyPress(Sender: TObject; var Key: Char);
begin
  if Key=Chr(VK_RETURN) then
  begin
    Key := #0; // キーをクリア
    keybd_event(VK_TAB, 0, 0, 0); // タブキーを押したことにする
    keybd_event(VK_TAB, 0, KEYEVENTF_KEYUP, 0); // タブキーを放したことにする
  end;
end;
を割り当てればできます。
# TabStop, TabOrderの設定が必要です

もし、Edit1〜Edit15以外にコントロールが存在するなら、それらをとばす処理が必要になります。


ONE  2003-12-23 07:24:40  No: 6341

にしのさんへ
初心者なので
『# TabStop, TabOrderの設定が必要です』とありますが、これについては、
何処ように勉強したらよいのでしょうか?
調べるところがあるのでしょうか
又、『Edit1〜Edit15以外にコントロールが存在するなら、それらをとばす処理が必要になります。』これについても教えてください。


にしの  2003-12-23 08:45:18  No: 6342

ヘルプを見てください。
TabStopプロパティ、TabOrderプロパティに関しては、ヘルプに出ています。

コントロールと言ったのが解りづらかったかもしれませんね。
タブキーで、入力フォーカスを移動できることは知っていると思います。
# Windowsの標準動作です
タブキーで移動していることと同じことを、Enterキーにさせる場合、もし、Edit1〜Edit15の他に、例えばButton1などがあれば、そこにもフォーカスが移動してしまいます。
もし、Buttonなどのフォーカスを受け取るコンポーネントが存在しているならば、Edit1〜Edit15を、循環してフォーカス移動することはできません。
TabStop, TabOrderを設定すればできますが、その場合、Buttonにタブキーでフォーカス移動することができなくなります。
# このあたりの動作はTabStop, TabOrderを調べてください

例えば、
Edit1
Edit2
Edit3
と貼り付けて、OnKeyPressイベントを上記のものに設定しておけば、
Edit1→Edit2→Edit3→Edit1→Edit2...とフォーカス移動できます。
しかし、
Edit1
Edit2
Edit3
Button1
の場合、
Edit1→Edit2→Edit3→Button1となり、Button1でのエンターキーでButton1をクリックしたこととなり、フォーカスの循環移動にはなりません。
Button1のTabStopをFalseにしておけば、
Edit1→Edit2→Edit3→Edit1→Edit2...と移動しますが、Button1にタブキーで移動することができません。


Halbow  2003-12-23 09:42:11  No: 6343

Halbow です。

Tab キーのシミュレートでは難しそうですね。
明示的に、次の Edit を探して SetFocus したらどうでしょうか。

名前が Edit1 から Edit15 まで順序よく付いていると仮定すると、
そのすべての OnKeyPress イベントハンドラを以下の一つのハンドラに
結びつけてやると、うまくいくようです。

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
  Edit:TEdit;
  EditNo:integer;
  Compo:TComponent;
begin
  if Key=Chr(VK_RETURN) then
  begin
    Key := #0; // キーをクリア
    Edit := Sender as TEdit;
    EditNo := StrToInt(Copy(Edit.Name,5,2));
    if EditNo = 15 then EditNo := 0;
    Compo := FindComponent('Edit'+IntToStr(EditNo+1));
    if Assigned(Compo) then (Compo as TEdit).SetFocus;
  end;
end;


ONE  2003-12-23 19:01:30  No: 6344

おはようございます。
ONEです。
プログラム言語を初めてつかています。
今回の質問とは、関係ないのですが
どのような勉強したら、にしのさん、Halbowさん、質問に答えてる皆さん、
みたいになれるのでしょうか?


Halbow  2003-12-23 22:24:42  No: 6345

Halbow です。

> どのような勉強したら

地道に基礎から勉強していくと、応用や発想の幅が広がると思います。
あと、プログラミング自体を楽しいと感じることが必要かもしれません。

http://kakinotane.s7.xrea.com/

ここの「Delphi 入門」はおすすめです。

ここにもたまに顔を出される Mr.XRAY さんが、別の BBS で回答を書かれている
内容に感心したことがあります。詳細は忘れましたが以下のような内容だったと
思います。

[質問]
あしたからマラソンを始めます。どうしたら、高橋尚子さんの記録を破ることが
できるでしょうか。

[回答]
健康であれば、マラソンはいつからでも始められます。優れたトレーニングをし
たり、一生懸命努力したとしても、どなたでも高橋尚子さんになれるわけでは
ありませんよ。でも、マラソンを楽しむことはできるかもしれませんね。

どんな分野でも、ある程度精通するには、基礎的な事柄を大事にし、地道に努力し、
そして楽しむことだと思っています。エラそうなことを書きましたが、
年寄りに免じてお許しください。


ONE  2003-12-24 04:33:53  No: 6346

にしのさん、Halbowさん
有難うございます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加