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

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

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

____________________________________________________________________

му. Обратите внимание на оператор

fname:= UTF8ToSys(fname);

Если имя файла, а также путь содержит кириллицу, то необходимо строку с именем файла и путем преобразовать в системную кодировку.

Для вызова диалога сохранения файла необходимо написать следующий

код:

procedure TForm1.Button2Click(Sender: TObject); var

fname, str: string; tfile: TStringList;

begin

tfile:= TStringList.Create; // создание списка строк str:=Memo1.Text;

{$IFDEF WINDOWS}

str:= UTF8ToSys(str);// преобразование в системную кодировку

{$ENDIF} tfile.Add(str);

SaveDialogl.FileName:= fname; if SaveDialogl.Execute

then fname:= SaveDialogl.FileName;

// преобразование в системную кодировку

fname:= UTF8ToSys(fname);

tfile.SaveToFile(fname);

tfile.Free;

end;

При нажатии кнопки Button2 будет открыт стандартный диалог сохране-

ния файла, рис. 6.49, 6.50.

571

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

____________________________________________________________________

Рис. 6.49. Стандартный диалог сохранения файла в Windows.

Рис. 6.50. Стандартный диалог сохранения файла в Linux.

Так, загружать файлы в TMemo и сохранять мы научились. Теперь давайте посмотрим, какие манипуляции со строками можно будет делать.

Во-первых, можно сортировать. Если набор строк содержит только симво-

572

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

____________________________________________________________________

лы латиницы, организовать сортировку достаточно тривиально. Можно устано-

вить просто свойство Sorted: true в TStringList и строки будут отсор-

тированы по алфавиту автоматически. Можно применить метод Sort.

Создайте новый проект. Спроектируйте окно будущего приложения на форме так, как показано на рис. 6.51.

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

В обработчике нажатия кнопки введите код:

procedure TForm1.Button1Click(Sender: TObject);

var

strList: TStringList;

begin

strList:= TStringList.Create;

strList.Duplicates:= dupAccept;

strList.AddStrings(Memo1.Lines);

strList.Sort;

Memo2.Clear;

573

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

____________________________________________________________________

Memo2.Lines.AddStrings(strList);

strList.Free;

end;

В Memo1 введите несколько строк латиницей. При нажатии кнопки "Сортиро-

вать" в Memo2 выведутся строки, отсортированные в алфавитном порядке.

Однако этот код не работает для строк, содержащих кириллицу. Происхо-

дит это, опять же, из-за кодировки UTF-8. По умолчанию TStringList ис-

пользует следующую функцию, которая работает с ANSI строками:

function TStringList.DoCompareText(const s1,s2 : string)

: PtrInt;

begin

if FCaseSensitive then

result:= AnsiCompareStr(s1,s2)

else

result:= AnsiCompareText(s1,s2);

end;

К счастью, среди методов класса TStringList имеется метод

CustomSort. Его объявление в классе имеет вид:

type

TStringListSortCompare = function(List: TStringList; Indexl, Index2: integer): integer;

procedure CustomSort(CompareFn: TStringListSortCompare);

Можно воспользоваться методом CustomSort передав ему в качестве па-

раметра свою функцию сравнения. Чтобы отсортировать список, построим функцию сравнения двух элементов S1 и S2 с индексами indexl и index2

574

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

____________________________________________________________________

соответственно, которая должна возвращать:

<0 — если, S1 < S2;

0 — если, S1 = S2;

> 0 — если, S1 > S2;

Функция имеет вид:

function ListSortRus(List: TStringList; Index1, Index2:

integer): integer;

begin

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

UTF8Decode(List[Index2]));

end;

Здесь используется функция:

function WideCompareText(const S1: WideString; const S2:

WideString): integer;

Она работает со строками WideString. Тип WideString представляет собой динамически размещаемые в памяти строки, длина которых ограничена только объемом свободной памяти. Каждый символ строки типа WideString

является Unicode-символом. Функция возвращает результат:

<0 — если, S1 < S2;

0 — если, S1 = S2;

> 0 — если, S1 > S2;

Это как раз то, что нам нужно! В разделе implementation добавьте описание функции

575

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

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