📄 unit_gz_bus.~pas
字号:
unit Unit_GZ_BUS;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
TFlatButtonUnit, StdCtrls, TFlatEditUnit, TFlatHintUnit, ExtCtrls,
TFlatPanelUnit, TFlatGroupBoxUnit, TFlatTitlebarUnit,
TFlatSpeedButtonUnit, TFlatCheckBoxUnit, TFlatRadioButtonUnit, Mask,
TFlatMaskEditUnit, TFlatSpinEditUnit, TFlatMemoUnit, TFlatProgressBarUnit;
const BusNumMAX=30;
SearchResultMax=30;
type
BUSType=record
BusID:String;
Num:Byte;
ZH:array [1..BusNumMAX] of string;
end;
SearchResultType=array[1..SearchResultMax] of
record
BusIndex,ZHIndex:integer
end;
SearchNonstopType=array[1..SearchResultMax] of
record
BusIndex,Start,Over:integer
end;
SearchTurntType=array[1..SearchResultMax] of
record
FromBus,FromStart,FromOver:integer;
GoalBus,GoalStart,GoalOver:integer;
end;
SearchThriceType=array[1..SearchResultMax] of
record
FromBus,FromStart,FromOver:integer;
TrainsBus,TrainsStart,TrainsOver:integer;
GoalBus,GoalStart,GoalOver:integer;
end;
type
TForm1 = class(TForm)
FlatPanel1: TFlatPanel;
FlatEdit1: TFlatEdit;
FlatEdit2: TFlatEdit;
Label1: TLabel;
Label2: TLabel;
FlatButton1: TFlatButton;
FlatButton2: TFlatButton;
FlatEdit3: TFlatEdit;
Label3: TLabel;
OpenDialog1: TOpenDialog;
FlatButton3: TFlatButton;
FlatButton4: TFlatButton;
FlatButton5: TFlatButton;
FlatEdit4: TFlatEdit;
FlatButton6: TFlatButton;
FlatMemo1: TFlatMemo;
FlatMemo2: TFlatMemo;
procedure FlatButton3Click(Sender: TObject);
procedure FlatButton5Click(Sender: TObject);
procedure FlatButton4Click(Sender: TObject);
procedure FlatButton6Click(Sender: TObject);
procedure FlatButton1Click(Sender: TObject);
procedure FlatButton2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const strDiv=',';
strOver=';';
var
Form1: TForm1;
Bus:array [1..500] of BUSTYPE;
BusNumber:Integer=0;
implementation
{$R *.DFM}
//procedure ShowBusOne(BusIndex:integer; LightOne:integer=0; LightTwo:integer=0);
procedure ShowBusOne(SROK:SearchNonstopType; SROKNum:integer);
Var t:string;
h,i:integer;
begin
for h:=1 to SROKNum do
begin
with Bus[SROK[h].BusIndex] do
begin
t:='第 '+BusID+' 路车 ';
for i:=1 to Num do t:=t+ZH[i]+' , ';
Form1.FlatMemo2.Lines.Add(t);
end;
end;
Form1.FlatMemo2.Lines.Add('');
end;
procedure ShowBusTwo(SROK:SearchTurntType; SROKNum:integer);
Var t:string;
h,i:integer;
begin
for h:=1 to SROKNum do
begin
with Bus[SROK[h].FromBus] do
begin
t:='第 '+BusID+' 路车 ';
for i:=1 to Num do t:=t+ZH[i]+' , ';
Form1.FlatMemo2.Lines.Add(t);
end;
with Bus[SROK[h].GoalBus] do
begin
t:='转第 '+BusID+' 路车 ';
for i:=1 to Num do t:=t+ZH[i]+' , ';
Form1.FlatMemo2.Lines.Add(t);
t:='中转站名:'+ZH[SROK[h].GoalStart];
Form1.FlatMemo2.Lines.Add(t);
end;
Form1.FlatMemo2.Lines.Add('');
end;
Form1.FlatMemo2.Lines.Add('');
end;
function Explode(Var target:String):String;
var h:integer; temp:String;
begin
h:=pos(strDiv,target);
if h>0 then
begin
temp:=copy(target,1,h-1);
delete(target,1,h);
Explode:=temp;
end
else
begin
h:=pos(strOver,target);
if h>0 then
begin
temp:=copy(target,1,h-1);
delete(target,1,Length(target));
Explode:=temp;
end;
end;
end;
procedure ExplodeBus(target:String; Var B:BusType);
var h:integer;
T:array [1..BusNumMAX] of string;
begin
B.BusID:=Explode(target);
Form1.FlatMemo1.Lines.Add(B.BusID);
h:=1;
Repeat
T[h]:=Explode(target);
// Form1.FlatMemo1.Lines.Add(t[h]);
Inc(h);
until target='';
B.Num:=h-1;
for h:=1 to B.Num do B.ZH[h]:=T[h];
end;
procedure Bus_Init;
var fp:TEXT;
Temp:String;
h:integer;
begin
fillchar(Bus,sizeof(Bus),0);
assign(fp,Form1.FlatEdit3.Text);
reset(fp);
h:=1;
Repeat
Readln(fp,Temp);
if Temp<>'' then
begin
ExplodeBus(Temp,BUS[h]);
Inc(h);
end;
Until Eof(fp) or (h>500);
BusNumber:=h-1;
close(fp);
end;
//搜索给定的 第BusIndex路车 是否有一站名为s ,返回ZHindex为第几站
function SearchZHOne(s:string; BusIndex:integer; var ZHIndex:integer):Boolean;
var i:integer;
begin
SearchZHOne:=False; ZHIndex:=0;
for i:=1 to Bus[BusIndex].Num do
begin
if Bus[BusIndex].ZH[i]=s then
begin
ZHIndex:=i;
SearchZHOne:=True;
end;
end;
end;
//搜索所有包含 站名为 S 的线路
procedure SearchZHAll(s:string; var SR:SearchResultType; var SearchResultNumber:integer);
var h,i,p:integer;
begin
fillchar(SR,sizeof(SR),0);
p:=1;
for h:=1 to BusNumber do
begin
for i:=1 to Bus[h].Num do
begin
if Bus[h].ZH[i]=s then
begin
SR[p].BusIndex:=h; //第几路车
SR[p].ZHIndex:=i; //第几站
Inc(p);
end;
end;
end;
SearchResultNumber:=p-1;
end;
//搜索直达班次
Function SearchNonstopBus(inner,outter:String; var SROK:SearchNonstopType; var SROKNum:integer):Boolean;
var SR:SearchResultType; SRNum:integer;
h,j,p:integer;
begin
SearchNonstopBus:=False;
fillchar(SROK,sizeof(SROK),0); SROKNum:=0; p:=1;
SearchZHAll(inner,SR,SRNum);
for h:=1 to SRNum do
begin
if SearchZHOne(outter,SR[h].BusIndex,j) then
begin
SROK[p].BusIndex := SR[h].BusIndex;
SROK[p].Start := SR[h].ZHIndex;
SROK[p].Over := j;
Inc(p);
end;
end;
SROKNum:=p-1;
if SROKNum>0 then SearchNonstopBus:=True;
end;
//搜索换乘一次,
Function SearchTurntBus(inner,outter:String; var SROK:SearchTurntType; var SROKNum:integer):Boolean;
var SR:SearchResultType; SRNum:integer;
SRN:SearchNonstopType; SRNNum:integer;
h,i,j,k,p:integer;
begin
SearchTurntBus:=False;
fillchar(SROK,sizeof(SROK),0); SROKNum:=0;
SearchZHAll(inner,SR,SRNum);
for h:=1 to SRNum do //总共有多少路车包含有出发站
begin
/////////////////////////////////////////
///★★★★★
///for i:=1 to Bus[SR[h].BusIndex].Num
k:=SR[h].BusIndex;
p:=Bus[k].Num;
for i:=3 to p do ///以该路车的每一站为inner,搜索直达路线
if SearchNonstopBus(Bus[k].ZH[i],outter,SRN,SRNNum) then
begin
SROKNum := SROKNum + SRNNum;
for j:=1 to SRNNum do
with SROK[SROKNum] do
begin
FromBus := k;
FromStart := SR[h].ZHIndex;
FromOver := i;
GoalBus := SRN[j].BusIndex;
GoalStart := SRN[j].Start;
GoalOver := SRN[j].Over;
end;
end;
end;
if SROKNum>0 then SearchTurntBus:=True;
end;
procedure SearchBus(inner,outter:String);
//var h,i,j:integer;
begin
end;
procedure TForm1.FlatButton3Click(Sender: TObject);
begin
OpenDialog1.Execute;
if OpenDialog1.FileName<>'' then
FlatEdit3.Text:=OpenDialog1.FileName;
end;
procedure TForm1.FlatButton5Click(Sender: TObject);
begin
Bus_Init;
end;
procedure TForm1.FlatButton4Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.FlatButton6Click(Sender: TObject);
var i:integer;
begin
FlatMemo1.Clear;
with Bus[StrToInt(FlatEdit4.Text)] do
begin
FlatMemo1.Lines.Add('BusID: '+BusID);
for i:=1 to Num do FlatMemo1.Lines.Add(ZH[i]);
FlatMemo1.Lines.Add('Total: '+InttoStr(Num));
end;
end;
procedure TForm1.FlatButton1Click(Sender: TObject);
var SROK:SearchNonstopType;
SROKNum:integer;
begin
if SearchNonstopBus(FlatEdit1.Text,FlatEdit2.Text,SROK,SROKNum)
then ShowBusOne(SROK,SROKNum);
end;
procedure TForm1.FlatButton2Click(Sender: TObject);
var SROK:SearchTurntType;
SROKNum:integer;
begin
if SearchTurntBus(FlatEdit1.Text,FlatEdit2.Text,SROK,SROKNum)
then ShowBusTwo(SROK,SROKNum);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -