首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

见鬼!combobox赋值和截取字符串有关问题

2013-06-26 
见鬼!求高手指教!combobox赋值和截取字符串问题!要实现的目的就是填写地址,例如**省**市**区(县)**乡(镇)

见鬼!求高手指教!combobox赋值和截取字符串问题!
要实现的目的就是填写地址,例如**省**市**区(县)**乡(镇)我的数据库里面用的是一个‘全称’字段,吧这些信息全部存到一起,然后截取字段,取出需要的字符(要求这么建立数据库,没办法。)
问题一:去掉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 字符串截取
[解决办法]
问题一:去掉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
[解决办法]
首先,你每删一个值,Count都会变,这样就无法保证全部都遍历到
[解决办法]
先答你第一个问题:这个删除项应该从大到小删除才可以。for i := Items.Count-1 downto 0 do 内循环类似。
[解决办法]
试试改成如下:
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;
.......
[解决办法]
 {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;}

热点排行