程序的基本功能是实现公交车的换乘查询,即输入两个站点名进行查找,如果有一条记录就直接输出,如果多于一条就先全部输出,然后再根据两个站点间站点最少的算法给出最佳路线,程序如下,因为嵌套的条件和循环语句太多,看起来很不清楚,运行时当查询的记录多于1条时就会产生错误,但不知道错在哪。
随便问一句,像这种程序有没有什么好的方法可以避免这么多嵌套的条件或循环啊?procedure Tgjhc.FlatSpeedButton1Click(Sender: TObject); //换乘查询
type jgzd=array of integer;
var zd1,zd2,tjzd,xl:string;
strlist:tstringlist;
i,j,k1,k2:integer;
k:jgzd;
begin
zd1:=trim(FlatComboBox1.Text);
zd2:=trim(FlatComboBox2.Text);
if ((zd1<>'') and (zd2<>'')) then
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
sqlstr:='select * from luxian where 途经站点 like ''%'+ zd1+'%'+zd2+'%'' or 途经站点 like ''%'+zd2+'%'+zd1+'%''';
ADOQuery1.SQL.Text:=sqlstr;
ADOQuery1.Open;
if ADOQuery1.RecordCount>0 then //查询到的记录不为0
begin
if ADOQuery1.RecordCount=1 then //查询到一条记录
begin
xl:=adoquery1.fieldbyname('线路').AsString;
tjzd:=adoquery1.fieldbyname('途经站点').AsString;
flatmemo1.Clear;
FlatMemo1.Lines.Add('从'+zd1+'到'+zd2+'的路线有:');
flatmemo1.Lines.Add(xl);
flatmemo1.Lines.Add('途经站点:'+tjzd);
end
else //查询到的记录不止一条
begin
flatmemo1.Clear;
FlatMemo1.Lines.Add('从'+zd1+'到'+zd2+'的路线有:');
j:=0;
while not ADOQuery1.Eof do
begin
xl:=adoquery1.fieldbyname('线路').AsString;
tjzd:=ADOQuery1.fieldbyname('途经站点').AsString;
flatmemo1.Lines.Add(xl);
flatmemo1.Lines.Add('途经站点:'+tjzd);
strlist:=SplitString(tjzd,'-');
for i:=0 to strlist.Count-1 do
if(strlist[i]=zd1) then
k1:=i
else if strlist[i]=zd2 then
k2:=i;
k[j]:=abs(k2-k1);
j:=j+1;
end;
for i:=0 to (j-1) do
if k[i+1]<k[i] then
k1:=i+1;
with adoquery1 do
begin
DisableControls;
if not Active then Active:=true;
First; //以第一条记录为起点,如果是当前记录为起点的,请删除此句
if k1<=RecordCount then
begin
MoveBy(k1);
xl:=adoquery1.fieldbyname('线路').AsString;
flatmemo1.Lines.Add('推荐路线:'+xl);
close;
EnableControls;
end
end
end
end
else //如果查询记录为0
begin
flatmemo1.Clear;
flatmemo1.Lines.Add('找不到从'+zd1+'到'+zd2+'的路线,请确认您的输入是否正确!');
flatcombobox1.SetFocus;
end
end
else //如果两个站点没有填写完整
begin
application.MessageBox('请输入或两个站点名!','提示',64);
FlatComboBox1.SetFocus;
end
end;
随便问一句,像这种程序有没有什么好的方法可以避免这么多嵌套的条件或循环啊?procedure Tgjhc.FlatSpeedButton1Click(Sender: TObject); //换乘查询
type jgzd=array of integer;
var zd1,zd2,tjzd,xl:string;
strlist:tstringlist;
i,j,k1,k2:integer;
k:jgzd;
begin
zd1:=trim(FlatComboBox1.Text);
zd2:=trim(FlatComboBox2.Text);
if ((zd1<>'') and (zd2<>'')) then
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
sqlstr:='select * from luxian where 途经站点 like ''%'+ zd1+'%'+zd2+'%'' or 途经站点 like ''%'+zd2+'%'+zd1+'%''';
ADOQuery1.SQL.Text:=sqlstr;
ADOQuery1.Open;
if ADOQuery1.RecordCount>0 then //查询到的记录不为0
begin
if ADOQuery1.RecordCount=1 then //查询到一条记录
begin
xl:=adoquery1.fieldbyname('线路').AsString;
tjzd:=adoquery1.fieldbyname('途经站点').AsString;
flatmemo1.Clear;
FlatMemo1.Lines.Add('从'+zd1+'到'+zd2+'的路线有:');
flatmemo1.Lines.Add(xl);
flatmemo1.Lines.Add('途经站点:'+tjzd);
end
else //查询到的记录不止一条
begin
flatmemo1.Clear;
FlatMemo1.Lines.Add('从'+zd1+'到'+zd2+'的路线有:');
j:=0;
while not ADOQuery1.Eof do
begin
xl:=adoquery1.fieldbyname('线路').AsString;
tjzd:=ADOQuery1.fieldbyname('途经站点').AsString;
flatmemo1.Lines.Add(xl);
flatmemo1.Lines.Add('途经站点:'+tjzd);
strlist:=SplitString(tjzd,'-');
for i:=0 to strlist.Count-1 do
if(strlist[i]=zd1) then
k1:=i
else if strlist[i]=zd2 then
k2:=i;
k[j]:=abs(k2-k1);
j:=j+1;
end;
for i:=0 to (j-1) do
if k[i+1]<k[i] then
k1:=i+1;
with adoquery1 do
begin
DisableControls;
if not Active then Active:=true;
First; //以第一条记录为起点,如果是当前记录为起点的,请删除此句
if k1<=RecordCount then
begin
MoveBy(k1);
xl:=adoquery1.fieldbyname('线路').AsString;
flatmemo1.Lines.Add('推荐路线:'+xl);
close;
EnableControls;
end
end
end
end
else //如果查询记录为0
begin
flatmemo1.Clear;
flatmemo1.Lines.Add('找不到从'+zd1+'到'+zd2+'的路线,请确认您的输入是否正确!');
flatcombobox1.SetFocus;
end
end
else //如果两个站点没有填写完整
begin
application.MessageBox('请输入或两个站点名!','提示',64);
FlatComboBox1.SetFocus;
end
end;
解决方案 »
- 求助:在窗体范围内,里面的一个button快捷键怎么设置呀? 比如 Ctrl+S 执行 保存按钮
- 数据库与图片问题.
- 能不能將繁體的DBF文件轉換為簡體的DBF文件
- 谁还买日货就是在自杀! [警惕日本发动第三次侵华战争--台湾职业经理人余世维给中国人寿的讲演]
- 关键字:ODBC Paradox 必须使用一个可更新的查询
- 关于多个数据表同时管理计算的问题!
- 哪里有联通或移动的发短消息的代码? 谢谢告诉我啊!
- 怎样更改查询到的数据?
- 哪位老大有用COM+开发的三层结构的程序,麻烦给小弟看看。
- 请问一下,在DELPHI里,能实现文件和目录的上传功能吗,怎么做???
- 关于Format函数使用的问题????? 挥泪大送分
- delphi软件哪个版本最好?
1.while not ADOQuery1.Eof do //循环的最后一句必须是 ADOQuery1.Next;
2.strlist 在使用前一定要 strlist:= TStringList.Create; 在使用后一定要 strlist.Free;