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

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

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

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

____________________________________________________________________

unit Unit1;

{$mode objfpc}{$H+} interface

uses

Classes, SysUtils, FileUtil, LResources, Forms,

Controls, Graphics, Dialogs, StdCtrls;

type

{ TForm1 }

TForm1 = class(TForm)

Button1: TButton;

Button2: TButton;

Button3: TButton;

ListBox1: TListBox;

ListBox2: TListBox;

procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure FormCreate(Sender: TObject); function Search(str: string): boolean;

private

{private declarations } public

{public declarations } end;

var

Form1: TForm1; implementation { TForm1 }

function TForm1.Search(str: string): boolean;

621

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

____________________________________________________________________

var

i: integer; begin

Result:= false;

for i:= 0 to ListBox2.Count - 1 do if ListBox2.Items[i] = str then begin

Result:= true; exit;

end

else Result:= false; end;

procedure TForm1.Button2Click(Sender: TObject); begin

with ListBox1 do begin

if (ItemIndex >= 0) and (not Search(GetSelectedText)) then ListBox2.Items.Add(Items[ItemIndex]);

end;

end;

procedure TForm1.Button1Click(Sender: TObject); begin

ListBox2.Clear;

end;

procedure TForm1.Button3Click(Sender: TObject); begin

Close;

end;

procedure TForm1.FormCreate(Sender: TObject);

622

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

____________________________________________________________________

var

tfile: TStringList; 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;

end; initialization

{$I unit1.lrs} end.

Реализуем теперь множественный выбор. Обработчик события

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

пользовать свойство Selected.

unit Unit1;

{$mode objfpc}{$H+}

interface

uses

623

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

____________________________________________________________________

Classes, SysUtils, FileUtil, LResources, Forms,

Controls, Graphics, Dialogs, StdCtrls;

type

{ TForm1 }

TForm1 = class(TForm)

Button1: TButton;

Button2: TButton;

Button3: TButton;

ListBox1: TListBox;

ListBox2: TListBox;

procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure FormCreate(Sender: TObject); function Search(str: string): boolean;

private

{private declarations } public

{public declarations } end;

var

Form1: TForm1; implementation { TForm1 }

function TForm1.Search(str: string): boolean; var

i: integer; begin

Result:= false;

624

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

____________________________________________________________________

for i:= 0 to ListBox2.Count - 1 do if ListBox2.Items[i] = str then begin

Result:= true; exit;

end

else Result:= false; end;

procedure TForm1.Button2Click(Sender: TObject); var

i: integer; begin

with ListBox1 do

for i:= 0 to Items.Count - 1 do begin

if (Selected[i]) and (not Search(Items[i])) then

ListBox2.Items.Add(Items[i]);

end;

end;

procedure TForm1.Button1Click(Sender: TObject); begin

ListBox2.Clear;

end;

procedure TForm1.Button3Click(Sender: TObject); begin

Close;

end;

procedure TForm1.FormCreate(Sender: TObject);

625

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

____________________________________________________________________

var

tfile: TStringList; 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. Внешний вид компо-

626

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

____________________________________________________________________

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

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

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

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

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

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

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

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

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

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

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

ния:

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

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

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

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

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

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

627

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

____________________________________________________________________

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

5. csOwnerDrawVariable – раскрывающийся список со строками разной высоты, в которых могут отображаться изображения и текст.

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);

630