在第一个面板中单击按钮时如何在第二个面板中删除相似的数字?

问题描述 投票:0回答:2

我有这样的任务,在第一个面板中有一组带数字的按钮,在第二个面板中随机选择了五个数字。在第一个面板中单击按钮时,如何在第二个面板中删除相似的数字(该数字也应从第一个面板中删除),然后随机替换第二个面板中的已删除按钮,以使删除的数字不再重复。怎么做?图片的例子。my image

我的代码是:

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.
arrays delphi delphi-7
2个回答
0
投票

我更改了您的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;

0
投票

在按钮的onclick事件处理程序中,您想要:

  1. 确定所单击的数字(标签或标题)
  2. 在Panel2上的控件中搜索以找到匹配项
  3. 如果找到,则删除两个控件,然后>]
  4. 随机选择Panel1上其余控件的数量
  5. 使用随机索引在Panel2上克隆新按钮
  6. 在上面的代码中,应该将每个按钮对象的Parent设置为两个GroupBox之一。这会将按钮放在每个组框的“控件”列表中,例如GroupBox1.ControlCount或GroupBox1.Controls [0]。您没有为第二组中的5个按钮设置Tag属性,这意味着您必须使用Caption来找到匹配项。 此外,Delphi中的数组从零开始。您应该相应地调整代码]]。

© www.soinside.com 2019 - 2024. All rights reserved.