Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Delphi_списки2_методика.DOC
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
292.86 Кб
Скачать

Var a:array[1..10] of ta;

Массив «a» выполняет роль информационного буфера из которого будет выбираться информация при построении нового списка или при добавлении узла в существующий список.

Информация заносится в разделе ввода данных через окна компонент Edit1, Edit2, и Edit3 по нажатию клавиши «Enter» по завершению ввода в каждом окне. После ввода имени владельца в первом окне и нажатия клавиши «Enter» будет вызвана процедура-обработчик события нажатия клавиши edtNameKeyPress. С ее помощью будет заполнено поле «М» текущего элемента массива «а»:

procedure TForm1.edtNameKeyPress(Sender: TObject;

Var Key: Char);

begin

if key=#13 then

begin

if key1=0 then

lblInformation.Caption:='Число узлов в списке=0';

ind:=ind+1;

memListResult.Lines.Clear;

a[ind].M:=edtName.Text;

memListResult.Lines.Add(IntToStr(ind));

edtMarka.SetFocus;

end;

end;

Через свойство компонента-метки lblInformation.Caption на панель диалогового окна будет выдано сообщение о том, что число узлов в списке равно «0», а курсор будет позиционирован в поле (окно) компонента Edit2. После ввода марки автомобиля и нажатия клавиши «Enter» будет вызвана процедура-обработчик нажатия клавиши edtMarkaKeyPress, которая заполнит поле «N» текущего элемента массива «а» и позиционирует курсор в поле (окно) компонента Edit3:

procedure TForm1.edtMarkaKeyPress(Sender: TObject;

Var Key: Char);

begin

if key=#13 then

begin

a[ind].N:=edtMarka.Text;

edtNumber.SetFocus;

end;

end;

После ввода номера автомобиля и нажатия клавиши «Enter» будет вызвана процедура-обработчик нажатия клавиши edtNumberKeyPress, которая заполнит поле «W» текущего элемента массива «а» и позиционирует курсор в поле (окно) компонента Edit1:

procedure TForm1.edtNumberKeyPress(Sender: TObject;

Var Key: Char);

begin

if key=#13 then

begin

a[ind].W:=edtNumber.Text;

edtName.SetFocus;

if (t>0) and (t<L.Count) and (key1=2) then

begin

AddAfterNode;

lblInformation.Caption:='Число узлов в списке='

+IntToStr(L.Count);

memListResult.Lines.Add('...УЗЕЛ ДОБАВЛЕН...');

memListResult.Lines.Add('');

end;

end;

end;

Вернемся к обзору функциональных кнопок на нашей экранной форме (Form1). Так при нажатии кнопки «Печать списка сначала», как показано ниже, процедура btnPrintFirstClick, выдаст сообщение в виде заголовка в окно компоненты Memo1, эта же процедура обеспечит вызов процедуры PrintFirst из модуля Unit2.

procedure TForm1.btnPrintFirstClick(Sender: TObject);

begin

memListResult.Lines.Add('');

memListResult.Lines.Add('*** ПЕЧАТЬ СПИСКА

ПРЯМАЯ***');

PrintFirst(memListResult.lines);

if L.Count=0 then

memListResult.Lines.Add('...СПИСОК ПУСТ...');

memListResult.Lines.Add('');

lblInformation.Caption:='Число узлов в списке='

+IntToStr(L.Count);

end;

Однако, печать сработает только в том случае, если список не пуст. В процедуре присутствует параметр-счетчик узлов L.Count при нулевом значении которого, будет выдано сообщение о том, что список пуст. Значение параметра определяется в модуле Unit2. В любом случае будет обновлено сообщение о количестве узлов списка через свойство компонента-метки lblInformation.Caption , как это и делалось ранее.

При нажатии кнопки «Найти узел по номеру», как приведено ниже, процедура btnSearchNodeClick с помощью метода SetFocus позиционирует курсор в поле (окно) компонента Edit4. Одновременно с этим в окно компонента Memo1 будет выдан запрос: 'ЗАДАЙТЕ НОМЕР УЗЛА, КОТОРЫЙ СЛЕДУЕТ ОПРЕДЕЛИТЬ', исходя из этого в поле (окно) компонента Edit4 следует ввести номер узла содержание информационных полей которого мы хотели бы просмотреть.

procedure TForm1.btnSearchNodeClick(Sender: TObject);

begin

edtNodeNumber.SetFocus;

key1:=1;

memListResult.Lines.Clear;

memListResult.Lines.Add('ЗАДАЙТЕ НОМЕР УЗЛА

КОТОРЫЙ');

memListResult.Lines.Add('СЛЕДУЕТ ОПРЕДЕЛИТЬ');

memListResult.Lines.Add('');

end;

После чего следует нажать клавишу «Enter», что приведет к вызову процедуры обработчика этого события edtNodeNumberKeyPress. Если номер узла определен в пределах нумерации списка и ключ-параметр key1 равен 1, а это значение было назначено в процедуре btnSearchNodeClick, то произойдет вызов процедуры поиска узла по номеру с именем SearchNode из модуля Unit2. Текст процедуры edtNodeNumberKeyPress приведен ниже.

procedure TForm1.edtNodeNumberKeyPress

(Sender: TObject; var Key: Char);

begin

if key=#13 then

begin

t:=StrToInt(edtNodeNumber.Text);

memListResult.Lines.Add(IntToStr(t));

if (t>0) and (t<=L.Count) and (key1=1) then

SearchNode(memListResult.lines);

if (t>1) and (t<L.Count) and (key1=3) then

begin

DeleteNode;

lblInformation.Caption:='Число узлов в списке='

+IntToStr(L.Count);

memListResult.Lines.Add('...УЗЕЛ УДАЛЕН...');

memListResult.Lines.Add('');

end;

if (t>0) and (t<L.Count) and (key1=2) then

begin

memListResult.Lines.Clear;

memListResult.Lines.Add('ВЫПОЛНИТЕ ВВОД

ДАННЫХ');

memListResult.Lines.Add('ПО НОВОМУ

ВЛАДЕЛЬЦУ');

edtName.SetFocus;

end;

end;

end;

Следует отметить, что вызовы трех процедур из модуля Unit2:

- PrintFirst(memListResult.lines);

- PrintLast(memListResult.lines);

- SearchNode(memListResult.lines);

содержат фактический параметрmemListResult.lines и формальный mem:TStrings при их описании в модуле Unit2. TStrings – это класс библиотеки визуальных компонентов VCL. Некоторые компоненты VCL используют экземпляры класса TStrings для работы со своими данными, обычно текстовыми. Компонент Memo инкапсулирует многострочный элемент редактирования. Свойство linesсамое важное из свойств этого компонента. Свойство lines компонента Memo является экземпляром класса TStrings. Свойство lines позволяет например сохранять содержимое компонента Memo на диске или загружать в этот компонент текст из файла. Говоря условно, используя такой параметр, можно передавать из процедуры другого модуля информацию в окно редактирования Memo. Главное не забыть при этом в предложении использования модуля Unit2 написать:

uses Classes; .

При нажатии кнопки «Удалить узел из середины», как приведено ниже, процедура btnDeleteNodeClick с помощью метода SetFocus позиционирует курсор в поле (окно) компонента Edit4. Одновременно с этим в окно компонента Memo1 будет выдан запрос:'ЗАДАЙТЕ НОМЕР УЗЛА, КОТОРЫЙ СЛЕДУЕТ УДАЛИТЬ ‘, исходя из этого в поле (окно) компонента Edit4 следует ввести номер узла, который мы хотим удалить из списка. В этой же процедуре будет определено значение служебного ключа key1.

procedure TForm1.btnDeleteNodeClick(Sender:

TObject);

begin

key1:=3;

memListResult.Lines.Clear;

memListResult.Lines.Add('ЗАДАЙТЕ НОМЕР

УЗЛА КОТОРЫЙ');

memListResult.Lines.Add('СЛЕДУЕТ УДАЛИТЬ');

edtNodeNumber.SetFocus;

end;

После чего следует нажать клавишу «Enter», что приведет к вызову процедуры обработчика этого события edtNodeNumberKeyPress, содержание которой было приведено выше. Если номер узла определен в пределах нумерации списка и ключ-параметр key1 равен 3, то произойдет вызов из модуля Unit2 процедуры удаления узла из списка с именем DeleteNode.

При нажатии кнопки « Добавить узел в середину», как приведено ниже, процедура btnAddAfterNodeClick с помощью метода SetFocus позиционирует курсор в поле (окно) компонента Edit4. Одновременно с этим в окно компонента Memo1 будет выдан запрос: 'ЗАДАЙТЕ НОМЕР УЗЛА, ПОСЛЕ КОТОРОГО СЛЕДУЕТ ДОБАВИТЬ НОВЫЙ ', исходя из этого в поле (окно) компонента Edit4 следует ввести номер узла после которого мы хотим добавить новый. В этой же процедуре будет определено значение служебного ключа key1 :

procedure TForm1.btnAddAfterNodeClick(Sender:

TObject);

begin

key1:=2;

memListResult.Lines.Clear;

memListResult.Lines.Add('ЗАДАЙТЕ НОМЕР

УЗЛА ПОСЛЕ КОТОРОГО');

memListResult.Lines.Add('СЛЕДУЕТ

ДОБАВИТЬ НОВЫЙ');

edtNodeNumber.SetFocus;

end;

После чего следует нажать клавишу «Enter», что приведет к вызову процедуры обработчика этого события edtNodeNumberKeyPress, содержание которой было приведено выше. Если номер узла определен в пределах нумерации списка и ключ-параметр key1 равен 2, то с помощью метода SetFocus курсор будет позиционирован в поле (окно) компонента Edit1. Следует отметить, что номер задаваемого узла не может быть равен номеру последнего узла списка.

Автоматический перевод курсора в раздел ввода данных в окно имени владельца означает, что надо выполнить ввод данных по новому владельцу, как это делалось ранее при построении списка на начальном этапе. Именно поэтому в окно компоненты Memo1 будет выдано сообщение о необходимости ввода данных по новому владельцу. После того как будет введен номер автомобиля нового владельца и нажата клавиша «Enter» проце-дура-обработчик этого события edtNumberKeyPress обеспечит вызов процедуры добавления узла в список с именем AddAfterNode из модуля Unit2, а также через свойство компонента-метки lblInformation.Caption, выдаст сообщение о количестве узлов в расширенном списке.

При нажатии кнопки «Печать списка с конца», как показано ниже, процедура btnPrintLastClick , выдаст сообщение в виде заголовка в окно компоненты Memo1, эта же процедура обеспечит вызов процедуры PrintLast из модуля Unit2.

procedure TForm1.btnPrintLastClick(Sender: TObject);

begin

memListResult.Lines.Add('');

memListResult.Lines.Add('* ПЕЧАТЬ СПИСКА ОБРАТНАЯ*');

PrintLast(memListResult.lines);

if L.Count=0 then

memListResult.Lines.Add('...СПИСОК ПУСТ...');

lblInformation.Caption:='Число узлов в списке='

+IntToStr(L.Count);

end;

Содержание процедуры btnPrintLastClick и назначение ее операторов, такое же, как и в процедуре btnPrintFirstClick (Печать списка сначала), которая была приведена ранее.

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