关于扫雷的若干小问题,各位大哥有空的进 ( 积分: 50 )

  • 主题发起人 主题发起人 redsea317
  • 开始时间 开始时间
R

redsea317

Unregistered / Unconfirmed
GUEST, unregistred user!
想实现扫雷程序,于是想到了动态的添加Button的问题。如何添加并控制位置?

添加其他的控件也是一样的吗?比如SpeedButton?
 
想实现扫雷程序,于是想到了动态的添加Button的问题。如何添加并控制位置?

添加其他的控件也是一样的吗?比如SpeedButton?
 
例:
var
TmpButton: TButton;
begin
TmpButton := TButton.Create(Self);
TmpButton.parent := Self;
TmpButton.Left := 100;
TmpButton.Top := 100;
...
end;

对其他VCL也是一样的
 
var
sb: TSpeedButton;

begin
sb := TSpeedButton.Create(nil);
sb.Parent := self;
sb.Top := 0; //按钮的y坐标
sb.Left := 0; //按钮的x坐标
sb.Width := 20; //按钮的宽
sb.Height := 20; //按钮的高
end;
 
我可能要添加100多个Button呢,能不能实现呢?

循环可以实现吗?
 
如果要动态添加控件,那么就要提前知道控件得类名,如speedbutton是Tspeedbutton, edit是TEdit,
方法是首先声明,然后调用构造函数(create),用完后调用析构函数(free),也可以在程序关闭时统一释放。
 
这是我自己的组件的创建,一行放3个
function CalcPolygonDrawPosition(ID: Integer): TGraphBuilder;
var
I: Integer;
begin
Result := TGraphBuilder.Create(ScrollBox1);
Result.ScrollBars := ssNone;
Result.Parent := ScrollBox1;
Result.Width := Round((ScrollBox1.Width - 44) / 3);
Result.Height := Result.Width;
case ID mod 3 of
0:
begin
Result.Left := 24 + 2 * Result.Width;
end;
1:
begin
Result.Left := 8;
end;
2:
begin
Result.Left := 16 + Result.Width;
end;
end;
I := (ID - 1) div 3;
Result.Top := (I + 1) * 8 + (I * Result.Height) -ScrollBox1.VertScrollBar.Position;

Result.OnMouseDown := MouseDown;
Result.OnDblClick := DblClick;
FGraphBuilderList.Add(Result);
end;
 
我狂晕啊,我用了如下代码实现界面:
procedure TForm1.FormCreate(Sender: TObject);
var
TmpButton: TButton;
i,j:integer;
begin
for i:=0 to 8 do
begin
for j:=0 to 8 do
begin
TmpButton := TButton.Create(Self);
TmpButton.parent:=Self;
TmpButton.Left:=20*j;
TmpButton.Top:=20*i;
TmpButton.Width:=20;
TmpButton.Height:=20;
end;
end;
end;

效果还可以,但是我想控制某个Button的时候出现了问题,添加的九九八十一个Button不好控制了:
1是我都不知道它们的名字,我猜是1到81吧,并且是按照顺序出现的
2是我不能写如下代码:Button1.Click(),因为Button是动态生成的,现在还没有Button这个东西呢!

我是菜鸟
请问各位大哥,这个问题应该怎么解决啊?
 
var
button : array[1..9,1..9] of TButton;



procedure TForm1.FormCreate(Sender: TObject);
var
i,j:integer;
begin
for i:=1 to 9 do
begin
for j:=1 to 9 do
begin
Button[i,j] := TButtonCreate(Self);
Button[i,j].parent:=Self;
Button[i,j].Left:=20*j;
Button[i,j].Top:=20*i;
Button[i,j].Width:=20;
Button[i,j].Height:=20;
Button[i,j].onclick:=form1.button1onclick;
end;
end;
end;
 
谢谢睢志强大哥,我明白了.
另外还有一件事情请教:
Button[i,j].onclick:=form1.button1onclick;这句话的含义我不太明白.睢大哥是让我在Form1上添加一个Button1,然后重写click事件,以此来控制所有的新添加的Button吗?
方法是很巧妙,不过怎样重写Click事件呢?
 
hehe,click以后可以根据他们的tag或者其他属性来判断是哪个按钮被按下的

case TButton(Sender).tag of
0:
1........
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部