要实现的目的就是填写地址,例如**省**市**区(县)**乡(镇)我的数据库里面用的是一个‘全称’字段,吧这些信息全部存到一起,然后截取字段,取出需要的字符(要求这么建立数据库,没办法。)
问题一:去掉combobox里面的重复值
for i:=0 to combobox1.items.count-1
  begin
    for j:=i+1 to combobox1.items.count-1
      begin
        if combobo1.items[i]=combobox1.items[j] then
        combobox1.items.delete(j);
      end;
  end;
为什么这样删除不全重复的值,只能删掉一部分,现在我用combobox1.Items.IndexOf(s)<0这种方法
问题二:
function TFrmDiqu.Panduan(e: string): integer;
//因为有的地名比较特殊,例如:市南区,我要的是‘市南’,所以,要判断一下
var
  n,m,x:integer;
  s:string;
begin
  x:=0;
  s:=e;
  if pos('区',s)>0 then
  begin
    n:=pos('区',s);
    m:=Length(trim(s));
    s:=RightStr(s,m-n);
    //showmessage(s);
    x:=Panduan(s);
    if x>0 then
    n:=x;
  end;
  if pos('县',s)>0 then
  begin
    n:=pos('县',s);
    m:=Length(trim(s));
    s:=RightStr(s,m-n);
    //showmessage(s);
    x:=Panduan(s);
    if x>0 then
    n:=x;
  end;
  if pos('市',s)>0 then
  begin
    n:=pos('市',s);
    m:=Length(trim(s));
    s:=RightStr(s,m-n);
    //showmessage(s);
    x:=Panduan(s);
    if x>0 then
    n:=x;
  end;
  Result:=n;  //返回区县最后一个字节的位置
end;
procedure TFrmDiqu.QuxianBrush;
var
  i,m,n:integer;
  s,ss:string;
begin
//这个是查询出前面填上的的省、市,然后检索出类似的数据,肯定没有问题
  try
    DMDiqu.QueryCSelect(trim(DBshengfen.Text)+'省'+trim(DBchengshi.Text)+'市');
  except
    Application.MessageBox('数据加载失败',sysinfo,mb_ok+MB_ICONERROR);
    exit;
  end;
//这个是查询出前面填上的省、市,然后检索出类似的数据,肯定没有问题  for i := 0 to DMDiqu.QueryC.RecordCount-1 do//循环
    begin
      n:=pos('市',DMDiqu.QueryC.FieldByName('全称').AsString);
      m:=Length(Trim(DMDiqu.QueryC.FieldByName('全称').AsString));
      ss:=RightStr(DMDiqu.QueryC.FieldByName('全称').AsString,m-n);
      n:=Panduan(ss);
      s:=copy(ss,0,n-1);
      if (s<>'') and (DBchengshi.Items.IndexOf(s)<0) then
      begin
        if PageControl1.ActivePage=TabSheet1 then
        DBquxian.Items.Add(s)
        else
        DBComboBox6.Items.Add(s);
      end;
      DMJiezhongdanganEdit.QueryC.Next;
    end;
end;
看到第一个的函数里面有showmessage语句了吧,如果我屏蔽掉这个语句,那么,有的数据就会显示‘市南区’、‘市北区’有的显示‘市南’这样的效果;如果不屏蔽掉,就全部显示‘市南’、‘市北’,为什么?很不理解。实在研究 不明白了,求高手解答。
    s:=RightStr(s,m-n);
    //showmessage(s);
    x:=Panduan(s);
最多只能给100,少了点,见谅。ComboBox字符串截取

解决方案 »

  1.   

    打错了一个地方, if (s<>'') and (DBchengshi.Items.IndexOf(s)<0) then
    应该是DBquxian,不过不影响大家看。
      

  2.   

    问题一:去掉combobox里面的重复值
     for i:=0 to combobox1.items.count-1
       begin
         for j:=i+1 to combobox1.items.count-1
           begin
             if combobo1.items[i]=combobox1.items[j] then
             combobox1.items.delete(j);
           end;
       end;
     为什么这样删除不全重复的值,只能删掉一部分,现在我用combobox1.Items.IndexOf(s)<0这种方法因为你Delete(j)之后,combobox1.items就少了一笔记录了,本来下一笔是j+1的,你删除之后序号j+1实际就变成现在的j了
    不要用for循环,用while
      

  3.   

    首先,你每删一个值,Count都会变,这样就无法保证全部都遍历到
      

  4.   

    先答你第一个问题:这个删除项应该从大到小删除才可以。for i := Items.Count-1 downto 0 do 内循环类似。
      

  5.   

    我也用了query的recordcount还是不行
      

  6.   

    我试一试,关键是第二个问题啊,第一个不解决,还可以用其他方法……你这么一说我明白了,和cxgrid的删除类似,都是要从后往前删除。
      

  7.   

    Quote: 引用 3 楼 feiba7288 的回复:

    明白了,谢谢。
      

  8.   

    问题二:很有可能是系统将变量s优化了,当使用Showmessage(s)时,系统不能将其优化掉。
      

  9.   

    试试改成如下:
    function TFrmDiqu.Panduan(e: string): integer;
    //因为有的地名比较特殊,例如:市南区,我要的是‘市南’,所以,要判断一下
    var
      n,m,x:integer;
      //s:string;
    begin
      x:=0;
      //s:=e;
      if pos('区',e)>0 then
      begin
        n:=pos('区',e);
        m:=Length(trim(e));
        //s:=RightStr(s,m-n);
        //showmessage(s);
        x:=Panduan(RightStr(e,m-n));
        if x>0 then
        n:=x;
      end;
    .......
      

  10.   

    function TFrmDiqu.Panduan(e: string): integer;
    //因为有的地名比较特殊,例如:市南区,我要的是‘市南’,所以,要判断一下
    var
      n,m,x:integer;
      s:string;
    begin
      x:=0;
      s:=e;
      if pos('区',s)>0 then
      begin
        n:=pos('区',s);
        m:=Length(trim(s));
        s:=RightStr(s,m-n);
        //showmessage(s);
        x:=Panduan(s);
        if x>0 then
        n:=x;
        exit;
      end;
      if pos('县',s)>0 then
      begin
        n:=pos('县',s);
        m:=Length(trim(s));
        s:=RightStr(s,m-n);
        //showmessage(s);
        x:=Panduan(s);
        if x>0 then
        n:=x;
        exit;
      end;
      {if pos('市',s)>0 then//市你已经在前面过滤掉了,这里不需要再判断,要不然,市南区的第一个市字会被处理
      begin
        n:=pos('市',s);
        m:=Length(trim(s));
        s:=RightStr(s,m-n);
        //showmessage(s);
        x:=Panduan(s);
        if x>0 then
        n:=x;
      end;}
      Result:=n;  //返回区县最后一个字节的位置
    end;
      

  11.   

     {if pos('市',s)>0 then//市你已经在前面过滤掉了,这里不需要再判断,要不然,市南区的第一个市字会被处理
      begin
        n:=pos('市',s);
        m:=Length(trim(s));
        s:=RightStr(s,m-n);
        //showmessage(s);
        x:=Panduan(s);
        if x>0 then
        n:=x;
      end;}
      

  12.   

    Quote: 引用 15 楼 feiba7288 的回复:

    {if pos('市',s)>0 then//市你已经在前面过滤掉了,这里不需要再判断,要不然,市南区的第一个市字会被处理
    quote]
    对哦,应该是
    if x>0 then
     n:=n+x;
    这样才能记录出来真是的位置,不过,和我出现的这个错误木有关系