Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

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

.pdf
Скачиваний:
45
Добавлен:
27.04.2021
Размер:
6.3 Mб
Скачать

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

____________________________________________________________________

Рис. 6.41. Стандартный диалог выбора шрифта в Windows.

Рис. 6.42. Стандартный диалог выбора шрифта в Linux.

Точно так же пользователь может устанавливать цвет фона окна TMemo.

561

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

____________________________________________________________________

Для этого используется компонент выбора цвета TColorDialog, располо-

женный в той же вкладке Dialogs. Видоизмените только что рассмотренный пример. Добавьте на форму компонент TColorDialog и кнопку, рис. 6.43.

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

Напишите следующий обработчик для кнопки "Изменить цвет фона":

procedure TForm1.Button3Click(Sender: TObject);

begin

if ColorDialog1.Execute then

Memo1.Color:= ColorDialog1.Color;

end;

Теперь пользователь может выбирать и устанавливать нужный ему цвет фона, рис. 6.44, 6.45.

Рис. 6.44. Стандартный диалог выбора цвета фона в Windows.

562

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

____________________________________________________________________

Рис. 6.45. Стандартный диалог выбора цвета фона в Linux.

Для дальнейшего нам понадобится умение работать с классом

TStringList. Класс TStringList имеет широкий набор свойств и мето-

дов для работы со списками строк. Рассмотрим основные свойства и методы этого класса.

 

Свойства класса:

 

 

Таблица 6.3

Count: integer;

 

Количество строк в наборе.

Strings[Index: Integer]:

 

Строка с индексом Index

string;

 

 

Text: string;

 

Весь набор строк представляется в виде одной

 

 

строки с разделителями возврат каретки и перенос

 

 

строки (#13#10) между строками.

Duplicates: TDuplicates;

 

Разрешает или не разрешает добавление одинако-

 

 

вых строк. Если Duplicates= dupIgnore

 

 

одинаковая строка не добавляется, при

 

 

Duplicates= dupAccept – добавление одина-

 

 

ковых строк в набор строк разрешено, при

 

 

Duplicates= dupError – при попытке добав-

 

 

ления одинаковых строк генерируется исключение

 

 

EListError

 

 

 

Sorted: boolean

 

Если Sorted= true – строки набора автоматиче-

 

 

ски сортируются по алфавиту.

563

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

____________________________________________________________________

Методы класса:

 

Таблица 6.4

function Add(const S: string):

Добавляет строку в набор данных и

integer;

возвращает ее индекс

procedure AddStrings(Strings:

Добавляет к текущему набору новый

TStrings);

набор строк

procedure Append(const S:string) ;

Добавляет к текущему набору новый

 

набор строк, но не возвращает индекс

 

вставленной строки

procedure Assign(Source:

Уничтожает прежний набор строк и

TPersistent);

загружает из Source новый набор. В

 

случае неудачи возникает исключение

 

EсоnvertError

procedure Clear;

Очищает набор данных и освобождает

 

связанную с ним память

procedure Delete(Index: integer);

Уничтожает элемент набора с индек-

 

сом Index и освобождает связанную с

 

ним память

function Equals(Strings:TStrings):

Сравнивает построчно текущий набор

boolean;

данных с набором Strings и возвращает

 

True, если наборы идентичны

function IndexOf(const S:string):

Для строки S возвращает ее индекс или

integer;

-1, если такой строки в наборе нет

procedure Insert(Index: integer;

Вставляет строку в набор и присваива-

const S: strings;

ет ей индекс Index

procedure LoadFromFile (const Fi-

Загружает набор из файла

leName: string;

 

 

 

procedure LoadFromStream (Stream:

Загружает набор из потока

TStream) ;

 

 

 

procedure Move(Curindex, Newindex:

Перемещает строку из положения

integer;

Curindex в положение Newindex

procedure SaveToFile(const

Сохраняет набор в файле

FileName: string;

 

 

 

procedure SaveToStream (Stream:

Сохраняет набор в потоке

TStream);

 

function Find(const S: string; var

Поиск в отсортированном наборе строк

Index: integer):Boolean;

строки S. Если такая строка имеется, то

 

ее индекс содержится в параметре

 

Index. Если набор строк неотсортиро-

 

ван, то необходимо использовать

 

функцию IndexOf

Sort;

Сортирует строки списка, свойство

 

Sorted которого установлено в false, в

 

возрастающей алфавитной последова-

 

тельности. Если Sorted = true, то список

 

сортируется автоматически.

 

 

564

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

____________________________________________________________________

Как видите, свойства и методы класса TStringList практически совпа-

дают (кроме некоторых) с TMemo. Только строки в TStringList содержатся в свойстве Strings, а в TMemo в свойстве Lines.

Задавать значения строкам с помощью оператора присваивания можно только после того, как строка создана, например методами Add или

AddStrings.

Довольно часто TMemo заполняют содержимым какого-нибудь текстового файла или набор строк TStringList формируется из записей текстового файла. Для этого существует метод

LoadFromFile(const FileName: string);

где FileName имя файла, включая путь к нему. Если файл расположен в од-

ной папке с программой, путь указывать не обязательно.

Точно так же, набор строк можно сохранить в виде текстового файла мето-

дом

SaveToFile(const FileName: string);

При работе с текстовыми файлами следует иметь в виду, что при выводе в

TMemo файла с русским текстом, в Windows буквы будут отображаться некор-

ректно. Это вызвано тем, что текстовые файлы в Windows имеют кодировку

CP-1251. Необходимо сначала преобразовать содержимое файла в кодировку

UTF-8. Это можно сделать следующим образом:

procedure Ansi_UTF8; var

tfile: TStringList; str: string;

begin

565

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

____________________________________________________________________

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;

Функция SysToUTF8() преобразует строку из системной кодировки (в

данном случае СР1251) в кодировку UTF-8.

Наборы строк TStringList "невидимы" для пользователя, в отличие от набора строк TMemo. Обычно с помощью TStringList производят различ-

ные операции с набором строк, а в TMemo выводят уже окончательно сформи-

рованные (например, отсортированные) строки. Некоторые операции с набором строк можно производить и непосредственно в TMemo, но, обычно, так не де-

лают. Так как, если вы будете делать какие-то операции со строками в TMemo, а

количество строк достаточно велико, то во время выполнения вашего приложе-

ния в его окне будет что-то быстро "мелькать". Разумеется, это нехорошо. Так что, операции со строками в TMemo "на виду" у пользователя является призна-

ком дурного тона!

Здесь мы создаем список строк типа TStringList, методом

LoadFromFile загружаем файл. Для этого создайте текстовый файл с именем

'File in Russian' с русским текстом в той же папке, что и ваш проект. В

примерах, содержащихся на приложенном к книге диске, такой файл имеется.

Используя свойство Text, копируем содержимое списка в одну строку. Затем,

если приложение выполняется в Windows, используя функцию SysToUTF8(),

преобразуем полученную строку в UTF-8. И только после этого добавляем в

566

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

____________________________________________________________________

Memo1. Если вы используете Linux, то применять функцию SysToUTF8() не надо, так как строка уже в UTF-8. В принципе ничего страшного не произой-

дет, если вы примените функцию SysToUTF8() к строке, которая уже в ко-

дировке UTF-8. Функция просто вернет исходную строку, не преобразовывая ее. Если хотите, вы можете убрать директивы компилятора

{$IFDEF WINDOWS}

{$ENDIF}

Обратите внимание, что после завершения работы с TStringList мето-

дом Free память, выделенная набору строк, освобождается.

Точно так же, при сохранении списка строк TMemo в файл необходимо обратное преобразование, например, вот таким образом:

procedure UTF8_Ansi; var

tfile: TStringList; str: string;

begin

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

{$IFDEF WINDOWS}

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

{$ENDIF} tfile.Add(str);

tfile.SaveToFile('File in Russian.txt'); tfile.Free;

end;

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

567

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

____________________________________________________________________

'File in Russian.txt' находящийся в той же папке, что и сама про-

грамма. Сохранение производится в файл с тем же именем.

Естественно, можно предоставить возможность пользователю самому вы-

бирать файл для открытия и задавать имя файла при сохранении. Для этого ис-

пользуется компоненты TOpenDialog и TSaveDialog из вкладки Dialogs.

Рассмотрим некоторые свойства этих компонентов:

DefaultExt - указывает значение расширения файла по умолчанию. В

нашем случае укажите DefaultExt= .txt

Filter – задает шаблоны фильтра при выборе файлов. Если в окне этого свойства нажать на кнопку с троеточием, появится окно редактора фильтров,

рис. 6.46.

Рис. 6.46. Редактор фильтров

Задайте фильтр как показано на рисунке. Тогда значение свойства будет равно Filter= 'Текстовый файл (*.txt)|*.txt', т.е. имя фильтра и сам фильтр разделены вертикальной линией. Если вы зададите еще один фильтр, то они бу-

дут разделены точкой с запятой. Таким образом, значение свойства Filter

можно задавать программно.

Filterlndex – определяет номер фильтра, который будет по умолчанию

568

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

____________________________________________________________________

показан пользователю в момент открытия диалога.

InitialDir – определяет начальный каталог, который будет открыт в момент начала работы пользователя с диалогом. Если значение этого свойства не задано, то открывается текущий каталог или тот, который был открыт при последнем обращении пользователя к соответствующему диалогу в процессе выполнения данного приложения.

Title – задает заголовок диалогового окна.

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

procedure TForm1.Button1Click(Sender: TObject);

var

fname, str: string;

tfile: TStringList;

begin

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

if OpenDialogl.Execute

then fname:= OpenDialogl.FileName;

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

{$IFDEF WINDOWS}

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

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

end;

После запуска приложения и нажатии кнопки Button1 будет открыт диа-

569

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

____________________________________________________________________

лог открытия файла, рис. 6.47, 6.48.

Рис. 6.47. Стандартный диалог открытия файла в Windows.

Рис. 6.48. Стандартный диалог открытия файла в Linux.

После

выбора

пользователем

файла,

в

свойстве

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

570