2

フォームにボタンがあります。
ボタン名はbmod2、フォーム名はですfLayOut1

ユーザーがボタンをクリックしたときに、現在のフォームの名前とボタン名を保存したい

procedure TFLayout1.bMod2Click(Sender: TObject);
var
azone : string;
adept : string;
begin
azone := //forum name here
adept := //button name here
end;
4

3 に答える 3

7

イベントメソッドが属する現在のフォームの名前を取得するには、以下のコメント付きのコード行に示されているように、Nameプロパティに直接アクセスするか、非表示のオブジェクトを介してアクセスできます。 Self

特定のイベント(この場合はイベント)を発生させたコンポーネントの名前を取得するには、OnClick一般的に使用されるSenderパラメーターを使用できます。これは、(通常は)イベントを発生させたオブジェクトへの参照です。渡されたSenderパラメーターは基本TObjectクラス型であり、Nameまだプロパティを持っていないため、このオブジェクトをプロパティが持っている型に型キャストする必要がありますName。これは、イベントがバインドされているオブジェクトのタイプである可能性があります。不明な場合、またはイベントにバインドされているコンポーネントタイプがさらにある場合は、プロパティで定義TComponentされている共通の祖先クラスなどを使用できます(Name次のコードのコメント行に示されているように):

procedure TFLayout1.bMod2Click(Sender: TObject);
var
  azone: string;
  adept: string;
begin
  azone := Name;
  // azone := Self.Name;
  adept := TButton(Sender).Name;
  // adept := TComponent(Sender).Name;
  ShowMessage('Form name: ' + azone + sLineBreak +
    'Sender name: ' + adept);
end;
于 2013-01-20T11:31:59.570 に答える
1

ボタンの親の名前が必要な場合は、上記のコードでそれを実行しますが、ボタンを含むフォームの名前が本当に必要な場合 (ボタンが GroupBox または Panel などにある可能性があります)、次のようにすることができます。

var
  ParentClass: TWinControl;
begin
  ParentClass:= Button1.Parent;
  while not (ParentClass is TForm) do
    ParentClass := ParentClass.Parent;
  ShowMessage(Button1.Name);
  ShowMessage(ParentClass.Name);
end;
于 2013-01-20T12:20:08.847 に答える
0

複合コンポーネントを作成していないため、TButton の所有者を使用することもできます。

procedure TFLayout1.bMod2Click(Sender: TObject);
var
  azone: string;
  adept: string;
  btn: TButton;
begin
  btn := (Sender as TButton);
  adept := btn.Name;
  // adept := TComponent(Sender).Name;
  // adept := (Sender as TButton).Name;
  azone := btn.Owner.Name;


  ShowMessage('Form name: ' + azone + sLineBreak +
    'Sender name: ' + adept);
end;

IDE は常にフォームをすべてのコントロールの所有者にしますが、直接のコンテナー (親) にはしません。

于 2013-01-21T17:51:12.297 に答える