Применение средств графического отображения для проведения соединений стрелками букв в алфавитном порядке

Страницы работы

Содержание работы

Задание:

Дана квадратная область, имеющая значения координат 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;

Похожие материалы

Информация о работе