В приложении имеются два объекта действий AFind и AReplace, выполняющих соответственно поиск и замену. Имеется также два компонента диалогов FindDialogl и ReplaceDialogl. Обработчиком события OnExecute обоих действий является процедура AFindExecute. Первый оператор этой процедуры запоминает в глобальной переменной SPos позицию курсора SelStart. Затем анализируется имя действия, являющегося источником события. Если это имя "AFind", то в переменную Dialog заносится указатель на диалог FindDialogl. В противном случае в эту переменную заносится указатель на диалог ReplaceDialogl. Таким образом, весь последующий код применим в равной степени и для операции поиска, и для операции замены.

Далее в свойство FindText диалога заносится текст, выделенный в окне RichEditl - свойство SelText. В свойство Position заносится с помощью метода Forml.ClientToScreen значение, позиционирующее диалог вблизи нижнего края окна RichEditl. Включается опция frHideUpDown, удаляющая из окна диалога кнопки Вверх и Вниз, задающие направление поиска. Дело в том, что приведенный код обеспечивает поиск только вниз от текущей позиции курсора. Поиск вверх требует дополнительного усложнения кода и в данном примере не реализован. В следующем разделе будет показан вариант, обеспечивающий поиск в обоих направлениях.

После задания значений всех этих свойств вызывается метод Execute, инициирующий диалог.

Оператор, задающий значение свойства Position, использует функцию Point. В приложениях VCL .NET для того, чтобы компилятор распознал эту функцию, необходимо добавить в предложение uses ссылку на пространство имен Types:

uses ... Types;

В обоих компонентах-диалогах FindDialogl и ReplaceDialogl в качестве обработчика события OnFind, возникающего после каждого щелчка пользователя на кнопке Найти далее в окне диалога, задана процедура FindDialogl Find. В начале этой процедуры формируется множество опций поиска Opt в соответствии с заданными пользователем условиями, возвратившимися в свойстве Options. Затем описанным выше методом FindText осуществляется поиск заданного пользователем фрагмента, содержащегося в свойстве FindText. Поиск начинается с позиции SPos. Результат поиска заносится в ту же переменную SPos. Если значение SPos получилось отрицательным, значит очередное вхождение фрагмента не найдено. В этом случае пользователю выдается сообщение об этом и запрос об окончании работы с диалогом. Если же значение SPos неотрицательное, значит очередное вхождение фрагмента найдено. Тогда это вхождение выделяется в окне RichEditl. Значение SPos увеличивается на 1, чтобы следующий поиск проводился начиная с позиции, превышающей найденную. Далее определяется, является ли диалог, с которым проводится работа, диалогом замены ReplaceDialogl и не задана ли для него опция frReplaceAll, включающаяся при щелчке пользователя на кнопке Заменить все в окне диалога. Если задана, то вызывается процедура ReplaceDialogl -Replace, которая будет описана далее.

В конце процедуры FindDialogl Find фокус передается окну RichEditl, чтобы пользователь мог увидеть выделенный фрагмент и что-то с ним сделать.

Процедура ReplaceDialogl Replace является обработчиком события OnRe-place компонента ReplaceDialogl. В нем выделенный в окне RichEditl текст заменяется текстом, указанным пользователем и содержащемся в свойстве Replace-Text. А затем, если опция frReplaceAll включена, производится опять вызов описанной выше процедуры FindDialogl Find. Таким образом, процедуры ReplaceDia-loglReplace и FindDialogl Find вызывают друг друга до тех пор, пока не закончится поиск всех вхождений заданного фрагмента текста.

5.5.4 Печать документа || Оглавление || 5.6.2 Поиск и замена с помощью стандартных действий


⇐ Предыдущая страница|

Приемы программирования в Delphi на основе VCL



Новости за месяц

  • Март
    2020
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс