TLabeledEditを数個配置し、夫々にTagナンバーをつけて、どのTLabeledEditをクリックしても下記したTMain.Reで作業をおこなう。
そこで、どのTLabeledEditがクリックされたのかをxで取得して、そのクリックされたTLabeledEditの情報を、作業用として設けた別のTLabeledEditに転記しようとしました。
下記ソースでコンパイルすると「LblEditは初期化されてない」のメッセージが出ます。実行結果は問題ないようなのです。
どのように初期化すればよいのでしょうか?
procedure TMain.Re(Sender: TObject);
var
x: TWinControl;
LblEdit: TLabeledEdit;
begin
x:= ActiveControl;
LblEdit.Tag:= x.Tag;
InputGamen.LabeledEdit1.MaxLength:= LblEdit.MaxLength;
InputGamen.LabeledEdit1.EditLabel.Caption:= LblEdit.EditLabel.Caption;
InputGamen.LabeledEdit1.Text:= LblEdit.Text;
end;
ActiveControl が設定されていない場合、LblEdit も道連れの「可能性がある」という警告だと思います。
ActiveControl ではなくSender を使います。
procedure TMain.Re(Sender: TObject);
var
LblEdit: TLabeledEdit;
begin
if Sender is TLabeledEdit then
begin
LblEdit := TLabeledEdit(Sender);
with InputGamen.LabeledEdit1 do
begin
MaxLength:= LblEdit.MaxLength;
EditLabel.Caption:= LblEdit.EditLabel.Caption;
Text:= LblEdit.Text;
end;
end;
end;
> 道連れの「可能性がある」
LblEdit := TLabeledEdit(ActiveControl); なら大丈夫でした。道連れは誤りです。
でもActiveControl よりSender を使った方がDelphi らしいコードになります。
> LblEdit.Tag:= x.Tag;
よく見れば(見なくても)、初期化のコードが無いので警告が出たのですね。
> 実行結果は問題ないようなのです。
なぜ動くのか不思議になってきました。偶然動いているだけなのかもしれません。
大変参考になりました。
ありがとうございました。
推奨のコードで作ることにしました。
ツイート | ![]() |