Массив из CheckBox – использование разделяемого обработчика события II
var
CheckArray: array[1..x] ofTCheckBox;
i:integer;
begin
fori:=1 tox do begin
CheckArray[i]:=TCheckBox.Create(Form1);
{Устанавливаем свойства}
withCheckBox[i] do begin
Left:=i*20;
Width:=15;
другое…
end;
end;
Очевидно, можно сказать:
Check[i].OnClick:=xyz.
Пока я и сам не знаю как поступить. Динамическое создание компонентов да, но обработчики событий?
Существует способ организации массива checkbox'ов с разделяемым обработчиком события. Расположите их на форме и дайте им «непрерывные» имена (Check1, Check2 и т.д.). Затем установите у них общий обработчик события. Обработчик события может выглядеть так:
procedureTForm.Check1Click(Sender : TObject);
vari : Integer;
begin
fori := 1 to10 { предположим, что мы имеем 10 checkbox'ов } do
WithTCheckBox(FindComponent('Check'+IntToStr(i))) do begin
{ другой какой-то код }
end;
end;
Идентификация CheckBox'ов
В режиме проектирования вы, как программист, без труда узнаете, сколько checkbox'ов содержит ваша форма. А вот когда приложение запущено… Используйте Delphi Run Time Type Information (RTTI). Для нашей испытуемой формы вы можете попробовать следующий код:
vari : Integer
begin
fori := 0 toComponentCount - 1 do
ifComponents[i] isTCheckBox then
(Components[i] asTCheckBox).Checked then begin
... сюда поместите ваш код ...
end;
end;
Кроме того, следующий код Delphi абсолютно корректен:
ifComponents[i] = CheckBox5 then Чтотоделаем;
Также, каждый компонент в Delphi имеет опубликованное (Published) свойство с именем 'Tag', значение которого вы можете задавать во время создания компонента, и затем, во время выполнения приложения, обращаться к нему для получения доступа к компоненту:
vari : Integer
begin
fori := 0 toComponentCount - 1 do
ifComponents[i] isTCheckBox then
with(Components[i] asTCheckBox) do
CaseTag of
1 : ifChecked thenDoSomethingOnBox1;
2 : ifChecked thenDoSomethingOnBox2;
… другое …
end;
end;
Для получения дополнительной информации, обратитесь к справке Delphi с ключевым словом «ComponentCount».
Кнопка с несколькими строчками текста III
Вот полный код проекта, создающего на кнопке во время выполнения две строчки текста.
programTwolnBtn;
usesForms,TwolnBtu in'TWOLNBTU.PAS' {Form1};
{$R *.RES}
begin
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Файл TWOLNBTU.TXT → TWOLNBTU.DFM
objectForm1: TForm1
Left = 202
Top = 98
Width = 320
Height = 176
Caption = 'Form1'
Font.Color = clRed
Font.Height = -12
Font.Name = 'Arial'
Font.Style = [fsBold]
PixelsPerInch = 96
OnActivate = ChgSpeedButton
OnCreate = ChgBitBtn
TextHeight = 15
objectSpeedButton1: TSpeedButton
Left = 144
Top = 24
Width = 65
Height = 45
Caption = 'Это двустрочный заголовок'
OnClick = ChgSpeedButton
end
object
BitBtn1: TBitBtn
Left = 32
Top = 24
Width = 69
Height = 37
Caption = 'Прерывание работы программы'
TabOrder = 0
OnClick = BitBtn1Click
end
end
Файл TWOLNBTU.PAS
unitTwolnbtu;
interface
usesSysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons;
typeTForm1 = class(TForm)
BitBtn1: TBitBtn;
SpeedButton1: TSpeedButton;
procedureChgBitBtn(Sender: TObject);
procedureChgSpeedButton(Sender: TObject);
procedureBitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
varForm1: TForm1;
implementation
{$R *.DFM}
procedureTForm1.ChgBitBtn(Sender: TObject);
Читать дальше