2

私はこのタイプを持っています

type
 TMain = class(TForm)

 panel1: Tpanel;
 panel2: Tpanel;
 panel3: Tpanel;
 panel4: Tpanel;
 panel5: Tpanel;
 panel6: Tpanel;
 panel7: Tpanel;
 panel8: Tpanel;
 ......
 panel45: Tpanel;

 label1: TLabel;
 label2: TLabel;
 label3: TLabel;
 label4: TLabel;
 label5: TLabel;
 label6: TLabel;
 label7: TLabel;
 ...........
 label109: TLabel;

タイプ内でこのコンポーネントを1行で呼び出すにはどうすればよいですか?

ありがとうございました ...

アップデート....

私が取得して受け入れた回答のベースは、このすべてのコンポーネントがあり、ボタンのようなアクションを実行するとうまく機能します1.メインフォームからクリックします...

しかし、私はユニットからアクションを作成するために使用します...だから

ボタンをクリックすると、プロシージャDoMaths(Sender:TObject);が表示されます。

procedure Tform1.DoMaths(Sender: TObject);
  begin
    if TButton1(Sender).hint := 'Make the standard Package' then
      do_Maths_standard_package;
  end;

do_Maths_standard_packageはユニットComplexMathsにあります。

プロシージャdo_Maths_standard_packageフォームユニットComplexMathsは、Form1.label1などのいくつかのコンポーネントをForm1から呼び出します。

したがって、RegisterClass(TLabel)を呼び出して、タイプからTlabelを消去すると、Label1が見つからないというエラーが発生します...

最初からホールプログラムをやらないように誰か助けてくれませんか...

ありがとうございました...

4

3 に答える 3

7

TPanel または TLabel の名前を削除すると、フォームの Type 宣言ではなく、コントロール リストにのみ存在します。1 つのラベルと 1 つのパネルを残すか、以下を追加する必要があります。

initialization
  RegisterClass(TPanel);
  RegisterClass(Tlabel);
end.

フォームの最後に。

これにより、多くのコントロールを備えたフォームがよりきれいになります。

于 2012-08-23T07:11:03.503 に答える
5

TForm.Controls配列を使用します。

var
  i: Integer;
  Pnl: TPanel;
begin
  for i := 0 to ControlCount - 1 do
    if Controls[i] is TPanel then
    begin
      Pnl := TPanel(Controls[i]);
      Pnl.Caption := 'This is panel ' + IntToStr(i);
    end;
end;

Delphi は、それぞれに対して 2 つのリストを自動的に作成しますTWinControl

  • ControlsTControlコントロールに含まれるすべての項目のリストが含まれます。

  • ComponentsTComponentsコントロール上のすべてのリストです。

すべてがですが、すべてControlsComponentsであるわけではないことに注意してください。そのため、2 つのリストがあります。(たとえば、 A はリストにありますが、リストにはありません。一方、aは両方にあります。)ComponentsControlsTDataSetComponentsControlsTEdit

同じ手法を使用して、パネルまたは他のコンテナーのコンポーネントを反復処理することもできます。たとえば、と配列のTPanel両方があります。ControlComponent

実際に必要なのは、宣言自体内のアイテムの数を減らすことである場合は、代わりに実行時に作成します。Delphi は、 andtypeに基づいてそれらを配列に自動的に追加します。OwnerParent

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
  Panel: TPanel;
  Label: TLabel;
begin
  for i := 0 to 10 do
  begin
    Panel := TPanel.Create(Self);  // Set who frees it
    Panel.Parent := Self;   // Set display surface
    Panel.Align := alTop;
    Panel.Name := Format('Panel%d', [i]); // Not necessary
    Panel.Caption := Panel.Name;  

    // Add a label on each panel, just for fun.
    Label := TLabel.Create(Panel); // Panel will free label
    Label.Parent := Panel;         // Label will show on panel
    Label.Top := 10;
    Label.Left := 10;
    Label.Name := Format('Label%d', [i]);
    Label.Caption := Label.Caption;   // Not necessary
  end;
end;

それらを自分で作成することは「最適化」ではないことに注意してください。それは、読み込みを VCL から自分で行うようにシフトするだけだからです。.dfm ファイルのサイズは小さくなりますが、コードや読み込み時間は短縮されません。また、フォームを視覚的にレイアウトすることもできません。(また、コントロールに無意味な名前が付いているため、コードを維持するのもはるかに困難です。今から 6 か月後にコードを読むよりも、何が何であるLastNameEditかを理解する方がはるかに簡単です。)EditLastNameEdit1

于 2012-08-23T02:09:07.643 に答える
2

配列を使用できます。

panels : array[1..45] of TPanel; 

これにより、コントロールの配列を作成し、インデックスごとにそれらにアクセスして使用できるようになります。

于 2012-08-22T21:32:00.197 に答える