Как выбрать пять случайных неповторяющихся кнопок и скопировать их в панель1? - PullRequest
1 голос
/ 26 октября 2019

У меня 20 кнопок, которые создаются автоматически при запуске программы. Как выбрать пять случайных неповторяющихся кнопок и скопировать их в компонент Panel1?

image

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1:TForm1;
  but:array[1..9] of TButton;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  i: integer;
begin
  for i := 1 to 20 do
  begin
    but[i] := TButton.Create(Form1);
    but[i].Parent := Form1;
    but[i].Caption := IntToStr(i);
    but[i].Font.Size := 26;
    but[i].Width := 50;
    but[i].Height := 50;
    but[i].Left := 50 + Round(i mod 3)*but[i].Width;
    but[i].Top := 50 + Round(i / 3)*but[i].Height;
  end;
end;

end.

1 Ответ

6 голосов
/ 26 октября 2019

Алгоритм такой:

  1. Содержит ссылки на кнопки в массиве.
  2. Выполните равномерное перемешивание массива, например, используя Фишер-Йейтс перемешивание.
  3. Выберите первые 5 элементов из массива.

Вы можете оптимизировать это, если хотите, прерывая перемешивание после 5 итераций его цикла, потому что первые 5 элементов уже были выбраны к этому моменту. Тем не менее, это, вероятно, не нужно для такого маленького массива.

Существует множество реализаций Фишера-Йейта, хотя имейте в виду, что большая часть их реализована неправильно! Правильные реализации также имеются в большом количестве, например, здесь https://stackoverflow.com/a/20361298/505088

Вы можете сделать хуже, чем использовать библиотеку spring4d для этой задачи.

Что касается кнопок копирования, создайте новые кнопки и скопируйте поверхсвойства, которые вам нужны. Может быть проще представить эту работу как фактический выбор 5 случайных чисел от 1 до 20, а затем создание 5 кнопок с этими цифрами. Опять же, это просто перемешивание чисел.

Если вы хотите поместить 20 элементов в массив, вам нужно убедиться, что массив достаточно большой. Ваш массив может содержать 9 элементов, но вы пытаетесь вставить 20.

...