本帖最后由 haiou327 于 2013-02-22 21:10:39 编辑

解决方案 »

  1.   

    给楼主提几点改进,有点苛刻,但是好意。创建 button 时已经把窗口作为 owner,那些 button 将随窗口自动释放,最后一节没必要。
    构件位置和大小可用 BoundsRect 设置,比较简洁易读。
    重复写(Sender as TButton).Caption,读起来累。
    在循环中重复写 inttostr(i),应该避免。不妨改一下,看看能精简多少代码。
      

  2.   

    还有Button1多点几下按钮会重叠吧。。
      

  3.   

    还有,把创建Button的代码写在一个函数中,封装性就更好了!
      

  4.   

    感谢#3楼jinghai1776和#6楼HSFZXJY的建议获益非浅,不胜感激
    将代码改动如下unit DynamicCreateControlsPas;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ComCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure aBtnonClick(Sender: Tobject);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }  end;var
      Form1: TForm1;
    const
      aCaption = 'delphi';
    implementation{$R *.dfm}procedure CreateBtn(aLeft, aTop, aWidth, aHeigh, aMount: integer;
      sCaption: string; aOnWer: TComponent);                          //封装创建Btn函数
    var
      i, H: integer;
    begin
      H := 0;
      for i := 1 to aMount do
        with TButton.Create(aOnWer) do
        begin
          Name := sCaption + inttostr(i);
          H := H + 80;
          BoundsRect := Bounds(aLeft, H, aWidth, aHeigh);
          Parent := Form1;
        end;end;procedure Tform1.aBtnonClick(Sender: Tobject);                      //事件过程
    var
      i: integer;
    begin
      for i := 1 to 5 do
      begin
        if ((Sender as TButton).Caption = acaption + inttostr(i)) then
          ShowMessage((Sender as TButton).caption);
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);                     //调用创建btn函数
    var
      i: Integer;
      aBtn: TButton;
    begin
      for i := 1 to 5 do
      begin
        if not Assigned(TButton(FindComponent(aCaption + inttostr(i)))) then
          CreateBtn(60, 60, 120, 60, 5, aCaption,Form1);
        aBtn := TButton(FindComponent(aCaption + inttostr(i)));
        aBtn.OnClick := aBtnonClick;
      end;
    end;
    end.
      

  5.   

    再修改一下,根据不同的控件对象参数创建不同的控件procedure CreateCompoent(aLeft, aTop, aWidth, aHeigh, aMount: integer;
      compName: string; compType: TControlClass; aOwner: TComponent);               //封装创建Btn函数
    var
      i: integer;
    begin
      aTop := 0;
      for i := 1 to aMount do
        if not Assigned(aOwner.FindComponent(compName + inttostr(i))) then
          with compType.Create(aOwner) do
          begin
            Name := compName + inttostr(i);
            aTop := aTop + 60;
            BoundsRect := Bounds(aLeft, aTop, aWidth, aHeigh);
            Parent := Form1;
          end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      i: Integer;
    const
      bBtn: Tcontrolclass = TButton;
    begin
      CreateCompoent(60, 60, 120, 40, 5, 'delphi', bBtn, form1);                    //调用
    end;