Применение средств графического отображения для организации непрерывного движения поездов с непрерывным переключением светофора по кольцевой железной дороге, страница 5

    FirstTrain.NextTrain:= fNewTrain ;

    FirstTrain.BackTrain:= fNewTrain ;

   end

    else

    begin

     fNewTrain.BackTrain.NextTrain:= fNewTrain ;

     FirstTrain.BackTrain:= fNewTrain ;

    end ;

  end;

 inc(CountTrain) ;

{Визуальное изменение кол-во поездов в StatusBar1}

 fNewTrain.Panel.Text:= ' Кол-во поездов:  ' + IntToStr(CountTrain) ;

 fSvetofor.Train:= fNewTrain ;

 PereschetSvetofor ;

{Добавление в ListObjectSvetofor(класс TListBox) поезда}

fNewTrain.ListBox. Items.Addobject('Поезд № ' + IntToStr(fNewTrain.Index), fNewTrain) ;

end ;

*  Сохранение:

procedure PoleSave(fName: string) ;

var

 f: file ;

 fSvetofor: TSvetofor ;

 i: integer ;

 RecTrain: TRecTrain ;

 RecSvetofor: TRecSvetofor ;

 RecParametr: TRecParametr ;

begin

 assignfile(f, fName) ;

 rewrite(f,1) ;

 {Задание общих параметров}

 RecParametr.CountSvetofor:= CountSvetofor ;

 RecParametr.CountTrain:= CountTrain ;

 RecParametr.Radius:= Radius ;

 RecParametr.MaxIndexSvetofor:= MaxIndexSvetofor ;

 RecParametr.MaxIndexTrain:= MaxIndexTrain ;

 BlockWrite(f,RecParametr, sizeof(RecParametr)) ;

 {Перебор всех светофоров с дальнейшей их записью в файл.

Если перед светофором находится поезд, то сразу же за светофором в файл запишется и поезд}

 fSvetofor:= FirstSvetofor ;

 for i:= 1 to CountSvetofor do

 begin

{Запись параметров светофора}

  RecSvetofor.Index:= fSvetofor.Index ;

{Определение на наличие поезда}

  if fSvetofor.Train <> nil then

   RecSvetofor.TrainIndex:= fSvetofor.Train.Index

   else

    RecSvetofor.TrainIndex:= -1 ;

  RecSvetofor.aPosite:= fSvetofor.aPosit + aVTrain ;

  BlockWrite(f,RecSvetofor, sizeof(RecSvetofor)) ;

  {Если поезд есть}

  if fSvetofor.Train <> nil then

  begin

{Запись параметров поезда}

   with RecTrain do

   begin

    StepPos:= fSvetofor.Train.StepPos ;

    Speed:= fSvetofor.Train.Speed ;

    SpCol:= fSvetofor.Train.SpCol ;

    PeremBool:= fSvetofor.Train.PeremBool ;

    aPosit:= fSvetofor.Train.aPosit ;

    TrColor:= fSvetofor.Train.TrColor ;

   end ;

   BlockWrite(f,RecTrain,sizeof(RecTrain)) ;

  end ;

  fSvetofor:= fSvetofor.NextSvetofor ;

 end ;

 closefile(f) ;

{Визуальное изменение имени файла в StatusBar1}

 Unit1.main.StatusBar1.Panels[0].Text:= ExtractFileName(fName) ;

end ;

*  Загрузка:

procedure PoleLoad(fName: string) ;

var

 f: file ;

 fNewSvetofor, fSvetofor: TSvetofor ;

 fNewTrain, fTrain: TTrain ;

 i: integer ;

 RecTrain: TRecTrain ;

 RecSvetofor: TRecSvetofor ;

 RecParametr: TRecParametr ;

Begin

 PoleDeleteObject ;

 VObnulirovanie ;

 fSvetofor:= nil ;

 fTrain:= nil ;

 assignfile(f, fName) ;

 reset(f,1) ;

 BlockRead(f, RecParametr, sizeof(RecParametr)) ;

{Заполнение констант общего плана}

 CountTrain:= RecParametr.CountTrain ;

 CountSvetofor:= RecParametr.CountSvetofor ;

 Radius:= RecParametr.Radius ;

 MaxIndexSvetofor:= RecParametr.MaxIndexSvetofor ;

 MaxIndexTrain:= RecParametr.MaxIndexTrain ;

 ConstInitialization ;

 {Загрузка всех светофоров}

 for i:= 1 to CountSvetofor do

 begin

  BlockRead(f, RecSvetofor, sizeof(RecSvetofor)) ;

{Если происходит загрузка первого светофора}

  if FirstSvetofor = nil then

  begin

   fNewSvetofor:= TSvetofor.Create(nil,nil,RecSvetofor.aPosite, RecSvetofor.Index , main.Image1.Canvas, main.LBSvetofor, main.StatusBar1.Panels[2]) ;

   fNewSvetofor.NextSvetofor:= fNewSvetofor ;

   fNewSvetofor.BackSvetofor:= fNewSvetofor ;

   FirstSvetofor:= fNewSvetofor ;

  end

{Если происходит загрузка не  первого светофора}

   else

   begin

    fNewSvetofor:= TSvetofor.Create(FirstSvetofor,fSvetofor,RecSvetofor.aPosite,RecSvetofor.Index , main.Image1.Canvas, main.LBSvetofor, main.StatusBar1.Panels[2]) ;

    fSvetofor.NextSvetofor:= fNewSvetofor ;

   end ;

  fSvetofor:= fNewSvetofor ;

  fNewSvetofor.ListBox. Items.Addobject('Светофор № ' + IntToStr(fNewSvetofor.Index), fNewSvetofor) ;

{Если перед данным светофором имеется поезд}

  if RecSvetofor.TrainIndex <> -1 then

  begin

   BlockRead(f,RecTrain, sizeof(RecTrain)) ;

{Если происходит загрузка  первого поезда}

   if FirstTrain = nil then

   begin

    fNewTrain:= TTrain.Create(fNewSvetofor,nil,nil,RecTrain.Speed,RecTrain.aPosit,RecTrain.TrColor, RecSvetofor.TrainIndex , main.Image1.Canvas, main.LBSvetofor, main.StatusBar1.Panels[3]) ;

    fNewTrain.NextTrain:= fNewTrain ;

    fNewTrain.BackTrain:= fNewTrain ;

    FirstTrain:= fNewTrain ;

   end

    else

{Если происходит загрузка не первого поезда}

    begin

     fNewTrain:= TTrain.Create(fNewSvetofor,FirstTrain,fTrain,RecTrain.Speed,RecTrain.aPosit,RecTrain.TrColor, RecSvetofor.TrainIndex , main.Image1.Canvas, main.LBSvetofor, main.StatusBar1.Panels[3]) ;

     fTrain.NextTrain:= fNewTrain ;

    end ;

   fNewSvetofor.Train:= fNewTrain ;

   fNewTrain.StepPos:= RecTrain.StepPos ;

   fNewTrain.SpCol:= RecTrain.SpCol ;

   fNewTrain.PeremBool:= RecTrain.PeremBool ;

   fTrain:= fNewTrain ;

   fNew Train.ListBox.Items.Addobject('Поезд № ' + IntToStr(fNewTrain.Index), fNewTrain) ;

  end ;

 end ;

{Если светофоров и поездов было больше одного, то переписать ссылки }

 if CountSvetofor > 0 then

  FirstSvetofor.BackSvetofor:= fNewSvetofor ;

 if CountTrain > 0 then

  FirstTrain.BackTrain:= fNewTrain ;

 closefile(f) ;

 PereschetSvetofor ;

 with Unit1.main.StatusBar1 do

 begin

  Panels[0].Text:= ExtractFileName(fName) ;

  Panels[1].Text:= ' Радиус дороги:  ' + IntToStr(Radius) ;

  Panels[2].Text:= ' Кол-во светофоров: ' + IntToStr(CountSvetofor) ;

  Panels[3].Text:= ' Кол-во поездов:  ' + IntToStr(CountTrain) ;