Материал: Мансуров. Основы программирования в среде Lazarus. 2010

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

6.3 Визуальное программирование в среде Lazarus

____________________________________________________________________

function ListSortRus(List: TStringList; Index1, Index2: integer): integer;

begin

Result:= WideCompareText(UTF8Decode(List[Index1]),

UTF8Decode(List[Index2]));

end;

Функция

UTF8Decode(const S: UTF8String): WideString - преобразует

строку формата UTF-8 к строке формата Unicode.

Перепишите обработчик OnClick кнопки:

procedure TForm1.Button1Click(Sender: TObject); var

strList: TStringList; begin

strList:= TStringList.Create; strList.Duplicates:= dupAccept; strList.AddStrings(Memo1.Lines); strList.CustomSort(@ListSortRus); Memo2.Clear; Memo2.Lines.AddStrings(strList); strList.Free;

end;

В обработчике изменилась только одна строка. Вместо метода Sort вы-

зывается CustomSort(@ListSortRus). Как видите, чтобы передать функ-

цию как параметр, надо перед именем функции поставить знак @.

576

Глава 6 Программирование приложений с графическим интерфейсом

____________________________________________________________________

Теперь сортировка будет правильно работать как для латиницы, так и для кириллицы.

Во-вторых, довольно часто необходимо осуществлять поиск. Причем не только отдельных строк целиком, но и некоторой части строки (говорят еще подстроки). Если говорить о тексте, то необходимо найти слово, фразу или предложение, причем предложение может занимать несколько строк.

Для поиска удобно использовать свойство Text компонента TMemo в ко-

тором весь набор строк представляется в виде одной длинной строки и функ-

цию Pos, которую мы изучали в 3.3. Составим программу поиска слов в тек-

стовом файле. Создайте новый проект. Поместите на форму компоненты как показано на рис. 6.52.

Рис. 6.52. Форма приложения

Введите следующий код:

procedure TForm1.FormShow(Sender: TObject);

begin

Memo1.Lines.LoadFromFile('File in English.txt');

Edit1.SetFocus;

577

6.3 Визуальное программирование в среде Lazarus

____________________________________________________________________

end;

procedure TForm1.Button1Click(Sender: TObject); var

k: integer; begin

Edit1.SetFocus;

Edit1.SelectAll;

if Edit1.Text= '' then begin

ShowMessage('Введите строку для поиска'); exit;

end;

k:= Pos(Edit1.Text, Memo1.Text); if k > 0 then

begin Memo1.SetFocus;

Memo1.SelStart:= k - 1 ;

Memo1.SelLength:= Length(Edit1.Text);

end else

ShowMessage('Строка не найдена'); end;

Во время создания окна программы в Memo1 загружается текстовый файл.

В обработчике нажатия кнопки осуществляется поиск фрагмента текста, вве-

денного пользователем в поле ввода Edit1. Для выделения найденного фраг-

мента используется свойство Memo1.SelStart и Memo1.SelLength. Что-

бы найденный текст был выделен необходимо, чтобы фокус был установлен в

578

Глава 6 Программирование приложений с графическим интерфейсом

____________________________________________________________________

Memo1. В этом примере мы осуществляли поиск в текстовом файле, в котором содержится только английские буквы. Для текста, содержащего кириллицу,

наша программа работать корректно не будет.

Поэтому нам придется видоизменить программу для поиска в текстовых файлах, содержащих кириллицу. В обработчике OnCreate формы загружаем кириллический текст в Memo1, предварительно преобразовав его в UTF-8 (для

Windows). В обработчике OnClick мы используем уже знакомую нам функ-

цию UTF8Decode, а также функции UTF8Pos и UTF8Length. Не забудьте включить модуль LCLProc в объявление uses.

procedure TForm1.FormShow(Sender: TObject); var

tfile: TStringList; str: string;

begin

tfile:= TStringList.Create; tfile.LoadFromFile('File in Russian.txt'); str:= tfile.Text;

{$IFDEF WINDOWS}

str:= SysToUTF8(str); // преобразование в кодировку UTF-8

{$ENDIF} Memo1.Lines.Add(str); tfile.Free;

end;

procedure TForm1.Button1Click(Sender: TObject); var

k: integer;

text_UTF8, str_UTF8: string; begin

579

6.3 Визуальное программирование в среде Lazarus

____________________________________________________________________

Edit1.SetFocus;

if Edit1.Text= '' then

begin

ShowMessage('Введите строку для поиска'); exit;

end;

text_UTF8:= UTF8Decode(Memo1.Text); str_UTF8:= UTF8Decode(Edit1.Text); k:= UTF8Pos(str_UTF8, text_UTF8); if k > 0 then

begin Memo1.SetFocus;

Memo1.SelStart:= k - 1;

Memo1.SelLength:= UTF8Length(str_UTF8);

end else

ShowMessage('Строка не найдена'); end;

Позволим пользователю заканчивать ввод в Edit1 нажатием клавиши

Enter. Чтобы избежать дублирования кода, создадим процедуру

CyrillicSearch и в обработчиках будем вызывать эту процедуру:

unit Unit1;

{$mode objfpc}{$H+} interface

uses

Classes, SysUtils, FileUtil, LResources, Forms,

Controls, Graphics, Dialogs, StdCtrls, LconvEncoding,

580

Смотрите также:

11 Горм +
113
14
1433
1511
1632
199
204
2N4264RE
3773