Задание:
Дана квадратная область, имеющая значения координат 1-100 по каждой из осей. Внутри области размещаются буквы латинского алфавита от «a» до «z», каждая из которых имеет свои координаты. Провести соединение стрелками букв в алфавитном порядке, т.е. «a»->«b» и т.д. Предусмотреть возможность добавления и удаления букв, изменения их координат.
Постановка задачи:
В соответствии с условиями задачи требуется применить средства графического отображения. Для добавления и удаления букв, соответственно, а так же изменения их координат целесообразно применять диалоговые окна. Для управления всеми целесообразно применить список.
Выделение классов:
Класс буквы
Экземпляр данного класса (TWord) должен уметь вырисовывать и стирать себя в области отображения, отрисовывать стрелки, соединяющие буквы. Для этого он должен знать место своего расположения (в виде координат), иметь ссылку на область отображения. Область отображения (TTable) отрисовывается отдельно.
TWord=class
public
Koord:TPoint;
Table:TTable;
S:string;
constructor Create(WordTable:TTable;NewS:string;WordPoint:TPoint);
destructor Destroy;override;
procedure Show;
procedure Hide;
procedure Line;
end;
Где:
Koord – Координаты буквы.
Table – Ссылка на область отображения
S – Сама буква
Метод constructorCreate служит для создания новой буквы с заданием начальных значений полей класса и добавлением на область отображения.
constructor TWord.Create(WordTable: TTable;NewS:string;WordPoint:TPoint);
begin
inherited Create;
Table:=WordTable;
S:=NewS;
Koord.X:=WordPoint.X;
Koord.Y:=WordPoint.Y;
end;
Метод destructorDestroy позволяет разрушить букву при ее удалении.
destructor TWord.Destroy;
begin
Hide;
inherited Destroy;
end;
Метод procedureShow служит для отображения буквы
procedure TWord.Show;
var
d1,d2:integer;
begin
//Определение координат и отрисовка буквы
d1:=Table.Size*(Koord.X-1)+Table.Size div 2;
d2:=Table.Size*(Koord.Y-1)+Table.Size div 2;
Table.Canvas.Font.Color:=clBlack;
Table.Canvas.TextOut(d1-Table.Canvas.TextWidth(s) div 2,
d2-Table.Canvas.TextHeight(s) div 2,s);
Line;
end;
Метод procedureHide служит для стираия буквы с поверхности рисования
procedure TWord.Hide;
var
d1,d2:integer;
begin
//Определение координат и стирание буквы
d1:=Table.Size*(Koord.X-1)+Table.Size div 2;
d2:=Table.Size*(Koord.Y-1)+Table.Size div 2;
Table.Canvas.Font.Color:=clwhite;
Table.Canvas.TextOut(d1-Table.Canvas.TextWidth(s) div 2,
d2-Table.Canvas.TextHeight(s) div 2,s);
Line;
end;
Метод procedureLineслужит для стирания старых стрелок, соединяющих буквы, и отрисовки новых
procedure TWord.Line;
var
MasWord:array of TWord;
Temp:TWord;
i,j,n,d1,d2:integer;
S:string;
begin
//Стирание старых линий
///Заполнение массива элементами из списка
if Form1.ListBox1.Count>0 then
begin
///Стираие старых стрелок
Table.Canvas.Pen.Color:=clwhite;
Table.Canvas.Brush.Color:=clwhite;
Table.Canvas.Rectangle(0,0,table.Size*100,table.Size*100);
///Отрисовка Букв
for i:=0 to Form1.ListBox1.Count-1 do
begin
Temp:=Form1.ListBox1.Items.Objects[i] as TWord;
d1:=Table.Size*(Temp.Koord.X-1)+Table.Size div 2;
d2:=Table.Size*(Temp.Koord.Y-1)+Table.Size div 2;
Table.Canvas.Font.Color:=clBlack;
Table.Canvas.TextOut(d1-Table.Canvas.TextWidth(Temp.S) div 2,
d2-Table.Canvas.TextHeight(Temp.S) div 2,Temp.S);
end;
end;
//Сортировка по возрастанию
///Заполнение массива элементами из списка
SetLength(MasWord,Form1.ListBox1.Count);
for i:=0 to Form1.ListBox1.Count-1 do
MasWord[i]:=Form1.ListBox1.Items.Objects[i] as TWord;
///Цикл сортировки
j:=0;
while j<(Form1.ListBox1.Count-1) do
if MasWord[j+1].S<MasWord[j].S then
begin
Temp:=MasWord[j];
MasWord[j]:=MasWord[j+1];
MasWord[j+1]:=Temp;
if j>0 then Dec(j) else inc(j);
end
else inc(j);
//Вывод стрелок
if Form1.ListBox1.Count>0 then
begin
Table.Canvas.Pen.Color:=clblack;
for i:=0 to Form1.ListBox1.Count-2 do
for j:=0 to Form1.ListBox1.Count-1 do
for n:=1 to Form1.ListBox1.Count-1-i do
begin
if MasWord[i].S=MasWord[j].S then continue;
S:=chr((ord(MasWord[j].S[1]))-1);
if S=MasWord[i].S then
begin
Table.Canvas.MoveTo(Table.Size*(MasWord[i].Koord.X-1)+Table.Size div 2,
Table.Size*(MasWord[i].Koord.Y-1)+Table.Size div 2);
Table.Canvas.LineTo(Table.Size*(MasWord[j].Koord.X-1)+Table.Size div 2,
Table.Size*(MasWord[j].Koord.Y-1)+Table.Size div 2);
end;
end;
end;
SetLength(MasWord,0);
end;
Класс области отображения описывается следующим обращом:
TTable=class
public
Cells:array[1..100,1..100] of boolean;
Size:integer;
Canvas:TCanvas;
Color:TColor;
constructor Create(NewColor:TColor;NewCanvas:TCanvas;
NewSize:integer);
end;
Где:
Size – Размер клетки
Canvas – Ссылка на реальную поверхность рисования
Cells – Массив, описывающий текущее состояние клеток области отображения
Метод constructorCreate служит для создания области отображения. В ходе создания производится установка признака «свободна» для каждой клетки
constructor TTable.Create(NewColor: TColor; NewCanvas: TCanvas;
NewSize: integer);
var
i,j:integer;
begin
Color:=NewColor;
Size:=NewSize;
Canvas:=NewCanvas;
Canvas.Pen.Color:=clwhite;
Canvas.Brush.Color:=Color;
//Фактическая отрисовка поверхности рисования
Canvas.Rectangle(0,0,Size*100,Size*100);
//Присваивание «свободы» клеткам
for i:=1 to 100 do
for j:=1 to 100 do
Cells[i,j]:=true;
end;
Выделение перечня наиболее важных структур данных:
Наиболее важными являются экземпляры класса TWord, создающиеся после нажатия на кнопку добавления, а также экземпляр класса TTable, который создается в момент загрузки программы.
Построение алгоритма реализации:
При работе программы могут возникнуть 5 событий: редактирование, удаление, добавление, сохранение и загрузка.
Редактирование:
Позволяет с помощь диалогового окна отредактировать уже созданный экземпляр класса TWord с последиющей отрисовкой.
procedure TForm1.Change_BClick(Sender: TObject);
var
Word:TWord;
begin
with Change_F do
begin
//Вывод данных для последующих изменений
Form1.StatusBar1.Panels[3].Text:='Редактирование элемента..';
Word:=ListBox1.Items.Objects[ListBox1.ItemIndex] as TWord;
X_E.Text:=IntToStr(Word.Koord.X);
Y_E.Text:=IntToStr(Word.Koord.Y);
W_E.Text:=Word.S;
if ShowModal=mrOK then
begin
//Изменение данных
Word.S:=W_E.Text;
Word.Koord.X:=StrToInt(X_E.Text);
Word.Koord.Y:=StrToInt(Y_E.Text);
ListBox1.Items.Strings[ListBox1.ItemIndex]:=W_E.Text+','+
X_E.Text+','+Y_E.Text;
StatusBar1.Panels[0].Text:=Word.S;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.