動的に作成したMaskEditのフォーカスをリターンキーで移動するには

解決


サンプー  2006-11-06 20:32:04  No: 23742

XPPro,DL6Proの環境です
フォームにPanelを貼り付けて、ここに、動的にLabelとMaskEditを作成し(それぞれ、20から30個程度)、MaskEditにキーボードより日付を入力し、入力後、リターンキーで次のMaskEditにフォーカスを移動したいと考えています。動的に、LabelとMaskEditは作成できたのですが、MaskEditのフォーカスの移動をどのようにして移動すればよいのかわかりません。どなたか、ご存知の方、よろしくお願いします。
MaskEditは、以下のようにして、作成しています。

//以下、日付入力用のMaskEditの動的作成
//SonotaDayMaskEd  // 動的配列
//SumKaiSonota //作成個数  integer
Procedure Button1Click
begin
   SetLength(SonotaDayMaskEd,SumKaiSonota);//配列の要素数を確定
   for I := 0 to SumKaiSonota-1 do
   begin
   SonotaDayMaskEd[I] :=TMaskEdit.Create(self);
     with SonotaDayMaskEd[I] do
      begin
       if I < 20 then
         begin
         Parent := Panel5;
         Visible := True ;
         Height := 24;
         Top := (20*I) +30 ;
         Left := 210;
         Font.Size := 11;
         Width := 100;
         EditMask := '!9999/99/00;1;_';
         Tag := I ;
         end
        else
         begin
           Parent := Panel5;
           Visible := True ;
           Height:= 24;
           Top := (20*(I-20)) +30 ;
           Left := 550;
           Font.Size := 11;
           Width := 100;
           EditMask := '!9999/99/00;1;_';
           Tag := I ;
        end;
      end;
end;


通りすがり  2006-11-06 23:14:06  No: 23743

動的に生成するときにTAGプロパティをそれぞれユニークに付けて、OnKeyDownメソッドでFindComponentして、TAGを取得し、今いるMaskEditの次のコンポーネントならSetFocusする、なんていうのはだめですか?


かふぇ  2006-11-07 02:23:32  No: 23744

ちょっと補足させてください。
動的生成したコンポーネントへの独自イベントの割り当て方法です。
(※私の環境はC++Builderでして、見よう見まねでDelphiのソースにしてる為、文法の間違いはあると思います。ご容赦を・・・)

1.次の関数を定義

_OnKeyDown (パラメータはOnKeyDownと同じ)
begin
  // Panel5から現在フォーカス中のコンポーネントを探す
  TComponent* cmp;
  for i=0; i<Panel5.ControlCount; i++
  begin
    cmp = Panel5.Controls [i];

    if (FindComponent...)
    begin
      // 見つかったら次のコンポーネントにフォーカス
      cmp = Panel5.Controls [i+1];
      cmp.SetFocus();
    end;
  end;
end;

2.上記関数を動的生成したコンポーネントのキーダウンイベントに割り当てる。

   ...
   SonotaDayMaskEd[I] :=TMaskEdit.Create(self);
     with SonotaDayMaskEd[I] do
      begin
       if I < 20 then
         begin
         Parent := Panel5;
         Visible := True ;
         Height := 24;
         ...
         OnKeyDown = _OnKeyDown;

以上ですが、どうでしょうか?


サンプー  2006-11-09 18:33:35  No: 23745

通りすがりさん、かふぇさん有難うございます
数日、留守にしていましたので返事が送れて申し訳ありません
頂いたアドバイスを参考に、トライしてみます
結果は、またご報告します


サンプー  2006-11-10 04:12:40  No: 23746

通りすがりさん、かふぇさん以下のようにすることにより解決できました
有難うございました

//以下、日付入力用のMaskEditの動的作成
//SonotaDayMaskEd  // 動的配列
//SumKaiSonota //作成個数  integer
Procedure Button1Click
 var  const NameMyMaskEdit = 'MyMaskEdit';//追加
begin
   SetLength(SonotaDayMaskEd,SumKaiSonota);//配列の要素数を確定
   for I := 0 to SumKaiSonota-1 do
   begin
   SonotaDayMaskEd[I] :=TMaskEdit.Create(self);
     with SonotaDayMaskEd[I] do
      begin
       if I < 20 then
         begin
         Parent := Panel5;
         Visible := True ;
         Height := 24;
         Top := (20*I) +30 ;
         Left := 210;
         Font.Size := 11;
         Width := 100;
         EditMask := '!9999/99/00;1;_';
         Tag := I ;
          Name := NameMyMaskEdit + IntToStr(I);//追加
         end
        else
         begin
           Parent := Panel5;
           Visible := True ;
           Height:= 24;
           Top := (20*(I-20)) +30 ;
           Left := 550;
           Font.Size := 11;
           Width := 100;
           EditMask := '!9999/99/00;1;_';
           Tag := I ;
            Name := NameMyMaskEdit + IntToStr(I);//追加
        end;
      end;
end;

//以下、新たに追加
procedure TFrmSagyoDay.MoveNextEdit(Sender: TObject; var Key: Word;
  Shift: TShiftState);
  var I,j : Integer;
begin
 if key = VK_Return then
   begin
   I := TMaskEdit(Sender).Tag ;
   for J := 0 to Panel5.ControlCount-1 do
     begin
       If (I = J) and (I < SumKaiSonota-1) then
         TMaskEdit(FindComponent(AnsiReplaceStr(TMaskEdit(Sender).Name,IntToStr(I),IntToStr(I+1)))).SetFocus;
      end;
   end;
end;


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

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






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