本人第一次接触delphi,正在尝试翻版以前用VB写过的程序。遇到了很多问题,有些一时难于从教程得到帮助。短时间内,我可能会在此板块连续得发问,而且都是简单问题,请高手们不惜赐教!我的程序需要动态的生成n个很相似的Edit(VB里面叫Text),在VB里面只需要建立一个Text,将其设置成控件数组。以后需要多少个Text,就Load多少次,用完了再Unload。而且,最方便的就是,这n个Text的相关代码只需要写一次(比如说OnChange之类的只要写一个就可以,函数入口参数有一个Index指明了当前是第几个Text)。并且,需要访问这些Text的时候,可以把他们当作数组访问。
请问,delphi中是怎样实现类似功能的呢?
请问,delphi中是怎样实现类似功能的呢?
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;
那么,如果需要定义每一个Edit的OnChange事件
(类似于procedure TForm1.Edit1Change(Sender: TObject);)。
该怎么定义好些呢?多谢!
为了在一个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;
i: integer;
begin
for i:=0 to self.ComponentCount-1 do
if (Self.Components[i] is TEdit) then
//Showmessage(TEdit(Components[i]).Caption);作你想做的事情
end;
由于在几乎所有Delphi的控件事件处理程序中,都会传递一个Sender: TObject 对象。这样,就可以通过它来检查调用对象的Tag属性,从而判别是哪个对象触发了事件。:)
(类似于procedure TForm1.Edit1Change(Sender: TObject);)。
该怎么定义好些呢?
---------------------------------------------------
Edit1.OnChange:=Edit1Change;
http://www.rtgame.com/example.rar
比VB还方便!
多谢!
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;