『壹』 delphi怎么判断一个文本文件正在被使用
使用CreateFile函数来判断文件是否打开,编写以下函数就可以判断文件是否已打开了,代码如下:x0dx0ax0dx0afunction IsFileInUse(AName: string): boolean;x0dx0avarx0dx0a hFileRes: HFILE;x0dx0abeginx0dx0a Result := False;x0dx0a if not FileExists(AName) then exit;x0dx0a hFileRes := CreateFile(PChar(AName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);x0dx0a Result := hFileRes = INVALID_HANDLE_VALUE;x0dx0a if not Result thenx0dx0a CloseHandle(hFileRes);x0dx0aend;x0dx0a使用方式:x0dx0a if IsFileInUse('d:\test.txt') thenx0dx0a ShowMessage('文件在使用.');x0dx0a elsex0dx0a ShowMessage('文件没有使用.');x0dx0ax0dx0aCreateFile函数说明:x0dx0ax0dx0aHANDLE CreateFile(x0dx0ax0dx0aLPCTSTR lpFileName, //指向文件名的指针x0dx0ax0dx0aDword dwDesiredAccess, //访问模式(写/读)x0dx0ax0dx0aDWORD dwShareMode, //共享模式x0dx0ax0dx0aLPSECURITY_ATTRIBUTES lpSecurityAttributes, //指向安全属性的指针x0dx0ax0dx0aDWORD dwCreationDisposition, //如何创建x0dx0ax0dx0aDWORD dwFlagsAndAttributes, //文件属性x0dx0ax0dx0aHANDLE hTemplateFile //用于复制文件句柄x0dx0ax0dx0a);x0dx0ax0dx0a参数列表x0dx0ax0dx0alpFileName String 要打开的文件的名字x0dx0ax0dx0adwDesiredAccess Long 如果为 GENERIC_READ 表示允许对设备进行读访问;如果为x0dx0aGENERIC_WRITE 表示允许对设备进行写访问(可组合使用);如果为零,表示只允许获取与一个设备有关的信息x0dx0ax0dx0adwShareMode Long, 零表示不共享; FILE_SHARE_READ 和/或 FILE_SHARE_WRITEx0dx0a表示允许对文件进行共享访问 SECURITY_ATTRIBUTES,x0dx0a指向一个SECURITY_ATTRIBUTES结构的指针,定义了文件的安全特性(如果操作系统支持的话) Long,下述常数之一:x0dx0ax0dx0aCREATE_NEW 创建文件;如文件存在则会出错x0dx0ax0dx0aCREATE_ALWAYS 创建文件,会改写前一个文件x0dx0ax0dx0aOPEN_EXISTING 文件必须已经存在。由设备提出要求x0dx0ax0dx0aOPEN_ALWAYS 如文件不存在则创建它x0dx0ax0dx0aTRUNCATE_EXISTING 讲现有文件缩短为零长度 Long, 一个或多个下述常数x0dx0ax0dx0aFILE_ATTRIBUTE_ARCHIVE 标记归档属性x0dx0ax0dx0aFILE_ATTRIBUTE_COMPRESSED 将文件标记为已压缩,或者标记为文件在目录中的默认压缩方式x0dx0ax0dx0aFILE_ATTRIBUTE_NORMAL 默认属性x0dx0ax0dx0aFILE_ATTRIBUTE_HIDDEN 隐藏文件或目录x0dx0ax0dx0aFILE_ATTRIBUTE_READONLY 文件为只读x0dx0ax0dx0aFILE_ATTRIBUTE_SYSTEM 文件为系统文件x0dx0ax0dx0aFILE_FLAG_WRITE_THROUGH 操作系统不得推迟对文件的写操作x0dx0ax0dx0aFILE_FLAG_OVERLAPPED 允许对文件进行重叠操作x0dx0ax0dx0aFILE_FLAG_NO_BUFFERING 禁止对文件进行缓冲处理。文件只能写入磁盘卷的扇区块x0dx0ax0dx0aFILE_FLAG_RANDOM_ACCESS 针对随机访问对文件缓冲进行优化x0dx0ax0dx0aFILE_FLAG_SEQUENTIAL_SCAN 针对连续访问对文件缓冲进行优化x0dx0ax0dx0aFILE_FLAG_DELETE_ON_CLOSE 关闭了上一次打开的句柄后,将文件删除。特别适合临时文件x0dx0ax0dx0a也可在Windows NT下组合使用下述常数标记:x0dx0ax0dx0aSECURITY_ANONYMOUS, SECURITY_IDENTIFICATION,x0dx0aSECURITY_IMPERSONATION, SECURITY_DELEGATION,x0dx0aSECURITY_CONTEXT_TRACKING, SECURITY_EFFECTIVE_ONLYx0dx0ax0dx0ahTemplateFile Long, 如果不为零,则指定一个文件句柄。新文件将从这个文件中复制扩展属性x0dx0ax0dx0a返回值x0dx0ax0dx0a如执行成功,则返回文件句柄。x0dx0ax0dx0aINVALID_HANDLE_VALUE表示出错,会设置GetLastError。即使函数成功,但若文件存在,且指定了CREATE_ALWAYSx0dx0a或 OPEN_ALWAYS,GetLastError也会设为ERROR_ALREADY_EXISTS
『贰』 delphi内如何嵌入打开WORD,看网上是添加OleContainer控件,但不知道如何写代码能让文档在此控件中打开
Delphi中利于 RIchEdit 阅读 WORD内容:
.....
procere TForm1.Button1Click(Sender: TObject);
var
fnm: String;
WordApp,WordDoc: Variant;
sContext: String;
begin
if OpenDialog1.Execute then begin
fnm := OpenDialog1.FileName;
Label2.Caption := fnm;
WordApp := CreateOleObject('Word.Application');
try
WordApp.Visible := False;
WordDoc := WordApp.Documents.Open(fnm);
WordApp.Selection.WholeStory;
sContext := WordDoc.Range.Text;
RichEdit1.Text := sContext;
finally
WordApp.Quit;
end;
end;
end;
『叁』 为什么我用delphi调的word不能启动
用 delphi 调用 word ,通常是使用 OleCreateObject 函数,来启动 word 程序,如:
CreateOleObject('Word.Application')
此外,如果不需要考虑 word 控制等,只是单纯的专启动 word,可以使用属 ShellExecute 或是 WinExec 等函数启动程序。
如果 word 不能启动,建议检查:
1、 word 软件的安装情况,比如某些精简安装版的 word 可能由于注册表中某些登记不完整,会导致出错;运行的电脑系统中 word 是否能正确运行等等。
2、调用 word 的命令是否有误。
『肆』 delphi读取WORD文档每一页的内容
uses ComObj,WordXp;
var wordapp, WordDoc, PageRange: Variant;
sContext: string;
i, nPageCounts, nStart, nEnd : Integer;
begin
wordapp := CreateOleObject('Word.Application');
try
wordapp.Visible := True;
if dlgOpen1.Execute = False then Exit;
WordDoc := wordapp.Documents.Open(dlgOPen1.FileName);
//文档总页数
nPageCounts := wordapp.Selection.Information[wdNumberOfPagesInDocument];
//如果只有一页 那么全选就OK了
if nPageCounts = 1 then
begin
wordapp.Selection.WholeStory;
mmo1.Lines.Add('=============第'+IntToStr(nPageCounts)+'页内容:===================');
mmo1.Lines.Add(wordapp.Selection.Text);
Exit;
end;
nStart := -1;
nEnd := -1;
//循环获取文档页中的内容
for i := 1 to nPageCounts do
begin
//定位到第i页
PageRange := wordapp.Selection.GoTo(wdGoToPage, wdGoToNext, IntToStr(i));
//如果第i页是最后一页 那么直接将光标移动到最后 并输出内容
if i = nPageCounts then
begin
wordapp.Selection.EndKey(wdStory,wdExtend);
sContext := WordApp.Selection.Range.Text;
mmo1.Lines.Add('=============第'+IntToStr(i)+'页内容:===================');
mmo1.Lines.Add(sContext);
Exit;
end;
//取第i页的页首位置作为开始位置
nStart := wordapp.Selection.Start;
//定位到i+1页
PageRange := wordapp.Selection.GoTo(wdGoToPage, wdGoToNext, IntToStr(i+1));
//取第i+1页的页首位置作为结束位置
nEnd := wordapp.Selection.Start;
//根据开始位置和结束位置确定文档选中的内容(第i页的内容)
WordDoc.Range(nStart,nEnd).Select;
sContext := WordDoc.Range.Text;
//输出内容
mmo1.Lines.Add('=============第'+IntToStr(i)+'页内容:===================');
mmo1.Lines.Add(sContext);
nStart := -1;
nEnd := -1;
end;
finally
wordapp.Quit;
end;
end;
昨天没有测试好 这个应该没有问题了吧 试一下吧