Delphi 3. Библиотека программиста

Первая попытка


Общий сценарий выглядит так: я выбираю нужную вкладку и перетаскиваю строку с описанием задачи на сетку. Для всех трех страниц при этом выполняются практически одинаковые операции. Единственное отличие заключается в том, какая сетка получает строку. Следовательно, необходимо придумать способ совместного использования обработчиков OnDragOver и OnDrag Drop всеми тремя сетками.

Наверное, это вопрос личного вкуса, но я предпочитаю, чтобы совместно используемые обработчики событий имели более внятные имена, чем генерирует Delphi. Я решил назвать их GridDragOver и GridDragDrop.

Перед тем как следовать дальше, опишу алгоритм для создания нестандарт ных имен обработчиков1:

  1. Дважды щелкните на имени обрабатываемого события в инспекторе объектов.
  2. Delphi автоматически создаст уникальное имя процедуры, объединив в нем имена компонента и события. Что еще важнее, при этом автомати чески генерируется список параметров для обработчика данного
    события (я слишком ленив и предпочитаю, чтобы вместо меня этим занималась среда Delphi).
  3. Введите любой текст (например, точку с запятой) между begin и end
    пустой процедуры, созданной Delphi. Это предотвращает автоматичес кое удаление процедуры при попытке сохранить файл.
  4. Отредактируйте имя процедуры, затем выделите его двойным щелчком и нажмите Ctrl+C, чтобы скопировать в буфер.
  5. Перейдите в начало файла и найдите объявление исходного обработ чика среди прочих объявлений формы. Выделите исходное имя и нажмите Ctrl+V, чтобы заменить его новым.
  6. В какой-то момент Delphi пожалуется, что исходное имя (все еще присутствующее в инспекторе объектов) не найдено. Подтвердите его удаление.


  7. Переместите курсор в пустую строку инспектора объектов. Вставьте в нее новое имя, нажимая Ctrl+V.
  8. Сохраните файл.

Исходный текст написанных мной процедур приведен в листинге16.1.

Листинг 16.1. Общие обработчики событий OnDragOver и OnDragDrop

{ Общий обработчик для события OnDragOver всех сеток. }

procedure TShareEventDemoForm.GridDragOver(Sender, Source: TObject;

X, Y: Integer; State: TDragState; var Accept: Boolean);

begin

{ Принимается все, что угодно, но только из текстового поля. }

Accept := Source is TEdit;

end;

{ Общий обработчик для события OnDragDrop всех сеток. }

procedure TShareEventDemoForm.GridDragDrop(Sender, Source : TObject;

X, Y : Integer);

1 Визуальные среды таят в себе серьезную опасность — люди начинают забывать, что у компьютера кроме мыши есть еще и клавиатура. Вот и Эйс Брейкпойнт (или Дон Тейлор?), судя по всему, даже не догадывался, что оставлять создание имен обработчиков на усмотре ние Delphi вовсе не обязательно. Просто введите желаемое имя в поле нужного события на вкладке Events и нажмите клавишу Enter. — Примеч. ред.

begin { Сбрасываем перетаскиваемый объект на текущую сетку. } DropEditString(CurrentGrid); end; { Вспомогательная процедура для сброса строки из текстового поля на указанную сетку. Также очищает содержимое текстового поля. } procedure TShareEventDemoForm.DropEditString (AGrid : TStringGrid); begin if AGrid <> nil then with AGrid do begin Cells[0, RowCount - 1] := EditBox.Text; RowCount := RowCount + 1; EditBox.Text := ''; end; { with } end; { Возвращает указатель на сетку, расположенную на текущей вкладке. } function TShareEventDemoForm.CurrentGrid : TStringGrid; begin Result := nil; if PageControl.ActivePage = MorningSheet then Result := MorningGrid else if PageControl.ActivePage = AfternoonSheet then Result := AfternoonGrid else if PageControl.ActivePage = EveningSheet then Result := EveningGrid; end;

Процедура OnDragOver выглядит очень просто. Объект, перетаскиваемый из текстового поля, может быть принят любой сеткой. Я решил разбить обработку OnDragDrop на две части: главный обработчик и вспомогательную процедуру. Обработчик ограничивается вызовом вспомогательной процедуры
с использованием функции, возвращающей указатель на сетку текущей вкладки1. Здесь проявляется способность Delphi скрывать работу с указателями, благодаря чему можно выполнить нужные операции и сохранить «четкость» программы. Получив указатель, процедура DropEditString заносит строку
из текстового поля в соответствующую сетку, добавляет в нее новую строку и стирает содержимое текстового поля.

Для сетки на первой вкладке (MorningGrid) обработчик делал именно то, что требовалось. Я вернулся к инспектору объектов и присоединил те же обработ чики к двум другим решеткам — и снова все идеально работало.

1 ?ешение, использующее для распознавания нужной сетки параметр Sender, является намного более элегантным. — Примеч. ред.



Содержание раздела