Советы по Delphi. Версия 1.4.3 от 1.1.2001 - страница 17

стр.

> i := 1 to RecsCount do begin

>  { обpаботать данные }

>  Inc(DataPtr);

>  if PString(DataPtr)^ = NEXT_SELECTOR then begin

>   PtrRec(DataPtr).Seg := PtrRec(DataPtr).Seg + Ofs(AHIncr);

>   PtrRec(DataPtr).Ofs := $0;

>  end;

> end; { for i }

> GlobalUnlock(DataHdl);

>end;

События

Назначение обработчика события OnClick пункту меню, созданному во время выполнения программы

Delphi 1

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

>theMenuitem.OnClick := TheOnClickHandler;

Затем, в обработчике OnClick, вы приводите sender к TMenuItem и читаете имя:

>procedure theform.TheOnClickHandler(Sender: TObject);

>var

> fName: String;

>begin

> fName := TMenuItem(Sender).name;

> …

>end;

События для компонентов, созданных во время работы программы I

Delphi 1

Вы должны вручную создать метод, который будет иметь тот же самый набор параметров, как и у события, которое вы хотите обработать. Затем вы должны вручную установить свойство OnXXX, чтобы она указывала на метод, который вы создали.

Пример:

>TForm1 = class(TForm)

procedure FormCreate(Sender: TObject);

>private

>FMyButton: TButton;

>protected

> procedure Button1Click(Sender: TObject);

> {Кодируем это вручную,для соответствия}

> {структуреTNotifyEvent}

>end;


>procedure TForm1.FormCreate(Sender: TObject);

>begin

>FMyButton := TButton.Create;

> {Здесь устанавливаем позицию, заголовок и все остальное}

> FMyButton.OnClick := MyButtonClick;

>end;


>procedure TForm1.MyButtonClick(Sender: TObject);

>begin

>ShowMessage('Эй! Ты нажал на мою кнопку!');

>end;

События для компонентов, созданных во время работы программы II

Delphi 1

Вот простейший код для нового проекта с одной кнопкой и меню. (Надеюсь, в этом ничего сложного нет ... :)

>procedure TForm1.Button1Click(Sender: TObject);

>var

> NewItem: TMenuItem;

>begin

> NewItem := TMenuItem.Create(Form1);

> NewItem.Caption := 'Динамический элемент ...';

> NewItem.OnClick := xyz;MainMenu1.Items.Insert(0, NewItem); ←Примечание: рекомендую бегло ознакомиться с Delphi-примером для команды Insert…

>end;


>{Любая старая 'xyz'-процедура (в настоящее время может быть определена одна, например, Form1.DblClick)}

>procedure TForm1.xyz(Sender: TObject);

>begin

> showmessage('Запусти эту процедуру !!');

>end;

Примечание: Если вы пользуетесь неопределенной процедурой, вам понадобиться объявить ее. Лично я все это сделал в «верхнем правом углу» объявления типа формы, примерно так:

>private

>{ Private declarations }

>public

>{ Public declarations }

>procedure xyz(Sender: TObject); ←К этой процедуре могут иметь доступ не только события Form1 …

Установите свойство обработчика события (например, OnClick, OnDblClick, OnMouseDown и пр.) на процедуру, которую вы создали для обработки этого события. Вам нужно убедиться в том, что параметры в точности соответствуют параметрам ожидаемого заданного обработчика события.

Например:

>MySpeedButton.OnClick := MyClickEventHandler;

где…

>procedure MyClickEventHandler(Sender: TObject);

>begin

>end;

Массивы

Динамические массивы V

SottNick пишет:

Если хочется, чтобы в многомерном массиве был разный размер у разных измерений например: VarArray: array[1..2, 1..?] of TType , где ? зависит от "строки" массива (1..2)

То дозволяется сделать так:

1. Объявление

>Var VarArray: array of array of array…………

2. Установка длин

>SetLength(VarArray, Razmernost1); // У первого измерения

>SetLength(VarArray[1], Razmernost2); // У второго измерения первой «строки»

>SetLength(VarArray[2], Razmernost3); // У второго измерения второй «строки»

>SetLength(VarArray[n], Razmernost4); // У второго измерения n-ной «строки»

>SetLength(VarArray[1][1], Razmernost5); // У третьего измерения первой «строки» первого «столбца»

>SetLength(VarArray[1][2], Razmernost6); // У третьего измерения первой «строки» второго «столбца»

>SetLength(VarArray[n][m], Razmernost7); // У третьего измерения n-ной «строки» m-ного «столбца»

т.д.

Все можно изменять в процессе естественно.

3. Получение длин

>Razmernost1:=Length(VarArray); // У первого измерения (количество строк)

>Razmernost2:=Length(VarArray[1]); // У второго измерения первой «строки» (количество столбцов)