
- •I: Byte; I: Byte;
- •Связанный список
- •Var Заголовок: Указатель_на_узел;
- •Interface
- •Var a:array[1..10] of ta;
- •Var Key: Char);
- •Var Key: Char);
- •Var Key: Char);
- •Структура модели списка. Модуль построения и редактирования списка
- •Interface
- •Implementation
- •Создание (построение) и опустошение списка
- •Var I:integer;
- •Var temp:pTelem;
- •Вывод содержимого информационных полей списка (прямая и обратная печать)
- •Включение и удаление узлов списка
- •Var I:integer; temp:ptElem;
- •Var I:integer;
- •Поиск узла по номеру
- •Var I:integer;
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 (Печать списка сначала), которая была приведена ранее.