0

私はDelphiが初めてです。

多数のボタンを作成するアプリケーションを作成したいと思います。Tbutton の配列を宣言してボタンを 1 つずつ作成するのは、混乱を招き、多くの時間がかかるため、あまり満足のいくものではありません。Command For の使用も、ボタンの位置など、必要に応じて一部のボタンのプロパティを変更できないため、満足のいくものではありません。

そこで、プロシージャに送信するプロパティに基づいてボタンを作成する TForm1 クラスでプロシージャを宣言することにしました。しかし、何らかの理由で機能していません (構文エラーはありません):

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)                       //Declaring the procedure
  procedure CreateButton(Button: TButton; L: Integer; T: Integer); 
  procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  B1, B2: TForm1;         //Declaring controls
implementation

{$R *.dfm}

procedure TForm1.CreateButton(Button: TButton; L: Integer; T: Integer);
begin
  Button:= TButton.Create(Self);
  Button.Parent:= Self;
  Button.Width:= 100; Button.Height:= 50;
  Button.Left:= L; Button.Top:= T;
end;


procedure TForm1.FormCreate(Sender: TObject);
Var
  Button1, Button2: TButton;
begin
  B1.CreateButton(Button1, 100, 50);           //Sending properties
  B2.CreateButton(Button2, 200, 40);           //Sending properties
end;

end.
4

1 に答える 1

0

AS: トピック スターターとのコミュニケーション中に、答えも大きくなりました。全体の結果は次のようになりますhttp://pastebin.ca/2426760

 procedure TForm1.CreateButton(VAR Button: TButton; CONST L: Integer; CONST T: Integer);

これは、プロシージャ/関数にパラメーターを渡す方法の Pascal 言語の基本です。

http://docwiki.embarcadero.com/RADStudio/XE4/en/Parameters_(Delphi)

実際には、パラメータ Button = nil で問題はないと思います
。これは、「Button1」と「Button2」の値が送信されないことを意味しますが、

http://pastebin.ca/2427238


これを見つけてくれた Bill に感謝します。個別のプロパティを使用してコントロールを配置することは非効率であり、コピー アンド ペースト エラーが発生しやすくなります。

2番目のリンクを使用:

procedure TForm1.CreateButton(out Button: TButton; const L: Integer; const T: Integer);
begin
  Button:= TButton.Create(Self);
  Button.Parent:= Self;
  Button.SetBounds( L, T, 100, 50); 
end;

新しく作成されたボタンへのポインターを実際にどうしますか? あなたのコードでは、それらを失うだけです!

procedure TForm1.FormCreate(Sender: TObject);
Var
  Button1, Button2: TButton;
begin
...
end;

このコードでは、これらのポインターは失われます。これらの値が必要な場合は、プロシージャの外で渡します。そうでない場合は、質問しないでください - http://en.wikipedia.org/wiki/YAGNI http://en.wikipedia.org/wiki/KISS_principle

Procedure TForm1.CreateButton(const L, T: Integer);
begin
  With TButton.Create(Self) do begin
       Parent := Self;
       SetBounds( L, T, 100, 50); 
       Caption := 'Caption at ' + IntToStr(T);
       Name := 'Name at ' + IntToStr(L);
  End; 
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  B1.CreateButton( 100, 50);           //Sending properties
  B2.CreateButton( 200, 40);           //Sending properties
end;

B1、B2...

フォームに 2 つのボタンが必要であると主張していますが、コードは、3 つのフォームと、2 番目のフォームに 1 つのボタン、3 番目のフォームに 1 つのボタンを作成しようとしていることを示しています。それで、あなたは本当に何が欲しいですか?また、ボタンを追加する前に、B1 フォームと B2 フォームが作成されていることを確認しますか?

本当は欲しかったのかもしれません

procedure TForm1.FormCreate(Sender: TObject);
begin
  SELF.CreateButton( 100, 50);           //Sending properties
  SELF.CreateButton( 200, 40);           //Sending properties
end;

次に、DRY 原則に従い、すべての変数を 1 か所に保持します。

http://docwiki.embarcadero.com/Libraries/XE2/en/System.Types.TPoint

Procedure TForm1.CreateButtons(const a: array of TPoint);
Var p: TPoint;
Begin
    for p in a do
        CreateButton( p.x, p.y );
End;

type TPointDynArray = array of TPoint;

procedure TForm1.FormCreate(Sender: TObject);
begin
   CreateButtons( TPointDynArray.Create(
       Point( 100,50 ), Point(200, 40) ) );
end;

Delphi 配列の初期化への称賛

後でいつでも配列に座標を追加して、一貫性を保つことができます。さて、これを Delphi 7 の機能に落とし込むと、やや冗長に、次のようにコーディングされます。

const BtnCnt = 2;
      BtnLocations : array [1..BtnCnt] of TSize = (
         ( cx: 100, cy: 50 ), ( cx: 200, cy: 40 ) 
      );

Procedure TForm1.CreateButtons(const a: array of TSize);
Var i: integer;
Begin
    for i := Low(a) to High(a) do
        with a[i] do
             CreateButton( cx, cy );
End;

procedure TForm1.FormCreate(Sender: TObject);
begin
   CreateButtons( BtnLocations );
end;

しかし、Delphi 5 と Dephi 7 は素晴らしいリリースでしたが、非常に時代遅れです。Delphi XE以降にアップグレードするか、CodeTyphonを回避することを強くお勧めします


TForm1 = class(TForm)                       //Declaring the procedure
    procedure CreateButton(Button: TButton; L: Integer; T: Integer); 

フォーム クラスの PUBLISHED セクションで 1 つの目的の手順を宣言することも、あまり良いスタイルではありません。PRIVATE セクションで宣言することをお勧めします。「最小限の可視性」に固執すると、相互依存関係を制御可能にするのに役立ちます。さもなければ、あなたのプログラムは 1 年でスパゲッティの混乱になり、他のすべてを台無しにしない限り、何も変更することができなくなります。私は現在、10年以上の歴史を持つプロジェクトに取り組んでおり、「すべてが公開されている」ことの結果は非常に明確です. それは大きな痛みです!

于 2013-07-13T21:19:04.877 に答える