delphi二次开发autocad,如何在很多dwg文件中查找某一文字?

vinge 2008-12-28 06:01:51
用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;

实现这样的功能有更好的办法吗?请大家指教。
...全文
440 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
bdmh 2009-03-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 vinge 的回复:]
我怎么把一个字符串弄成16进制啊?比如,我想在文件中找“信息中心”这个字符串,应该怎么弄?
谢谢!
[/Quote]


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;
GHOSTSEA 2009-03-19
  • 打赏
  • 举报
回复
学习中,帮顶
vinge 2009-03-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bdmh 的回复:]
Delphi(Pascal) codevars,str:string;
i:integer;begins:='信息中心';fori :=1tolength(s)dobeginstr:=str+IntToHex(ord(s[i]),2);end;
ShowMessage(str);end;
[/Quote]

谢谢,我试了一下。但因为汉字占两个字节,而dwg文件里可能有数字,这是不是需要特殊的处理?
vinge 2009-03-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ljluck7687 的回复:]
不妨换一种思路,根本不用管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,siz…
[/Quote]

我怎么把一个字符串弄成16进制啊?比如,我想在文件中找“信息中心”这个字符串,应该怎么弄?
谢谢!
ljluck7687 2009-01-16
  • 打赏
  • 举报
回复
不妨换一种思路,根本不用管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;
ZuoBaoquan 2009-01-02
  • 打赏
  • 举报
回复
呵呵,没玩过这个。

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

16,747

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧