delphi7怎样定义控件数组并获得下标?

怎样在运行时生成10个“TButton”,并排成一排,单击任一个时在Edit1显示单击的按钮的下标(第几个)。... 怎样在运行时生成10个“TButton”,并排成一排,单击任一个时在Edit1显示单击的按钮的下标(第几个)。 展开
 我来答
98...3@qq.com
2012-07-18 · 超过39用户采纳过TA的回答
知道答主
回答量:147
采纳率:0%
帮助的人:91.9万
展开全部

帮你做了个Demo:自己再添加了一些功能。

先看效果图:



{——————————华丽的分割线开始——————————}

unit Unit1;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, ExtCtrls;

type

  TForm1 = class(TForm)

    scrBox1: TScrollBox;

    pnl1: TPanel;

    btn1: TButton;

    edt2: TEdit;

    lbl1: TLabel;

    procedure btn1Click(Sender: TObject);

    procedure FormCreate(Sender: TObject);

    procedure scrBox1Resize(Sender: TObject);

    procedure scrBox1MouseWheelDown(Sender: TObject; Shift: TShiftState;

      MousePos: TPoint; var Handled: Boolean);

    procedure scrBox1MouseWheelUp(Sender: TObject; Shift: TShiftState;

      MousePos: TPoint; var Handled: Boolean);

  private

    btn: TButton;

    FList: TList; //定义一个TList变量用来装载Button

    { Private declarations }

    procedure SetPosition;

    procedure btnClick(Sender: TObject);

  public

    { Public declarations }

  end;

var

  Form1: TForm1;

implementation

{$R *.dfm}

{调整位置}

procedure TForm1.SetPosition;

var

  intLeft, intTop: Integer;

  intCount: Integer;

begin

  intLeft := 20;

  intTop := 20;

  for intCount := 0 to fList.Count - 1 do

  begin

    btn := FList.Items[intCount];

    if intLeft + btn.Width > scrBox1.Width then

    begin

      intLeft := 20;

      intTop := intTop + btn.Height + 20;

    end;

    btn.Left := intLeft;

    btn.Top := intTop;

    intLeft := intLeft + btn.Width + 20;

  end;

end;

{----------单击按钮开始创建----------}

procedure TForm1.btn1Click(Sender: TObject);

var

  intCount: Integer;

begin

  if StrToIntDef(edt2.Text, 1) > 1000 then

  begin

    if MessageBox(Handle, PChar('输入的按钮个数太多了啦,电脑会卡死的!!!'+#10#13+'你还要继续吗?'), '提示', MB_ICONINFORMATION + MB_YESNO) = mrNo then

      Exit;

  end;

  {如果FList已存在对象,则先释放掉}

  if Assigned(FList) then

    for intCount := 0 to FList.Count - 1 do

      TObject(FList[intCount]).Free;

  FList.Clear;  //释放完后清空指针,即nil(此行代码相当重要,没有就会出错!)

  {默认创建一个Button}

  for intCount := 1 to StrToIntDef(edt2.Text, 1) do

  begin

    btn := TButton.Create(nil); //创建控件(参数为self时,不用手动释放,Form关闭后自动释放)

    FList.Add(btn); //把创建的Button放到FList中

    SetPosition;  //调整位置

    btn.Parent := scrBox1; //显示在ScrollBox上面(此行代码很关键,没有就不显示了)

    btn.Caption := '按钮'+ IntToStr(intCount);

    btn.OnClick := btnClick;  //动态创建按钮的单击事件

  end;

  scrBox1.SetFocus;

end;


给分,就贴完。。。

{——————————华丽的分割线结束——————————}

PS:1.至于上面的FList变量什么作用及用法,请自己去寻找;

        2.我没有用动态数组,用的TList类更灵活;

        3.我做的Demo中的按钮能随窗口的改变,位置而改变,自己去试;

        4.这个可以创建任意个按钮,不过输入的个数不要太多,电脑配置不好,会卡死。

        5.我用的Delphi2007,只要你不是用的Delphi XE(2),其它的应该都没问题;

        6.还有不懂的再问;

        7.代码贴出来了,才发现没分,我郁闷,搞毛啊!提问不给分,白白辛苦,

        需要完整的代码请加50分!!!

       

吉人有吉事
2012-07-18 · 知道合伙人软件行家
吉人有吉事
知道合伙人软件行家
采纳数:1524 获赞数:4061
毕业于吉林大学,从事软件开发行业10余年,在金融担保,医疗,电子政务领域积累了相当多的经验

向TA提问 私信TA
展开全部
formshow
var
btn: TButton;
i:integer;
begin
for i := 0 to 10 do
begin
btn := TButton.create(self);
btn.top := 200;
btn.left := (i + 1) * 50;//间隔
btn.width := 100;
btn.tag := i;
..
..
btn.onClick := buttonClick;
end;
buttonClick(Sender:Tobject)
begin
showmessage(TButton(Sender).tag);
end;

我只是简写了代码, 有不清楚再问
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
dakarai
2012-07-18 · 超过13用户采纳过TA的回答
知道答主
回答量:46
采纳率:0%
帮助的人:31.1万
展开全部
var
btn,btn1: TButton;
i : integer;
begin
for i:= 1 to 10 do
begin
btn := TButton.Create(Self);
btn.Parent := Self;
btn.Left := btn.Width*(i-1);
btn.Caption := IntToStr(i);
btn.tag = i;
btn.OnClick := btnClick;
end;
end;

procedure TForm1.btnClick(Sender: TObject);
begin
Edit1.text := (Sender as TButton).caption;
//或者是
// Edit1.text := IntToStr((Sender as TButton).Tag);
end;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式