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

          StatusBar1.Panels[1].Text:=IntToStr(Word.Koord.X);

          StatusBar1.Panels[2].Text:=IntToStr(Word.Koord.Y);

        end;

    end;

  //Прорисовка линий

   Word.Line;

   Form1.StatusBar1.Panels[3].Text:='';

end;

Удаление:

Позволяет удалять уже созданный элемент класса TWord, с последующей новой отрисовкой стрелок

procedure TForm1.Delete_BClick(Sender: TObject);

var

  Word:TWord;

Begin

//Разрушение выбранного элемента

  Word:=ListBox1.Items.Objects[ListBox1.ItemIndex] as TWord;

  Table.Cells[Word.Koord.X,Word.Koord.Y]:=true;

  Word.Destroy;

  ListBox1.Items.Delete(ListBox1.ItemIndex);

  Red_A.Enabled:=false;

  Del_A.Enabled:=false;

  if ListBox1.Count=0 then

    Sav_a.Enabled:=false;

  //Отрисовка новых линий

  if ListBox1.Count>0 then

    Word.Line;

  StatusBar1.Panels[0].Text:='';

  StatusBar1.Panels[1].Text:='';

  StatusBar1.Panels[2].Text:='';

  //Полное очищение поверхности рисования при условии, что список пуст

  if 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);

    end;

end;

Добавление:

Добавляет новый элемент в список букв и последующей отрисовкой стрелок

procedure TForm1.Add_BClick(Sender: TObject);

var

  Word:TWord;

  MasPoint:TPoint;

  S:string;

begin

  with Add_F do

    begin

      Form1.StatusBar1.Panels[3].Text:='Добавление элемента..';

      X_E.Text:='';

      Y_E.Text:='';

      W_E.Text:='';

      if ShowModal=mrOK then

        //Проверка на пустоту клетки и создаие экземпляра класса Tword

        if Table.Cells[StrToint(X_E.Text),StrToint(Y_E.Text)]=true then

          begin

            S:=W_E.Text;

            MasPoint.X:=StrToInt(X_E.Text);

            MasPoint.Y:=StrToInt(Y_E.Text);

            Word:=TWord.Create(Table,S,MasPoint);

            ListBox1.Items.AddObject(S+','+X_E.Text+','+Y_E.Text,Word);

            Word.Show;

            Table.Cells[StrToint(X_E.Text),StrToint(Y_E.Text)]:=false;

            Sav_A.Enabled:=true;

          end

        else ShowMessage('Эти координаты заняты');

    end;

   Form1.StatusBar1.Panels[3].Text:='';

end;

Сохранение:

procedure TForm1.Sav_AExecute(Sender: TObject);

var

  Word:TWord;

  Data:TData;

  i:integer;

  f:file of TData;

begin

  with SaveDialog1 do

    begin

      Form1.StatusBar1.Panels[3].Text:='Сохранение..';

      FileName:='';

      if Execute then

        begin

          //Перебор всех букв с дальнейшей их записью в файл

          AssignFile(f,FileName);

          Rewrite(f);

          for i:=0 to ListBox1.Count-1 do

            begin

              Word:=ListBox1.Items.Objects[i] as TWord;

              Data.S:=Word.S;

              Data.Koord:=Word.Koord;

              Write(f,Data);

            end;

          CloseFile(f);

        end;

    end;

  Form1.StatusBar1.Panels[3].Text:='';

end;

Загрузка:

procedure TForm1.Open_AExecute(Sender: TObject);

var

  f:file of TData;

  Word:TWord;

  i,j:integer;

  Data:TData;

begin

  with OpenDialog1 do

  begin

    Form1.StatusBar1.Panels[3].Text:='Открытие..';

    FileName:='';

      if Execute then

        begin

            //Присваивание свободы клеткам и очистка старой области рисования

          for i:=1 to 100 do

            for j:=1 to 100 do

              Table.Cells[i,j]:=true;

          Table.Canvas.Pen.Color:=clwhite;

          Table.Canvas.Brush.Color:=clwhite;

          Table.Canvas.Rectangle(0,0,table.Size*100,table.Size*100);

            //Разрушение старого списка данных

          for i:=ListBox1.Count-1 downto 0 do

            begin

              Word:=ListBox1.Items.Objects[i] as TWord;

              ListBox1.Items.Delete(i);

              Word.Free;

            end;

            //Открытие файла на чтение и загрузка данных

          AssignFile(f,FileName);

          Reset(f);

          while not EoF(f) do

          begin

            Read(f,Data);

            Word:=TWord.Create(Table,Data.S,Data.Koord);

            ListBox1.Items.AddObject(Word.S+','+IntTostr(Word.Koord.X)+','

                                      +IntTostr(Word.Koord.Y),Word);

            Word.Show;

            Table.Cells[Word.Koord.X,Word.Koord.Y]:=false;

          end;

          CloseFile(f);

          Del_A.Enabled:= false;

          Red_A.Enabled:= false;

          Sav_A.Enabled:= false;

          if ListBox1.Count>0 then

            Sav_A.Enabled:= true;

          StatusBar1.Panels[0].Text:='';

          StatusBar1.Panels[1].Text:='';

          StatusBar1.Panels[2].Text:='';

          StatusBar1.Panels[3].Text:='';

        end;

  end;

  Form1.StatusBar1.Panels[3].Text:='';

end;

Обоснования выбора визуальных компонентов:

Для текущего состояния программы и управления поведение воспользуемся следующими компонентами:

1.  Класс компонента TListBox для отображения текущего списка светофоров и поездов, обеспечивающих также выбор данных объектов для удаления или редактирования. Это компонент удобен тем, что способен хранить не только строки, но и объекты.

2.  Компонент TImage используется как поверхность графического отображения задачи. По сравнению с компонентами, так же имеющих поверхность рисования не требует описания полного отображения текущего состояния задачи, а самостоятельно сохраняет все изменения, вносимые входе программы.

3.  Компонент TStatusBar позволяет визуально отображать данные, который необходимы для анализа текущего состояния задачи.

4.  Компоненты TOpendialog и TSaveDialog облегчают сохранении и загрузку данных.

5.  Компоненты TMeanMenu иTPopupMenu облегчают выбор действий, которые необходимо сделать в той или иной ситуации.  В отличии от TToolBar не отвлекает от самой поставленной задачи.

6.  Компонент TActionList позволяет описать действия только один раз и в дальнейшем использовать их. В отличии от процедур, компоненты активно работают с TActionList.

Структура диалогов:

Она приведена на рисунке.  Диалоговые окна “Создания буквы”  (1) и “ Изменения данных ” (2)  являются физически двумя формами, но их поведение почти одинаково. При этом выбирается коордиаты буквы или изменяются данные о букве, соответственно; Ввод данных во всех диалоговых окнах заведомо ограничен предельными значениями.

При добавлении или редактировании буквы может возникнуть несколько видов диалоговых окон:

1.  Не введена буква

2.  Не введена координата X

3.  Не введена координата Y

4.  Неверно введена координата X

5.  Неверно введена координата Y

6.  Неверно введена буква

7.  Kоордината X должна быть целым числом

8.  Kоордината Y должна быть целым числом

9.  Буква должна быть буквой

Инструкция по использованию программы:

В начальном состоянии программа отображает только пустую область отображения и пустой список букв. Для начала действий программы требуется создать буквы. Путем выбора следующих действий: Действия -> Добавить.  В дальнейшем необходимо включить выбор координат:  Файл ->Сохранение. Чтобы удалить букву необходимо выбрать из списка соответствующий элемент и выбрать в меню: Действие > Удалить.

Изменить данные можно так: Действия -> Редактировать, но перед этим выбрав поезд из списка.