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

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 (Печать списка сначала), которая была приведена ранее.

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