用delphi7开发,delphi还算熟悉,autocad二次开发刚刚接触。
想在很多dwg文件中,查找含有某一字符串的文件,想用如下思路:
1、用lstFiles:Tstringlist获取所有dwg的路径。(实现)
2、遍历lstFiles,逐个打开dwg,并查找。
步骤2中,
  for i:=0 to lstFiles.Count-1 do
  begin
    ……//打开dwg文件,
    for j := 0 to obj_ModelSpace.Count-1 do  //遍历模型空间中的每一个实体对象
    begin
      AcadObj := obj_ModelSpace.Item(j);     //引用第j个实体对象
      EntiType := AcadObj.EntityType;     //提取实体类型
      if (EntiType = acText) or (EntiType = acMText) then     //如果是文本
      begin
        //showmessage(AcadObj.TextString);
      end;
    end;
    请教:
    //1、这里应该如何释放资源?
    //2、每个循环都创建一次再释放一次,是不是效率很低,有好办法吗?
  end;实现这样的功能有更好的办法吗?请大家指教。

解决方案 »

  1.   

    呵呵,没玩过这个。你说的“每个循环都创建一次再释放一次”是指哪里?COM对象是自动管理生命周期的,一般主接口会提供Quit方法结束的。
      

  2.   

    不妨换一种思路,根本不用管autocad对象,直接针对文件进行处理完整的查找文件中特定字符串的函数如下function GetPos():int64;
    const
      ConBytes=4;      //这里是你要查找的字符串的字节数
      ConFileN='d:\test\test.bin';
      ConFindS=#$6D#$6F#$73#$74;  //这里换成你要查找的字符串 #$表示16进制字符
    var
      ff:TMemoryStream;
      buffer:array[0..ConBytes-1] of byte;
      buffer2:array[0..2*ConBytes-1] of byte;
      i,size:int64;
      j:byte;
    begin
      result:=-1;  //表示未找到
      ff:=TMemorystream.create;
      ff.LoadFromFile(ConFileN);
      size:=ff.size;
      i:=0;
      for j:=0 to ConBytes-1 do
        buffer2[j]:=0;
      while i <size do
      begin
        ff.read(buffer,ConBytes);
        for j:=0 to ConBytes-1 do
          buffer2[j+ConBytes]:=buffer[j];
        j:=pos(ConFindS,pchar(@buffer2));
        if j>0 then
        begin
          result:=i+j-ConBytes-1;    //从0开始的相对于文件头的偏移量
          break;
        end;
        for j:=0 to ConBytes-1 do
          buffer2[j]:=buffer[j];
        inc(i,ConBytes);
      end;
      ff.free;
    end; 
      

  3.   

    var
      s,str:string;
      i:integer;
    begin
      s:='信息中心';
      for i   := 1 to length(s) do
      begin
        str:=str + IntToHex(ord(s[i]),2);
      end;
      ShowMessage(str);
    end;
      

  4.   


    谢谢,我试了一下。但因为汉字占两个字节,而dwg文件里可能有数字,这是不是需要特殊的处理?