2017-01-17 3 views
0

У меня есть многочисленные процедуры, которые динамически создают TButton, когда пользователь нажимает кнопку. Следующий код является примером этого:Повторяя процедуру, указанное пользователем количество раз

procedure TForm1.Button2Click(Sender: TObject); 

begin 

if not Assigned(FSeatButton) then begin 

    FSeatButton := TButton.Create(self); 
    FSeatButton.Parent := self; 
    FSeatButton.Left := 100; 
    FSeatButton.Top := 100; 
    FSeatButton.Width := 62; 
    FSeatButton.Height := 25; 
    FSeatButton.Caption := ('Seat'); 
    FSeatButton.OnMouseDown := ButtonMouseDown; 
    FSeatButton.OnMouseMove := ButtonMouseMove; 
    FSeatButton.OnMouseUp := ButtonMouseUp; 

end; 
end; 

Это создает TButton, который пользователь может затем перетащить вокруг через нижние 3 процедур. Мне нужно, чтобы эта процедура повторялась каждый раз, когда пользователь нажимает кнопку2, но если я использую идентификатор цикла for/repeat, нужно указать, когда его завершить, но я не знаю, сколько кнопок потребуется пользователю.

Также (Это может быть идея для другого вопроса), как бы я сохранил каждую кнопку, созданную с ее собственным идентификатором, как таковой E.G Button1, Button2 ... ButtonN. Я предполагаю, что мне нужна какая-то переменная, которая увеличивается каждый раз, когда пользователь нажимает кнопку, и она каким-то образом включается в имя EG ButtonI

+0

@DavidHeffernan она позволяет одной кнопкой быть создана после того, как создан, он не работает снова –

+0

Просто удалите «если не назначен» бит его и установить имя кнопки. Просто убедитесь, что имя уникально, например. увеличивая переменную и добавляя ее в «Seat» – Dsm

ответ

5

Похоже, вам просто нужно следить за всеми кнопками, которые были добавлены. Используйте контейнер, чтобы сделать так:

В объявлении типа добавить контейнер:

uses 
    System.Generics.Collections; 

.... 

FButtons: TList<TButton>; 

Instantiate его в конструкторе формы, и уничтожить его в деструкторе. Или используйте события OnCreate и OnDestroy, если вы предпочитаете.

Затем при создании кнопки, добавьте его в список:

procedure TForm1.Button2Click(Sender: TObject); 
var 
    Button: TButton; 
begin 
    Button := TButton.Create(self); 
    Button.Parent := Self; 
    Button.Left := 100; 
    // etc. 

    FButtons.Add(Button); 
end; 

Если вам не нужно ссылаться на кнопки после их создания, то вам не нужен список, и вы можете просто сделать это:

procedure TForm1.Button2Click(Sender: TObject); 
var 
    Button: TButton; 
begin 
    Button := TButton.Create(self); 
    Button.Parent := Self; 
    Button.Left := 100; 
end; 
+0

для TList, который лучше, чем динамический массив TButton imo –

+0

@ davidheffernan, вы могли бы объяснить, что вы подразумеваете под конструктором и деконструктором или можете привести пример, довольно новый для этого. Кроме того, когда я помещаю tlist в тип, он говорит необъявленный идентификатор, я что-то упускаю? –

+0

Начните здесь: http://docwiki.embarcadero.com/RADStudio/en/Methods_(Delphi)#Constructors и я добавил к ответу 'uses', который вам нужен для' TList '. –

2

Объявление FSeatButton : array of TButton; Таким образом, у вас есть уникальный экземпляр добавленных кнопок и могут называть их в последовательном порядке.

Каждый раз, когда Button2 щелкают добавить новую кнопку в массив:

procedure TForm1.Button2Click(Sender: TObject); 
var 
    len: Integer; 
begin 
    len := Length(FSeatButton); 
    SetLength(FSeatButton,len+1); 
    FSeatButton[len] := TButton.Create(self); 
    FSeatButton[len].Name := 'SeatButton'+IntToStr(len); 
    etc... 
end; 
+0

, можете ли вы объяснить, почему вы чувствуете, что это лучше? –

+0

«TList» - это класс, инкапсулирующий динамический массив и добавляющий множество методов для обработки внутренних элементов массива. В вашем случае он добавляет дополнительное кодирование для управления этим классом (строительство/уничтожение), так как вы не используете все дополнительные возможности, которые предлагает «TList». Динамический массив - это все, что вам нужно, вы добавляете только новый элемент и можете легко управлять каждым элементом после этого, если это необходимо. А динамический массив имеет встроенную систему подсчета ссылок, что означает, что вам не нужно управлять временем жизни. Когда массив выходит из сферы действия, он будет удален автоматически. –

+0

Итак, в более поздней точке я смогу ссылаться на объекты в массиве и сохранить их имя, местоположение и т. Д. –