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;
動的に生成するときにTAGプロパティをそれぞれユニークに付けて、OnKeyDownメソッドでFindComponentして、TAGを取得し、今いるMaskEditの次のコンポーネントならSetFocusする、なんていうのはだめですか?
ちょっと補足させてください。
動的生成したコンポーネントへの独自イベントの割り当て方法です。
(※私の環境は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;
以上ですが、どうでしょうか?
通りすがりさん、かふぇさん有難うございます
数日、留守にしていましたので返事が送れて申し訳ありません
頂いたアドバイスを参考に、トライしてみます
結果は、またご報告します
通りすがりさん、かふぇさん以下のようにすることにより解決できました
有難うございました
//以下、日付入力用の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;
ツイート | ![]() |