Рейтинговые книги
Читем онлайн Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 62 63 64 65 66 67 68 69 70 ... 123

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.DFM

object 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.PAS

unit 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;

1 ... 62 63 64 65 66 67 68 69 70 ... 123
На этой странице вы можете бесплатно читать книгу Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров бесплатно.

Оставить комментарий