Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
osnovy_programmirovanija_v_srede_lazarus.pdf
Скачиваний:
241
Добавлен:
18.03.2015
Размер:
6.53 Mб
Скачать

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

____________________________________________________________________

str: string; begin

tfile:= TStringList.Create; tfile.LoadFromFile('List.txt'); str:= tfile.Text;

{$IFDEF WINDOWS}

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

{$ENDIF}

with ListBox1 do begin

Items.Text:= str; end;

tfile.Free; ListBox1.MultiSelect:= true; ListBox2.Sorted:= true;

end; initialization

{$I unit1.lrs} end.

В компоненте можно отображать не только строки, но и изображения, на-

пример пиктограммы. Однако мы в этой книге эти вопросы рассматривать не будем.

Компонент TComboBox

Этот компонент расположен на странице Standard. Внешний вид компо-

нента показан на рис. 6.62.

626

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

____________________________________________________________________

Рис. 6.62. Компонент TComboBox

При нажатии на кнопку с треугольником появится раскрывающийся (гово-

рят еще выпадающий) список. Методы работы с таким списком практически не отличаются от TListBox. По сравнению с TListBox у него есть преимуще-

ство, заключающееся в том, что можно редактировать элементы списка, а также добавлять в список новые элементы. Кроме того, компонент позволяет сэконо-

мить пространство, когда на форме расположены много компонентов. Собст-

венно для этих целей он и используется. К недостаткам можно отнести то, что в нем нельзя выбрать одновременно несколько элементов. Основные свойства компонента:

Items – содержит элементы списка. Доступ к отдельным элементам воз-

можен по индексу, например Items[k] содержит элемент с номером (индек-

сом) k (нумерация начинается с нуля).

Style – стиль отображения данных в компоненте, имеет следующие значе-

ния:

1. csDropDown – раскрывающийся список с окном редактирования, позво-

ляющим пользователю редактировать или добавлять новые строки в список; 2. csDropDownList – раскрывающийся список. В этом режиме разрешено выбирать только существующие элементы списка. Редактировать или до-

бавлять строки в этом режиме нельзя;

3. csSimple – список всегда раскрыт, по существу совпадает с ListBox,

но имеется возможность редактирования и добавления новых строк;

4. csOwnerDrawFixed – раскрывающийся список со строками одинако-

вой высоты, в которых могут отображаться изображения и текст;

5. csOwnerDrawVariable – раскрывающийся список со строками разной

627

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

____________________________________________________________________

высоты, в которых могут отображаться изображения и текст.

Text – содержит выбранный элемент списка или вновь введенную строку;

ItemIndex – содержит индекс выбранного элемента. По умолчанию в мо-

мент проектирования ItemIndex = -1. Если вы запустите приложение с та-

ким значением ItemIndex, то в окне ComboBox ничего не будет отображено.

Особенно если вы используете свойство Style = csSimple, да к тому же,

забудете увеличить высоту Height компонента. В этом случае пользователю будет выведено маленькое пустое окошко без кнопки раскрытия! Поэтому же-

лательно либо во время проектирования, либо программно, например, при соз-

дании формы (OnCreate) устанавливать значение ItemIndex. Чаще всего устанавливают ItemIndex = 0, в этом случае в окно ComboBox будет выве-

ден первый элемент списка. Но можно присвоить ItemIndex и другое значе-

ние (естественно внутри допустимого диапазона индексов элементов списка).

Например, того элемента, который должен быть выбран по умолчанию.

Во время выполнения приложения значение ItemIndex может принимать значение -1. Это происходит в том случае, если в окне компонента производи-

лось редактирование текущего элемента, т.е. по значению ItemIndex = -1

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

щие действия, см. пример ниже;

DropDownCount – задаѐт количество элементов списка, выводимых без

полосы прокрутки.

DroppedDown – указывает состояние компонента.

При DroppedDown= true, список раскрыт.

Рассмотрим несколько примеров.

Создайте новый проект, поместите на форму компоненты TComboBox,

TLabel и TButton, как показано на рис. 6.63.

628

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

____________________________________________________________________

Рис. 6.63. Форма программы

Установите свойство Style компонента ComboBox1 равным csDropDownList. В свойстве Items введите любые три фамилии, напри-

мер, как на рисунке 6.64. Пусть это будут фамилии некоторых студентов.

Рис. 6.64. Диалог ввода строк в компонент

В обработчик события OnClick введите следующий код:

procedure TForm1.Button1Click(Sender: TObject); begin

with ComboBox1 do case ItemIndex of

0:ShowMessage('Это отличник');

1:ShowMessage('Это двоечник');

2:ShowMessage('А этот середняк'); else

629

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

____________________________________________________________________

ShowMessage('Никто не выбран');

end;

end;

При запуске программы в окне ComboBox1 не будет отображена фамилия студента. Пользователь должен раскрыть список. Как мы уже говорили, это не совсем удобно. Сделаем так, чтобы при запуске программы отображалась пер-

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

И еще, во многих случаях в окно ComboBox1 выводится значение, кото-

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

Enter. Реализуем такую функциональность нашего приложения. Итак, код программы (не забудьте удалить из формы кнопку):

unit Unit1;

{$mode objfpc}{$H+} interface

uses

Classes, SysUtils, FileUtil, LResources, Forms,

Controls, Graphics, Dialogs, StdCtrls, LCLType;

type

{ TForm1 }

TForm1 = class(TForm)

ComboBox1: TComboBox;

Label1: TLabel;

procedure ComboBox1KeyPress(Sender: TObject; var Key: char); procedure ComboBox1Select(Sender: TObject);

630

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

____________________________________________________________________

procedure FormCreate(Sender: TObject); private

{private declarations } public

{public declarations } end;

var

Form1: TForm1; implementation { TForm1 }

procedure TForm1.ComboBox1Select(Sender: TObject); begin

with ComboBox1 do case ItemIndex of

0:ShowMessage('Это отличник');

1:ShowMessage('Это двоечник');

2:ShowMessage('А этот середняк');

else

ShowMessage('Никто не выбран'); end;

end;

procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: char);

begin

if Key = #13 then ComboBox1Select(Sender); end;

procedure TForm1.FormCreate(Sender: TObject); begin

ComboBox1.ItemIndex:= 0;

631

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

____________________________________________________________________

end;

initialization

{$I unit1.lrs}

end.

Сделаем более полезную программу. Предположим, в некоторых тексто-

вых файлах содержатся списки нескольких групп студентов. Пусть для опреде-

ленности групп будет три. Необходимо, в зависимости от выбора пользователя,

выводить список студентов выбранной группы. Список группы будем выводить в TListBox. В новом проекте сформируйте вид окна вашего приложения, рис.

6.65.

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

В свойстве Items введите любые три названия групп, например, как на рисунке 6.66.

Рис. 6.66. Диалог ввода строк в компонент

632

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

____________________________________________________________________

Создайте три текстовых файла с именами List1.txt, List2.txt и List3.txt с фамилиями студентов. Заполнять TListBox содержимым файла мы уже умеем, для простоты предположим, что файлы находятся в той же пап-

ке, что и наше приложение. Код программы:

unit Unit1;

{$mode objfpc}{$H+} interface

uses

Classes, SysUtils, FileUtil, LResources, Forms,

Controls, Graphics, Dialogs, StdCtrls, LCLType;

type

{ TForm1 }

TForm1 = class(TForm)

ComboBox1: TComboBox;

Label1: TLabel;

Label2: TLabel;

ListBox1: TListBox;

procedure ComboBox1KeyPress(Sender: TObject; var Key: char);

procedure ComboBox1Select(Sender: TObject); procedure FormCreate(Sender: TObject); procedure LoadListGroup(namefile: string);

private

{private declarations } public

{public declarations } end;

var

633

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

____________________________________________________________________

Form1: TForm1; implementation { TForm1 }

procedure TForm1.LoadListGroup(namefile: string); var

tfile: TStringList; str: string;

begin

tfile:= TStringList.Create; tfile.LoadFromFile(namefile); str:= tfile.Text;

{$IFDEF WINDOWS}

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

{$ENDIF}

with ListBox1 do begin

Items.Text:= str; end;

tfile.Free; ListBox1.Sorted:= true;

end;

procedure TForm1.ComboBox1Select(Sender: TObject); begin

with ComboBox1 do begin

Label2.Caption:='Список группы ' + Text; case ItemIndex of

0: LoadListGroup('List1.txt');

634

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

____________________________________________________________________

1:LoadListGroup('List2.txt');

2:LoadListGroup('List3.txt'); else

ShowMessage('Группа не выбрана'); end;

end;

end;

procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: char);

begin

if Key = #13 then begin

ComboBox1Select(Sender);

Key:=#0;

end;

end;

procedure TForm1.FormCreate(Sender: TObject); begin

ComboBox1.ItemIndex:= 0;

ComboBox1.Style:= csDropDownList;

end; initialization

{$I unit1.lrs} end.

Загрузку в TListBox содержимого текстового файла мы оформили в виде процедуры, в которую в качестве параметра передается имя файла, соответст-

вующее выбранной группе.

В заключение рассмотрим пример, как в TComboBox реализуются коррек-

635

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

____________________________________________________________________

тировка и добавление элементов в список. Создайте форму, рис. 6.67.

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

Теперь уже установите свойство Style компонента ComboBox1 рав-

ным csDropDown. В свойстве Items введите любые данные. В обработчи-

ке OnSelect в переменной oldItemIndex мы запоминаем индекс выбран-

ного элемента. Если нажата кнопка "Изменить", то оператор

ComboBox1.Items[oldItemIndex]:= ComboBox1.Text;

изменит выбранный элемент новым содержимым. Если пользователь нажмет

кнопку "Добавить", то оператор

ComboBox1.Items.Add(ComboBox1.Text);

добавит новую запись в список.

unit Unit1;

{$mode objfpc}{$H+} interface

uses

Classes, SysUtils, FileUtil, LResources, Forms,

Controls, Graphics, Dialogs, StdCtrls;

636

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

____________________________________________________________________

type

{ TForm1 }

TForm1 = class(TForm)

Button1: TButton;

Button2: TButton;

ComboBox1: TComboBox;

procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure ComboBox1Select(Sender: TObject); procedure FormCreate(Sender: TObject);

private

{private declarations } public

{public declarations } end;

var

Form1: TForm1; oldItemIndex: integer;

implementation { TForm1 }

procedure TForm1.ComboBox1Select(Sender: TObject); begin

oldItemIndex:= ComboBox1.ItemIndex; end;

procedure TForm1.FormCreate(Sender: TObject); begin

ComboBox1.ItemIndex:= 0;

ComboBox1.Style:= csDropDown;

end;

637

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]