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年以上の歴史を持つプロジェクトに取り組んでおり、「すべてが公開されている」ことの結果は非常に明確です. それは大きな痛みです!