KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001

Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Валентин Озеров, "Советы по Delphi. Версия 1.4.3 от 1.1.2001" бесплатно, без регистрации.
Перейти на страницу:

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;

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*