本人第一次接触delphi,正在尝试翻版以前用VB写过的程序。遇到了很多问题,有些一时难于从教程得到帮助。短时间内,我可能会在此板块连续得发问,而且都是简单问题,请高手们不惜赐教!我的程序需要动态的生成n个很相似的Edit(VB里面叫Text),在VB里面只需要建立一个Text,将其设置成控件数组。以后需要多少个Text,就Load多少次,用完了再Unload。而且,最方便的就是,这n个Text的相关代码只需要写一次(比如说OnChange之类的只要写一个就可以,函数入口参数有一个Index指明了当前是第几个Text)。并且,需要访问这些Text的时候,可以把他们当作数组访问。
请问,delphi中是怎样实现类似功能的呢?

解决方案 »

  1.   

    Delphi里当然有控件数组,但是它并不像VB一样在设计期就可以操纵。
    Delphi里可以这样定义一组控件数组:var
      Edit: array of TEdit;
    begin
      for i:=0 to High(Edit) do
      begin
        Edit[i] := TEdit.Create(Self);
        with Edit[i] do
        begin
          Parent := Self;   // Self就是指当前窗体,执行这句之后动态生成的编辑框就显示在
                            // 当前窗体上。
          Width := 100;
          Height := 50;
          Left := 10 + i*110;
          Top := 10;
        end;
      end;
    end;
      

  2.   

    这个样子啊~~
    那么,如果需要定义每一个Edit的OnChange事件
    (类似于procedure TForm1.Edit1Change(Sender: TObject);)。
    该怎么定义好些呢?多谢!
      

  3.   

    其实,你可以使用Delphi做到同VB一样的处理效果,不一定需要控件数组。
    为了在一个OnClick子程序中统一处理几个Button的点击事件,可以这样做:
    1)在空白的窗体上放置2个Button,一个是Button1,另一个是Button2。
    2)双击Button1,这将为Button1建立一个默认的OnClick处理事件程序:
    procedure TForm1.Button1Click(Sender: TObject);
    beginend;
    3)在窗体上选择Button2,在左侧的对象浏览器里设置Button2的OnClick事件为Button1Click
    4)如果你愿意,可以在事件列表中把Button1Click改名为更有意义的名字,比如AnyButtonClick,这样Button1和Button2的OnClick事件都由AnyButtonClick()子程序来处理。
    5)设置Button1的Tag属性为1,Button2的Tag属性为2。 (关键)
    6)在AnyButtonClick事件中区分是Button1被按下还是Button2?
    procedure TForm1.AnyButtonClick(Sender: TObject);
    var
      Index: Integer;
    begin
      Index := TComponent(Sender).Tag;
      ShowMessage("Button" + IntToStr(Index) + " Clicked!");
    end;
      

  4.   

    var
      i: integer;
    begin
      for i:=0 to self.ComponentCount-1 do
         if (Self.Components[i] is TEdit) then
            //Showmessage(TEdit(Components[i]).Caption);作你想做的事情
    end;
      

  5.   

    你看到了,关键在于将每个对象的事件处理程序设为同一个子程序后,还设置了每个对象的Tag属性,
    由于在几乎所有Delphi的控件事件处理程序中,都会传递一个Sender: TObject 对象。这样,就可以通过它来检查调用对象的Tag属性,从而判别是哪个对象触发了事件。:)
      

  6.   

    那么,如果需要定义每一个Edit的OnChange事件
    (类似于procedure TForm1.Edit1Change(Sender: TObject);)。
    该怎么定义好些呢?
    ---------------------------------------------------
    Edit1.OnChange:=Edit1Change;
      

  7.   

    写那么多也许你还不太明白,我写了一个简单的示例程序,你可以下载:
    http://www.rtgame.com/example.rar
      

  8.   

    明白了!原来delphi的onchange可以这样用!!!
    比VB还方便!
    多谢!
      

  9.   

    抱歉,我的第一个回复的程序有遗漏,更正为:
    implementationvar
      Edit: array of TEdit;  // Edit可以在TForm1类中定义
                             // 也可以定义在 implementation 段下面作为私有全局变量。...procedure TForm1.FormCreate(Sender: TObject);
    var
      i: Integer;
    begin
      SetLength(Edit, 10);  // 控件数量
      for i:=0 to High(Edit) do
      begin
        Edit[i] := TEdit.Create(Self);
        with Edit[i] do
        begin
          Parent := Self;   // 这里Self是指当前窗体,此句使动态生成的控件显示在当前窗体上。
          Width := 100;
          Height := 50;
          Left := 10 + i*110;
          Top := 10;
          Tag := i;                  // 一般在创建控件数组时总是设定Tag属性为控件的下标
          OnChange := AnyEditChange; // 使控件数组共享一个OnChange处理事件
        end;
      end;
    end;procedure TForm1.AnyEditChange(Sender: TObject);
    var
      i: Integer;
    begin
      i := TComponent(Sender).Tag;    // 取得触发事件的控件编号
      ShowMessage(Edit[i].Text);      // 显示受改变的编辑框内容
      ShowMessage(TEdit(Sender).Text) // 此句与上句的效果是相同的:)
    end;