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

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

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

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

____________________________________________________________________

Для остальных клавиш удобнее использовать функцию ord, которая воз-

вращает код символа.

Параметр Shift это множество элементов, отражающих нажатые в это время служебные клавиши. Элементы этого множества ssShift – нажата кла-

виша Shift, ssAlt – нажата клавиша Alt и ssCtrl – нажата клавиша

Ctrl. Поскольку Shift является множеством, проверять наличие в нем тех или иных элементов надо операцией in. Таким образом, для определения на-

жатия клавиш Ctrl+F можно написать следующий код:

if((Key = ord('F')) and (ssCtrl in Shift)) then...;

При нажатии Ctrl+F будем открывать окно диалога поиска. Окно будем открывать как модальное методом ShowModal. Модальным окном называется такое окно, в котором пользователь не может переключаться на другие окна,

пока не закроет текущее окно. Код программы поиска в TMemo будет состоять из двух модулей.

Модуль Unit1:

unit Unit1;

{$mode objfpc}{$H+} interface

uses

Classes, SysUtils, FileUtil, LResources, Forms,

Controls, Graphics, Dialogs, StdCtrls, LconvEncoding,

LCLProc;

type

{ TForm1 }

591

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

____________________________________________________________________

TForm1 = class(TForm)

Memo1: TMemo;

procedure FormCreate(Sender: TObject); procedure Memo1KeyDown(Sender: TObject;

var Key: Word; Shift: TShiftState);

procedure CyrillicSearch;

private

{private declarations } public

{public declarations } end;

var

Form1: TForm1; implementation uses Unit2;

{ TForm1 }

procedure TForm1.CyrillicSearch; var

k: integer; text_Area: string;

begin

text_Area:= UTF8Copy(UTF8Decode(Memo1.Text), Memo1.SelStart + 1 + Memo1.SelLength, UTF8Length(UTF8Decode(Memo1.Text)) - Memo1.SelStart - Memo1.SelLength);

k:= UTF8Pos(str_Search, text_Area);

592

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

____________________________________________________________________

if k > 0 then begin

Memo1.SetFocus;

Memo1.SelStart:= Memo1.SelStart +

Memo1.SelLength + k - 1;

Memo1.SelLength:= UTF8Length(str_Search); end

else begin

ShowMessage('Строка не найдена');

Memo1.SelStart:= 0;

Memo1.SelLength:= 0;

end;

end;

procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

begin

if((Key = ord('F')) and (ssCtrl in Shift)) then begin

Memo1.SelStart:= 0;

Memo1.SelLength:= 0; Form2.ShowModal; end

else

if Key = 114 then // десятичный код клавиши F3

CyrillicSearch;

end;

procedure TForm1.FormCreate(Sender: TObject);

593

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

____________________________________________________________________

var

tfile: TStringList; str: string;

begin

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

{$I unit1.lrs} end.

Модуль Unit2:

unit Unit2;

{$mode objfpc}{$H+} interface

uses

Classes, SysUtils, FileUtil, LResources, Forms,

Controls, Graphics, Dialogs, StdCtrls;

type

{ TForm2 }

594

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

____________________________________________________________________

TForm2 = class(TForm)

Button1: TButton;

Edit1: TEdit;

Label1: TLabel;

procedure Button1Click(Sender: TObject); procedure Edit1KeyPress(Sender: TObject; var Key: char);

procedure GetSearchString; private

{private declarations } public

{public declarations } end;

var

Form2: TForm2; str_Search: string;

implementation uses Unit1;

{ TForm2 }

procedure TForm2.GetSearchString; begin

if Edit1.Text='' then begin

ShowMessage('Введите строку для поиска');

exit;

end;

Edit1.AutoSelect:= true;

if str_Search <> UTF8Decode(Edit1.Text) then

595

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

____________________________________________________________________

begin

str_Search:= UTF8Decode(Edit1.Text); end;

Form2.Close; // закрытие формы

Form1.CyrillicSearch;

end;

procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: char);

begin

if Key = #13 then begin

Key:= #0;

GetSearchString;

end;

end;

procedure TForm2.Button1Click(Sender: TObject); begin

GetSearchString;

end; initialization

{$I unit2.lrs} end.

В нашем приложении предполагается, что пользователь обязательно вос-

пользуется функцией поиска. Но ведь это происходит не всегда! Вспомните,

часто ли вы пользуетесь поиском? А по умолчанию все формы создаются в мо-

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

ком, форма Form2 будет создана "зря"! Она будет занимать лишнюю память. В

596

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

____________________________________________________________________

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

ходимо. Для этого в свойствах проекта (меню Проект-> Параметры проекта->

Формы) уберите Form2 из списка автосоздаваемых форм в список доступных,

рис. 6.56.

Рис. 6.56. Окно списка автосоздаваемых форм

Будем создавать Form2 только тогда, когда пользователь нажмет комби-

нацию клавиш Ctrl+F. В обработчике события Memo1KeyDown перед опера-

тором

Form2.ShowModal;

запишите оператор

Application.CreateForm(TForm2, Form2);

597

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

____________________________________________________________________

После того, как нам форма уже не нужна, мы ее закрываем оператором

Form2.Close;

Но закрытие формы еще не означает, что она удалена из памяти. Она еще

"жива зараза" и мы можем в любой момент ее снова показать методом

ShowModal, на случай, если пользователь повторно запустит функцию поиска.

Форма будет "окончательно" уничтожена после закрытия главного окна приложения. Следовательно, перед созданием формы мы должны проверить,

может быть, она уже была создана. Теперь уже перед оператором

Application.CreateForm(TForm2, Form2);

вставьте оператор

if not Assigned(Form2) then

Приведу окончательную редакцию обработчика Memo1KeyDown:

procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

begin

if((Key = ord('F')) and (ssCtrl in Shift)) then begin

Memo1.SelStart:= 0;

Memo1.SelLength:= 0;

if not Assigned(Form2) then Application.CreateForm(TForm2, Form2);

598

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

____________________________________________________________________

Form2.ShowModal;

end

else

if Key = 114 then // десятичный код клавиши F3

CyrillicSearch;

end;

В заключение, напишем программу решения системы линейных алгебраи-

ческих уравнений методом Гаусса с использованием TMemo. Консольный ва-

риант программы мы рассматривали в 1.3.4. и 3.4.2.

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

шить эту программу. Форма программы имеет вид, рис. 6.57.

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

Код программы следующий:

unit Unit1;

{$mode objfpc}{$H+} interface

599

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

____________________________________________________________________

uses

Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, Buttons;

type

{ TForm1 }

TForm1 = class(TForm) BitBtn1: TBitBtn; Button1: TButton; Button2: TButton; Edit1: TEdit; Edit2: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Memo1: TMemo;

procedure BitBtn1Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Edit1Change(Sender: TObject); procedure Edit1KeyPress(Sender: TObject;

var Key: char); procedure Edit2Change(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Calculate;

private

{private declarations } public

A, b, x: TStrings; v, v2: integer;

{public declarations } end;

var

Form1: TForm1;

implementation

{ TForm1 }

procedure Tform1.Calculate; var i,j,n,k,p,h,r:integer;

t,m,s:extended;

600