![](/user_photo/_userpic.png)
Мансуров. Основы программирования в среде Lazarus. 2010
.pdf![](/html/66936/286/html_e6jHPkGZZp.5LuV/htmlconvd-udfP_F561x1.jpg)
Глава 6 Программирование приложений с графическим интерфейсом
____________________________________________________________________
Рис. 6.41. Стандартный диалог выбора шрифта в Windows.
Рис. 6.42. Стандартный диалог выбора шрифта в Linux.
Точно так же пользователь может устанавливать цвет фона окна TMemo.
561
![](/html/66936/286/html_e6jHPkGZZp.5LuV/htmlconvd-udfP_F562x1.jpg)
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
![](/html/66936/286/html_e6jHPkGZZp.5LuV/htmlconvd-udfP_F563x1.jpg)
Глава 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
![](/html/66936/286/html_e6jHPkGZZp.5LuV/htmlconvd-udfP_F568x1.jpg)
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
![](/html/66936/286/html_e6jHPkGZZp.5LuV/htmlconvd-udfP_F570x1.jpg)
6.3 Визуальное программирование в среде Lazarus
____________________________________________________________________
лог открытия файла, рис. 6.47, 6.48.
Рис. 6.47. Стандартный диалог открытия файла в Windows.
Рис. 6.48. Стандартный диалог открытия файла в Linux.
После |
выбора |
пользователем |
файла, |
в |
свойстве |
OpenDialog1.FileName будет находиться имя файла вместе с путем к не-
570