本帖最后由 zqdl8 于 2012-05-09 18:42:09 编辑

解决方案 »

  1.   

    with   do
     begin end;
    ----------------------------------------------------
    begin
     with Memo2 do
      begin
       SetLength(str, Lines.Count,2);
       for I := 0 to  Lines.Count - 1 do
        begin
         str2:=SplitString( Lines[i],#9);
          str[I,0]:=str2[0];
          str[I,1]:=str2[1];
        end;
       end;
     with Memo1 do
      begin
      for i := 0 to  Lines.Count - 1 do
        begin
        if  Lines[i]<>'' then
          begin
            ReStr:='';
            for n := low(str) to High(str)  do
              begin
                if Trim( Lines[i])=str[n,0] then
                  begin
                    ReStr:= Lines[i]+#9+str[n,1];
                    Continue;
                  end;
              end;
            if ReStr<>'' then
              begin
                 Lines[i]:=ReStr;
              end else
              begin
                 Lines[i]:= Lines[i]+#9+'未找到数据';
              end;
            Application.ProcessMessages;
            Gauge1.MinValue:=0;
            Gauge1.MaxValue:= Lines.Count;
            Gauge1.Progress:=gauge1.Progress+1;
          end;
        end;
      end;
    end;
      

  2.   

    瓶颈在这里 Memo1.Lines[i]:=ReStr;
    另设一个Tstringlist,最后将其写入Memo1
      

  3.   

    AA01是什么样的数据 如果是‘A-F,0-9’的数据 那就是1个16进制的整形
    那么在组织数据的时候 我就会这样做
    1、SS1 :Tstrings
       ss2:Tstrings     ss1.AddObject('AA01'#9'张三',TObject($AA01)) ;
    ........
        ss2.AddObject('AA01',TObject($AA01)) ;
    .......
       for I:=0 to ......
          index := ss1.IndexOfObject(ss2.Objects[i])
          if index >=0 then 找到zai ss2 中做标记
    2、如果用了memo这类组件,在循环的时候 由于要刷新显示 会影响数据 所以最好是自己创建Tstrings来处理,处理完后 把记过传给memo组件。
      

  4.   

    如果AA01 这不是16进制整形 
    就在增加一个对应的表把AA01 这个东西数字化。用上面的办法 就可以。
      

  5.   

    楼上已经指出了问题所在
    即使是下面简单的这2句,也是比蜗牛还慢,何况还有其它的开销:
    for i:=0 to 10000 do
    memo2.lines[i]:='未找到';帮你把demo写出来,10000笔数据差不多2秒搞定,能接受的了吧;
    还有其它更快的办法暂不告诉你,能适用数据更多的情况,你的问题用下面的方法就够了!!!procedure TForm1.Button1Click(Sender: TObject);
    const space='    ';{这里的空格根据你的Memo2中ID和Name之间空格决定,自己改合适的}
    var
      i,j:Integer;
      TmpStr:string;
      sList:TStringList;
    begin
      sList:=TStringList.Create;
      try
      for i:=0 to Memo1.Lines.Count-1 do
      begin
        TmpStr:=Memo1.Lines[i]+space;
        j:=pos(TmpStr, Memo2.Text);
        if j >0 then
          TmpStr:=Memo2.Lines[SendMessage(Memo2.Handle,EM_LINEFROMCHAR,j,0)]
        else
          TmpStr:=Memo1.Lines[i]+space+'未找到' ;    sList.Add(TmpStr)
      end;
      Memo1.Lines.Assign(sList);  finally
        sList.Free;
      end;
    end;
      

  6.   

    郎之间的方法不错,再进一步优化的话,就用桶(最大值只有$FFFF,用桶效率就高了),而不用TStringList,减少搜索的循环,效率最大化了,整理数据的时候考虑自己根据这个情况写个MyStrToInt,来转换成整数,进一步提高效率。
      

  7.   

    如果你的数据AA01。。前面的ID 是有序的。那么 你在查找的时候 考虑用2分查找,这样不管你数据多大,都能很快找到。我说是这意思。
      

  8.   

    郎之间,满足要求就是目的,大部分人毕竟不是专业的软件公司,不要太较真。
    2.5万数据,这个应用(ID to Name并显示),带显示超过2秒我觉得肯定可以再优化
      

  9.   

    kiboisme 是的 满足需求是最重要的。
    最近 想找个做windows应用开发的人。所以跑到论坛来看看,也抽空回答一些delphi板块的帖子。发现现在做delphi的很极端,NB的依然很NB。但是很多帖子问题都是 抱着叫别人帮做demo什么的。自己不考虑 优化自己的逻辑 和数据结构。
    这个帖子 数据量大 不是有序数据 然后需要查找 。其实做一个排序后用2分查找 将大大提高效率 
    之所以说这么多 还是希望不管用什么工具的人  都要随时都考虑 效率优化。