程序的基本功能是实现公交车的换乘查询,即输入两个站点名进行查找,如果有一条记录就直接输出,如果多于一条就先全部输出,然后再根据两个站点间站点最少的算法给出最佳路线,程序如下,因为嵌套的条件和循环语句太多,看起来很不清楚,运行时当查询的记录多于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;