Шрифт:
Интервал:
Закладка:
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
for i := 0 to ComponentCount - 1 do
if Components[i] is TCheckBox then
(Components[i] as TCheckBox).Checked then begin
... сюда поместите ваш код ...
end;
end;
Кроме того, следующий код Delphi абсолютно корректен:
if Components[i] = CheckBox5 then Чтотоделаем;
Также, каждый компонент в Delphi имеет опубликованное (Published) свойство с именем 'Tag', значение которого вы можете задавать во время создания компонента, и затем, во время выполнения приложения, обращаться к нему для получения доступа к компоненту:
var i : Integer
begin
for i := 0 to ComponentCount - 1 do
if Components[i] is TCheckBox then
with (Components[i] as TCheckBox) do
Case Tag of
1 : if Checked then DoSomethingOnBox1;
2 : if Checked then DoSomethingOnBox2;
… другое …
end;
end;
Для получения дополнительной информации, обратитесь к справке Delphi с ключевым словом «ComponentCount».
BitBtn
Кнопка с несколькими строчками текста III
Вот полный код проекта, создающего на кнопке во время выполнения две строчки текста.
program TwolnBtn;
uses Forms,TwolnBtu in 'TWOLNBTU.PAS' {Form1};
{$R *.RES}
begin
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Файл TWOLNBTU.TXT → TWOLNBTU.DFMobject Form1: 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
object SpeedButton1: 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.PASunit Twolnbtu;
interface
uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons;
type TForm1 = class(TForm)
BitBtn1: TBitBtn;
SpeedButton1: TSpeedButton;
procedure ChgBitBtn(Sender: TObject);
procedure ChgSpeedButton(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.ChgBitBtn(Sender: TObject);
VAR
R : TRect;
N : Integer;
Buff : ARRAY[0..255] OF Char;
BEGIN
WITH BitBtn1 DO BEGIN
Glyph.Canvas.Font := Self.Font;
Glyph.Width := Width-6;
Glyph.Height := Height-6;
R := Bounds(0,0,Glyph.Width,0);
StrPCopy(Buff, Caption);
Caption := '';
DrawText(Glyph.Canvas.Handle, Buff, StrLen(Buff), R, DT_CENTER OR DT_WORDBREAK OR DT_CALCRECT);
OffsetRect(R, (Glyph.Width-R.Right) DIV 2, (Glyph.Height - R.Bottom) DIV 2);
DrawText(Glyph.Canvas.Handle, Buff, StrLen(Buff), R, DT_CENTER OR DT_WORDBREAK);
END;
END;
procedure TForm1.ChgSpeedButton(Sender: TObject);
VAR
R : TRect;
N : Integer;
Buff : ARRAY[0..255] OF Char;
BEGIN
WITH SpeedButton1 DO BEGIN
Glyph.Canvas.Font := Self.Font;
Glyph.Width := Width-6;
Glyph.Height := Height-6;
R := Bounds(0,0,Glyph.Width,0);
StrPCopy(Buff, Caption);
Caption := '';
DrawText(Glyph.Canvas.Handle, Buff, StrLen(Buff), R,DT_CENTER OR DT_WORDBREAK OR DT_CALCRECT);
OffsetRect(R, (Glyph.Width-R.Right) DIV 2, (Glyph.Height - R.Bottom) DIV 2);
DrawText(Glyph.Canvas.Handle, Buff, StrLen(Buff), R,DT_CENTER OR DT_WORDBREAK);
END;
END;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Close;
end;
end.
-Dennis Passmore
ComboBox
Хочу реализовать правильный выпадающий контрол (combo). Как это сделать?
Nomadic отвечает:
Когда-то потратил немало времени на разбор, как же все таки работают дропдаун-контролы. В итоге мной был написан маленький юнит, который я положил у себя в каталоге Demo для ознакомления интересующихся. Он маленький (его основная задача — показать принцип работы, а все остальное — как реализуешь), я думаю, что большинству он пригодиться, поэтому публикую здесь. Касательно твоего вопроса - реализуй вместо листбокса выпадающий контрол, который даст тебе функциональность дерева.
unit edit1;
- Фундаментальные алгоритмы и структуры данных в Delphi - Джулиан Бакнелл - Программирование
- iOS. Приемы программирования - Вандад Нахавандипур - Программирование
- QT 4: программирование GUI на С++ - Жасмин Бланшет - Программирование
- C# для профессионалов. Том II - Симон Робинсон - Программирование
- Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен - Программирование
- Программирование игр и головоломок - Жак Арсак - Программирование
- Стандарты программирования на С++. 101 правило и рекомендация - Герб Саттер - Программирование
- C# 4.0: полное руководство - Герберт Шилдт - Программирование
- Программирование на Python с нуля - Максим Кононенко - Программирование
- Генерация высококачественного кода для программ, написанных на СИ - Филипп Хислей - Программирование