求助word搜索替换,CCRUN快来

new_BCBER 2013-02-02 10:23:53
下面是复制了一段妖哥的代码,应该没什么错误,搜索执行也正常,但文本并没有被替换,是何原因呢?


void __fastcall TForm1::Button2Click(TObject *Sender)
{
String File = "C:\\test.doc"; //按照模板文件的格式来显示
Variant vWordApp;
try
{
vWordApp = Variant::CreateObject("Word.Application");
}
catch(...)
{
MessageBox(0, "启动 Word 出错, 可能是没有安装Word.","提示", MB_OK | MB_ICONERROR);
vWordApp = Unassigned;
return;
}
// 隐藏Word界面
vWordApp.OlePropertySet("Visible", false);
vWordApp.OlePropertyGet("Documents").OleFunction("Open", File.c_str());
Variant vSelect = vWordApp.Exec(PropertyGet("Selection"));
String strText = "测试"; // 查找字符串
Variant vFind = vSelect.OlePropertyGet("Find");
vFind.OleProcedure("ClearFormatting");
vFind.OlePropertySet("Text", strText.c_str());
vFind.OlePropertyGet("Replacement").OlePropertySet("Text", "已替换"); //这句为什么没有动作??
vFind.OlePropertySet("Forward", true);
vFind.OlePropertySet("Wrap", false);
vFind.OlePropertySet("Format", false);
vFind.OlePropertySet("MatchCase", false);
vFind.OlePropertySet("MatchWholeWord", false);
vFind.OlePropertySet("MatchByte", false);
vFind.OlePropertySet("MatchWildcards", false);
vFind.OlePropertySet("MatchSoundsLike", false);
vFind.OlePropertySet("MatchAllWordForms", false);
bool bResult = vFind.OleFunction("Execute");

if (bResult)
ShowMessage("搞定的说");
else
ShowMessage("木有找到关键字");

vWordApp.OlePropertyGet("ActiveDocument").OleProcedure("Close");
Application->ProcessMessages();
vWordApp.OleProcedure("Quit");
Application->ProcessMessages();
vWordApp = Unassigned;
}
//---------------------------------------------------------------------------
...全文
312 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccrun.com 2013-02-07
  • 打赏
  • 举报
回复
年底了,我非常忙。楼上哥几个都不忙吗?
xjq2003 2013-02-07
  • 打赏
  • 举报
回复
使用CreateOleObject方式调用Word相比Service控件的最大缺点就是不支持代码的自动生成, 但是我们充分的利用VBA代码就可以弥补这个功能。 Word作为一个功能强大的Com,可以很容易被编程工具调用,成为办公自动化系统中处理文档 的强有力的嵌套工具,尤其是充分Word本身的录制宏的功能,更进一步减轻了编程的负担。 下面就如何在Delphi里面利用Word的VBA代码进行一些总结。 1、 生成VBA代码。Word本身具有很强的可扩展性,尤其是支持用户自定义功能,其实现 的主要方式就是通过VBA代码来实现的。在“工具->宏->Visual Basic编辑器”里面就可以看 到具体的宏代码,可以直接进行编辑。而且还可以使用录制宏的功能自动生成宏代码。方法是 选择“工具->宏->录制新宏”,然后执行自己想通过程序实现的功能,如存盘、打印等功能, 此时Word一边执行你要实现功能,一边将你的操作生成了一个宏,在实现功能后,可以选择 “工具->宏->VisualBasic编辑器”,查看生成的宏代码。 例如:我们要将文档中的“讨论”全部替换成“研讨”。 a. 点击“工具->宏->录制新宏”,直接点击确定,默认的宏保存到了Normal.dot系统公 用模板里面。 b. 点击“编辑->查找”,出现弹出对话框,输入查找和替换的字,点确定。进行替换。 c. 结束宏的录制,点击结束按钮。 d. 按F11或者“工具->宏->Visual Basic 编辑器”,查看宏代码。缺省查看Normal里面 的模块里面的NewMacros模块。 以下是生成的宏代码: Sub Macro1() ' ' Macro1 Macro ' 宏在 2002-2-1 由 yzhshi 录制 ' Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "讨论" .Replacement.Text = "研讨" .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = True .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With Selection.Find.Execute Replace:=wdReplaceAll End Sub 2、 精简宏代码。通常,生成的宏代码有很多语句对你要实现的功能来说都是多余的。我们要 做的就是如何找到我们需要的代码。此时我们查看具体的代码,剔除明显没有用途的代码,然后光 标停留在宏上面,按F5执行,看是否实现功能,逐步精简,得到最小代码。此步骤可参考Word的 VBA帮助来判断代码是否有用。 如上例,精简下来,剩下以下代码。 Sub Macro1() Selection.Find.ClearFormatting Selection.Find.Replacement.ClearFormatting With Selection.Find .Text = "讨论" .Replacement.Text = "研讨" End With Selection.Find.Execute Replace:=wdReplaceAll End Sub 3、 转换成Delphi代码。这一步其实很简单,对于VBA代码,只需要在前面添加Word的句柄或者 文档的句柄或者文档的句柄.Application就可以直接操作了。 例:逐句翻译:(Word_Handle是Word的句柄) (VB) Selection.Find.ClearFormatting (Delphi) Word_Handle.Selection.Find.ClearFormatting; (VB) Selection.Find.Replacement.ClearFormatting (Delphi) Word_Handle.Selection.Find.Replacement.ClearFormatting; 以上两句简单添加上Word的句柄就可以了。 (VB) With Selection.Find Text = "讨论" Replacement.Text = "研讨" End With (Delphi) Word_Handle.Selection.Find.Text := '讨论'; Word_Handle.Selection.Find.Replacement.Text := '研讨'; 以上几句因为Delphi不支持Variant的With结构,所以分开写。同时转换成Delphi语法。 (VB) Selection.Find.Execute Replace:=wdReplaceAll (Delphi) Word_Handle.Selection.Find.Execute(Replace:=2); 上面一句存在一个小技巧,如何找到常量wdReplaceAll的数值为2? 这里有几个办法, 一:直接use Word2000或者word97单元,那么直接使用常量wdReplaceAll就可以了; 二:到Word2000.pas或者Word97.pas里面查找wdReplaceAll的数值; 三:直接使用VBA代码见wdReplaceAll的数值显示出来。办法是写一个小过程,然后执行,如下: Sub ShowValue() MsgBox wdReplaceAll End Sub 最后补充一下,很多关于Word的东西可以从Word的VBA帮助里面获得。具体文件在 ?:"Program files"Microsoft Office"Office10"2052(XP)下,VBAWD10.CHM,其他版本路径基本类似。
new_BCBER 2013-02-07
  • 打赏
  • 举报
回复
送礼完毕,该专心研究BCB了。老妖收礼不少吧?! TO:xjq2003 看老妖网站上也是讲OLE方式操作多,BCB自带控件讲少。 但我没看出我上面的代码有什么问题,为什么不替换,没有解决。 百度上的这篇文章讲的是BCB自带控件使用方法,我用BCB6编译通不过 http://wenku.baidu.com/view/4e5796afdd3383c4bb4cd232.html 好多属性不允许赋值,真搞不懂。 用XE3部分测试通过。
new_BCBER 2013-02-06
  • 打赏
  • 举报
回复
引用 2 楼 ksrsoft 的回复:
String 用WideString代替试试
试了,不行。 我用的是BCB6,有在BCB6下替换成功的吗?
缘中人 2013-02-05
  • 打赏
  • 举报
回复
String 用WideString代替试试
sololie 2013-02-03
  • 打赏
  • 举报
回复
老妖忙过年去了,年尾事多估计大家都没空来
内容概要:本文围绕基于分布鲁棒优化的风电不确定性机组组合问题展开研究,提出了一种能够有效应对风电出力不确定性的数学模型与求解方法。通过构建分布鲁棒优化模型,充分考虑风电预测误差的概率分布特征及其不确定性集合的数学表达,在保障电力系统安全运行的前提下,优化发电机组的启停计划与出力分配,从而提升调度方案的经济性与鲁棒性。文中系统阐述了模型的理论基础、不确定性集合的构造方式、目标函数与约束条件的设计,并结合Matlab代码实现了算法仿真与案例验证,展示了该方法在不同场景下的适应能力与性能优势。; 适合人群:具备电力系统分析、优化理论基础及Matlab编程能力,从事新能源并网调度、电力系统运行优化、能源系统建模等方向的研究人员、高校研究生以及相关领域的工程技术开发者。; 使用场景及目标:①应用于高比例可再生能源接入背景下的电力系统机组组合决策,增强调度方案对风电波动的抵御能力;②为电力市场环境中的发电计划编制与日前调度提供科学依据和技术支持;③作为分布鲁棒优化理论在能源系统不确定性建模中应用的教学与科研案例,推动相关算法的推广与改进。; 阅读建议:建议读者结合Matlab代码深入理解模型构建与求解流程,重点关注不确定性集的设定逻辑、鲁棒性参数的选择以及算法实现细节,可进一步拓展至多能源耦合系统或多时间尺度调度场景的研究。
内容概要:本文提出了一种结合蒙特卡洛模拟与拉格朗日松弛法的分散式优化方法,用于解决电动汽车充电站在分时电价机制下的有序充电调度问题。通过蒙特卡洛方法模拟电动汽车充电行为的随机性,生成多场景充电负荷数据,并构建以降低电网负荷波动和用户充电成本为目标的优化模型。采用拉格朗日松弛法对问题进行解耦,实现各电动汽车在保护用户隐私的前提下自主参与调度决策,有效提升了计算效率与实际应用可行性。仿真实验验证了该方法在削峰填谷、减少用户电费支出以及增强电网运行稳定方面的优越性能; 适合人群:具备电力系统优化、智能交通系统、运筹学或能源管理等相关背景的研究生、科研人员及工程技术人员; 使用场景及目标:①应用于城市规模化充电站集群的分散式调度系统设计与优化;②研究分时电价政策下用户充电行为与电网负荷之间的互动响应关系;③为高比例电动汽车接入场景下的电网协同控制提供算法支持与仿真验证平台; 阅读建议:读者应结合提供的Matlab代码,深入理解蒙特卡洛场景生成与拉格朗日松弛算法的实现逻辑,建议在复现过程中调整电价策略、用户数量等关键参数,观察其对调度效果的影响,并可进一步拓展至多目标优化框架或引入可再生能源出力不确定性进行联合建模研究。

13,872

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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