Как удалить аналогичный номер на второй панели при нажатии на кнопку с первой панели? - PullRequest
0 голосов
/ 25 марта 2020

У меня такая задача, есть группа кнопок с цифрами на первой панели и пять чисел случайным образом выбираются на второй панели. Как при нажатии на кнопку на первой панели удалить аналогичные номера на второй панели (этот номер также следует удалить с первой панели), а затем произвольно заменить удаленную кнопку на второй панели, чтобы удаленные номера больше никогда не повторялись , Как это сделать? Пример картины. 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.

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

В обработчике события кнопки onclick вы хотели бы:

  1. Определить номер (тег или заголовок), по которому щелкнули
  2. Выполните поиск по элементам управления на Panel2, чтобы найти match
  3. Если найдено, удалите оба элемента управления, затем
  4. Выберите случайное число оставшихся элементов управления на Panel1
  5. Используйте случайный индекс для клонирования новой кнопки на Panel2

В приведенном выше коде вы должны установить Parent каждого объекта кнопки на один из двух GroupBox. Это поместит кнопки в список элементов управления каждой группы, например, GroupBox1.ControlCount или GroupBox1.Controls [0]. Вы не устанавливаете свойство Tag для 5 кнопок во второй группе, что означает, что вам придется использовать подпись, чтобы найти совпадение. Кроме того, массивы в Delphi начинаются с нуля. Вы должны изменить свой код соответственно .

0 голосов
/ 25 марта 2020

Я изменил вашу 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;
...