word 控制求解,在线等待,分数可以再加,如何用delphi程序判断word中有字体设置等模态对话框存在(50分)

  • 主题发起人 主题发起人 jimiking
  • 开始时间 开始时间
J

jimiking

Unregistered / Unconfirmed
GUEST, unregistred user!
如题,如何用delphi程序判断word中有字体设置等模态对话框存在,使我在退出word之前,提示先关闭该设置窗口

另外如何获得word文档的句柄,能否获得模态对话框的句柄

分数可以再加
 
分数不是问题,如果我知道答案一定告诉你:)
 
太难了,自已搞定吧!
 
哥哥 啊~··
 
你使用delphi中的wordapplication控件,它可以解决你的所有问题。如何获得word句柄和关闭模态对话框,它都可以解决。你自己先做看看,如果有什么问题我可以给你发些源代码。
 
谢谢 小虫 我已经不是第一次在大富翁问这个问题了,都没有得到实质性的有用的帮助

我是用了那个控件,我的问题是一个系统中的一部分。现在我需要解决的是: 用控件将

word调出来以后,进行字体等属性设置,操作我的delphi程序,使得word自动保存,但是当有模态对话框存在时,会报错,因此我想先判断这个模态对话框是否处于显示状态,如果为
显示状态,可以提示用户先关闭,或者用程序控制它关闭,如何实现,希望你能尽快将源码发给我,因为项目不等人啊 呵呵 谢谢了
 
我的邮箱是 jimiking@163.com
 
常规方法是不行的,我觉得可以用api函数查找窗口下的窗体,根据窗体标题来判断
到底是哪一个对话框。不过就是麻烦一些,而且各个版本之间也有可能不兼容。但总的
来说,应该是可行的.application对象有dialogs属性,但好像无法实现你的功能,没法
获得句柄
 
老大 能不能具体一点~
 
如果你编程修改文档的话,无须打开对话框就可以完成一切操作,不就省去关闭对话框的问题了吗?我理解对吗?
 
我是让别人去修改文档 不是我自己·~
 
别人用WORD修改文档吗,返回你的控制程序时,检测WORD是否关闭,提醒用户关闭WORD文档不就行了吗?
 
不大明白你的思路,不过楼上的话是有道理的。
用wordapplication是不可能获得窗口举柄的,好像又没有方法可以知道一个对话框是打
开的。但窗口的标题是知道的,api函数通过标题找出窗口句柄,你的问题就可以解决了

下面的一段代码把字体对话框挪到自己的程序中
var
TheProgHwnd:Hwnd;
Stext:string;

function EnumWindowsProc(AHWnd: HWnd;
LPARAM: lParam): boolean; stdcall;
var
WndCaption: array[0..254] of char;
WndClassName: array[0..254] of char;
ParentHWnd:hwnd;
begin
GetWindowText(AHWnd, @WndCaption, 254);
GetClassName(AHWnd, @WndClassName, 254);
ParentHWnd:=GetParent(AHWnd);
if StrPas(WndCaption)= Stext then
begin
TheProgHwnd:=FindWindow(WndClassName,WndCaption);
end;

Result := True;
end;

{$R *.dfm}

procedure TForm1.asdfsdf1Click(Sender: TObject);
var Myprog:Hwnd;
begin
stext:='字体';
EnumWindows(@EnumWindowsProc, 0);
windows.SetParent(TheProgHwnd,Handle);
// moveWindow(TheProgHwnd,0,0,800,600,True);
end;
 
忘了说了,用GetWindowPlacement可以知道窗口是不是可见的
 
谢谢楼上的 我去试一下。

不知道我是不是说得不够清楚,用户在修改word文档时,要考虑到可能忘记将word文档保存
后退出,因此我要做到用程序返回时,自动对文档进行保存并关闭word。但是如果模态对话框存在时,必须要先关闭然后才能最文档进行保存然后将word关闭 我的思路是获得模态对话框的句柄,然后用程序控制它关闭 不知道这样是否清楚了 是不是麻烦一点

有什么好的建议吗 谢谢
 
说清楚了,用上面的方法不行吗?
 
如果要枚举的话,WORD中有二百多个对话框,一个个去检查吗,不现实吧。
 
我试了一下,用下面的保存,如果没有模态对话框,可以。有的时候,返回错误被呼叫方拒绝接受呼叫。所以,我觉得可以用try except end捕获错误,如果返回错误是这个,就
检查那个对话框是打开的,检查方法见下:
忘了说了,Execute 方法应用 Microsoft Word 对话框的当前设置

var tmp,t2,t1:olevariant;
begin
tmp:=0;
t1:=wdSaveChanges;
t2:=wdPromptUser;
wordapp.ActiveDocument.Close(t1,t2,tmp);
end;

检查对话框的关闭方式
Show 和 Display 方法返回的值标明关闭对话框时单击的按钮。下列示例显示“分隔符”对话框,如果单击“确定”按钮,则在状态栏中显示一条消息。

Sub DialogBoxButtons()
If Dialogs(wdDialogInsertBreak).Show = -1 Then
StatusBar = "Break inserted"
End If
End Sub
下列表格说明与对话框中的按钮相关联的返回值。

返回值 说明
-2 “关闭”按钮。
-1 “确定”按钮。
0(零) “取消”按钮。
> 0(零) 命令按钮:1 代表第一个按钮,2 代表第二个按钮,以此类推。

 
你说的错误和我的一样 就是在有模态对话框时才会出错
 
给你试了一下,好像不行,再找找吧!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
后退
顶部