初期化されてないのエラーメッセージ

解決


初心者  2006-05-31 04:57:43  No: 21945

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;


えーとね  2006-05-31 05:40:08  No: 21946

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;


えーとね  2006-05-31 06:16:29  No: 21947

> 道連れの「可能性がある」
LblEdit := TLabeledEdit(ActiveControl); なら大丈夫でした。道連れは誤りです。
でもActiveControl よりSender を使った方がDelphi らしいコードになります。

> LblEdit.Tag:= x.Tag;
よく見れば(見なくても)、初期化のコードが無いので警告が出たのですね。

> 実行結果は問題ないようなのです。
なぜ動くのか不思議になってきました。偶然動いているだけなのかもしれません。


初心者  2006-05-31 09:49:49  No: 21948

大変参考になりました。
ありがとうございました。
推奨のコードで作ることにしました。


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

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






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