我有这样的任务,在第一个面板中有一组带数字的按钮,在第二个面板中随机选择了五个数字。在第一个面板中单击按钮时,如何在第二个面板中删除相似的数字(该数字也应从第一个面板中删除),然后随机替换第二个面板中的已删除按钮,以使删除的数字不再重复。怎么做?图片的例子。
我的代码是:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
procedure FormCreate(Sender: TObject);
procedure butClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
arr1: Array[1..20] of Integer;
but:array[1..9] of TButton;
but1:array[1..9] of TButton;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
i,x,k,tmp,N: integer;
A: array of integer;
begin
randomize();
arr1[1] := 34;
arr1[2] := 15;
arr1[3] := 79;
arr1[4] := 17;
arr1[5] := 91;
arr1[6] := 32;
arr1[7] := 11;
arr1[8] := 15;
arr1[9] := 12;
arr1[10] := 18;
arr1[11] := 21;
arr1[12] := 37;
arr1[13] := 75;
arr1[14] := 51;
arr1[15] := 30;
arr1[16] := 24;
arr1[17] := 94;
arr1[18] := 52;
arr1[19] := 43;
arr1[20] := 28;
N:=Length(arr1)-1;
setlength(A,Length(arr1));
Memo1.Clear;
for k := 1 to N do A[k] := arr1[k];
for k := 1 to N do begin
x := random(Length(arr1));
tmp := A[k];
A[k] :=A[x];
A[x] := tmp;
end;
for i := 1 to 5 do
begin
but1[i] := TButton.Create(Form1);
but1[i].Parent := Form1;
but1[i].Caption := IntToStr(A[i]);
but1[i].Font.Size := 26;
but1[i].Width := 50;
but1[i].Height := 50;
but1[i].Left := 300 + i * 50;
but1[i].Top := 50;
end;
for i := 1 to Length(arr1) do
begin
but[i] := TButton.Create(Form1);
but[i].Parent := Form1;
but[i].Caption := IntToStr(arr1[i]);
but[i].Font.Size := 26;
but[i].Width := 50;
but[i].Height := 50;
but[i].Tag := arr1[i];
but[i].Left := 50 + Round(i mod 3)*but[i].Width;
but[i].Top := 50 + Round(i / 3)*but[i].Height;
but[i].OnClick := butClick;
end;
end;
procedure TForm1.butClick(Sender: TObject);
begin
ShowMessage(IntToStr((Sender as TButton).Tag));
end;
end.
我更改了您的butClick
程序,在我的测试中效果很好。试试看:
procedure TForm1.butClick(Sender: TObject);
var
btn_tag, i: Integer;
n1Control, n2Control: TControl;
begin
btn_tag := (Sender as TButton).Tag;
ShowMessage(IntToStr(btn_tag));
n1Control := Sender as TButton;
n2Control := Nil;
for i := 0 to Form1.ControlCount - 1 do
if Form1.Controls[i] is TButton then
if ((Form1.Controls[i] as TButton).Caption = IntToStr(btn_tag)) and (Form1.Controls[i].Tag = 0) Then
n2Control := Form1.Controls[i];
if n2Control <> Nil then Begin
FreeAndNil(n1Control);
FreeAndNil(n2Control);
End;
end;
在按钮的onclick事件处理程序中,您想要:
在上面的代码中,应该将每个按钮对象的Parent设置为两个GroupBox之一。这会将按钮放在每个组框的“控件”列表中,例如GroupBox1.ControlCount或GroupBox1.Controls [0]。您没有为第二组中的5个按钮设置Tag属性,这意味着您必须使用Caption来找到匹配项。 此外,Delphi中的数组从零开始。您应该相应地调整代码]]。