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) ;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.