Чтение онлайн

ЖАНРЫ

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:

procedure Register;

begin

 RegisterComponents('Controls', [TColorBtn]);

end;

end.

Небольшое дополнение. Кнопку по прежнему рисует WINDOWS, а раскрашивает ее ColorBtn. Код компонента на 90% повторяет код BitBtn, ничего необычного здесь нет. Хочется повторить слова Калверта — «Пользуйтесь исходным кодом». Чаще заглядывайте в VCL – можно найти много интересного. 

Обработка

щелчка нескольких кнопок, используя их заголовок

Delphi 1 

…с ваших слов я понял, что вы все уже реализовали, но давайте все повторим: вы должны убедиться в том, что событие OnClick привязано к каждой кнопке калькулятора (числовые кнопки 0..9) и указывают на общий обработчик события.

В разделяемом обработчике события получите заголовок обрабатываемой кнопки следующим образом:

Edit1.Text := TButton(Sender).Caption;

…я думаю в этом случае самым разумным будет использование свойства Tag каждой кнопки:

1. назначьте уникальный Tag для каждой кнопки (например, эквивалент арабским цифрам)

2.

procedureTForm1.Button1Click(Sender: TObject);

begin

 if (Sender is TButton) then with (Sender as TButton) do

{используем Tag}

end;

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

procedure TForm1.Edit1Click(Sender: TObject);

begin

 edit1.text := (sender as TButton).caption;

end;

Приведенная ниже конструкция будет недостаточной:

sender.caption

поскольку компилятор не знает о том, имеет ли «sender» свойство caption, или нет. 

CheckBox 

Массив из CheckBox – использование разделяемого обработчика события I

Delphi 1 

Поместите несколько Checkbox в компонент TGroupBox. Во время прогона (или проектирования) назначьте общий обработчик события Click для всех checkbox'в. Чтобы в цикле обойти все «дочерние» TCheckBox'ы, можно воспользоваться свойством-массивом Controls TGroupBox (и заодно привести их к типу TCheckBox). Приблизительно так:

for i := 0 to GroupBox1.ControlCount -1 do

 if  (GroupBox1.Controls[i] as TCheckBox).checked then

{что-то там еще};

Вы можете получить имя sender следующим образом:

procedure TMain1.CheckBoxClick(Sender: TObject);

var whodidit: string[63];

begin

 whodidit := TComponent(sender).name;

end;

После

приведения типа можно добраться и до других свойств. К примеру, очень полезным может оказаться свойство Tag. Во время создания, вы можете присвоить каждому checkbox.tag свой ID номер. А в обработчике события, читая ID, можно идентифицировать sender. 

Массив из CheckBox – использование разделяемого обработчика события II

Delphi 1

var

 CheckArray: array[1..x] of TCheckBox;

 i:integer;

begin

 for i:=1 to x do begin

CheckArray[i]:=TCheckBox.Create(Form1);

{Устанавливаем свойства}

with CheckBox[i] do begin

Left:=i*20;

Width:=15;

другое…

end;

 end;

Очевидно, можно сказать:

Check[i].OnClick:=xyz.

Пока я и сам не знаю как поступить. Динамическое создание компонентов да, но обработчики событий?

Существует способ организации массива checkbox'ов с разделяемым обработчиком события. Расположите их на форме и дайте им «непрерывные» имена (Check1, Check2 и т.д.). Затем установите у них общий обработчик события. Обработчик события может выглядеть так:

procedure TForm.Check1Click(Sender : TObject);

var i : Integer;

begin

 for i := 1 to 10 { предположим, что мы имеем 10 checkbox'ов } do

With TCheckBox(FindComponent('Check'+IntToStr(i))) do begin

{ другой какой-то код }

 end;

end;

Идентификация CheckBox'ов

Delphi 3

В режиме проектирования вы, как программист, без труда узнаете, сколько checkbox'ов содержит ваша форма. А вот когда приложение запущено… Используйте Delphi Run Time Type Information (RTTI). Для нашей испытуемой формы вы можете попробовать следующий код:

var i : Integer

begin

Поделиться с друзьями: