起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 152|回复: 7

【结贴】使用System.DispatchHelper设置Word中表格的列宽(方法SetWidth)失败[问题]

[复制链接]
发表于 2009-7-27 18:02:26 | 显示全部楼层 |阅读模式
错误信息:服务器出现意外情况

部分代码如下:

o_App := ComObj.CreateOleObject('Word.Application');
FApp := System.DispatchHelper.Create(o_App);
FApp.PropertyPut('Visible', [false]);
o_Docs := FApp.PropertyGet('Documents',  []);
FDocs := System.DispatchHelper.Create(o_Docs);
//
FDocs.InvokeMethod('Add', []);
o_ADoc := FApp.PropertyGet('ActiveDocument',  []);
FDoc := System.DispatchHelper.Create(o_ADoc);
// 添加一个5列14行的表格
o_tables := FDoc.PropertyGet('Tables', []);
tables := System.DispatchHelper.Create(o_tables);
o_Range :=  selection.PropertyGet('Range',[]);
range := System.DispatchHelper.Create(o_Range);
//ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=14, NumColumns :=5, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= wdAutoFitFixed
tables.InvokeMethod('Add',[o_Range,14,5,1,0]);
// 调整表格第一列大小为50
// 设置列宽的VBA语法:  Selection.Tables(1).Columns(1).SetWidth ColumnWidth:=50, RulerStyle:= wdAdjustFirstColumn
// 获取表格
o_tables2 := selection.PropertyGet('Tables', []);
tables2 := System.DispatchHelper.Create(o_tables2);
o_table := tables2.InvokeMethod('Item',[1]);
table := System.DispatchHelper.Create(o_table);
// 获取列
o_tableColumns := table.PropertyGet('Columns',[]);
tableColumns := System.DispatchHelper.Create(o_tableColumns);
o_tableColumn := tableColumns.InvokeMethod('Item',[1]);
tableColumn := System.DispatchHelper.Create(o_tableColumn);
// 设置大小
tableColumn.InvokeMethod('SetWidth',[50,0]); // 这里报错:服务器出现意外情况

// 退出
FApp.InvokeMethod('Quit', [nil, nil, nil]);
// 释放资源
(o_tableColumn as System.IDisposable).Dispose;
(o_tableColumns as System.IDisposable).Dispose;
(o_table as System.IDisposable).Dispose;
(o_tables2 as System.IDisposable).Dispose;
(o_Range as System.IDisposable).Dispose;
(o_tables as System.IDisposable).Dispose;
(o_SelectionFont as System.IDisposable).Dispose;
(o_Selection as System.IDisposable).Dispose;
(o_ADoc as System.IDisposable).Dispose;
(o_Docs as System.IDisposable).Dispose;
(o_App as System.IDisposable).Dispose;
回复

使用道具 举报

发表于 2009-7-28 08:54:07 | 显示全部楼层
http://bbs.justep.com/forum.php?mod=viewthread&tid=27065
看看是属性,还是方法。
如果还是不行,有可能是属于缺陷。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-28 09:17:40 | 显示全部楼层
是方法,我查过了,原型如下:
Sub SetWidth(ColumnWidth As Single, RulerStyle As WdRulerStyle)
    Word.Columns 的成员

帮助说明如下:
SetWidth 方法
参阅应用于示例特性设置表格列或单元格的宽度。

expression.SetWidth(ColumnWidth, RulerStyle)
expression      必需。该表达式返回“应用于”列表中的一个对象。

ColumnWidth     必需,Single 类型。指定列的宽度,以磅为单位。

RulerStyle      WdRulerStyle,必需。控制 Word 调整单元格宽度的方式。

WdRulerStyle 可以是下列 WdRulerStyle 常量之一:
wdAdjustNone  将所有选定的单元格或列的宽度设为指定值。Word 通过必要的左右移动保持所有未选中列的宽度。此常量是该参数的默认值。
wdAdjustSameWidth  仅将第一列单元格的宽度设为指定值。Word 通过调整所有其他列或单元格为相同宽度,保持表格的右边界。
wdAdjustFirstColumn  仅将第一列单元格的宽度设为指定值。如果表多于一列,Word 将保持表格的右边界和其他列的位置。
wdAdjustProportional  仅将第一列单元格的宽度设为指定值。如果选中多列,Word 通过将按比例调整其他选定列的宽度,来保持表格的右边界或未选中列的位置。如果仅选中一列或一个单元格,Word 通过按比例调整其他列或单元格的宽度,保持表格的右边界。

说明
上述 WdRulerStyle 行为应用于左对齐的表格。WdRulerStyle 行为用于中对齐和右对齐的表格时可能导致出错,因此 SetWidth 方法应谨慎使用。

示例
本示例在新文档中创建一张表格,设置第二行第一个单元格宽度为 1.5 英寸。本示例保持表格中其他单元格的宽度。

Set newDoc = Documents.Add
Set myTable = _
    newDoc.Tables.Add(Range:=Selection.Range, NumRows:=3, _
    NumColumns:=3)
myTable.Cell(2,1).SetWidth _
    ColumnWidth:=InchesToPoints(1.5), _
    RulerStyle:=wdAdjustNone
               
本示例设置包含插入点的单元格宽度为 36 磅。本示例缩小第一列的宽度以保持表格的右边界位置。

If Selection.Information(wdWithInTable) = True Then
    Selection.Cells(1).SetWidth ColumnWidth:=36, _
        RulerStyle:=wdAdjustFirstColumn
Else
    MsgBox "The insertion point is not in a table."
End If


我X3版本是2827
回复 支持 反对

使用道具 举报

发表于 2009-7-28 09:36:56 | 显示全部楼层
你能发个能运行的代码吗?
1楼的,o_tables2 := selection.PropertyGet('Tables', []);
selection的来源是什么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-28 11:08:37 | 显示全部楼层
这个是测试代码,所有的SetWidth方法我都测试了,不行

20090728testword.rar

1.1 MB, 下载次数: 42

回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-28 17:22:22 | 显示全部楼层
自己顶一下,就差这个调整宽度的问题了
回复 支持 反对

使用道具 举报

发表于 2009-7-28 18:02:52 | 显示全部楼层
我换了个方法
tableColumn.PropertyPut('PreferredWidth',[100 ]); 替换你那个setwidth
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-31 09:41:09 | 显示全部楼层
呵呵,老是想用方法实现,居然忘记还有属性了,谢谢,结贴吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-18 16:18 , Processed in 0.046659 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表