Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何正确阅读Visio Shape的文本 我正在尝试将VBA代码转换到C,这样我所做的表单应用程序是独立的。我在尝试从组中的形状中获取文本时遇到问题。下面是一个VBA的例子,它可以完美地工作 Dim text as String text = groupShape.shapes.item("rectangle").text_C#_Vba_Com Interop_Visio - Fatal编程技术网

C# 如何正确阅读Visio Shape的文本 我正在尝试将VBA代码转换到C,这样我所做的表单应用程序是独立的。我在尝试从组中的形状中获取文本时遇到问题。下面是一个VBA的例子,它可以完美地工作 Dim text as String text = groupShape.shapes.item("rectangle").text

C# 如何正确阅读Visio Shape的文本 我正在尝试将VBA代码转换到C,这样我所做的表单应用程序是独立的。我在尝试从组中的形状中获取文本时遇到问题。下面是一个VBA的例子,它可以完美地工作 Dim text as String text = groupShape.shapes.item("rectangle").text,c#,vba,com-interop,visio,C#,Vba,Com Interop,Visio,这将返回正确的值。 在C中,我使用的是microsoft.office.interop.visio.dll引用。我能够很好地读取形状名称,因此我知道我的应用程序和文档对象工作正常。在C语言中,上面的代码如下所示: var text = ""; text = Doc.Shapes.ItemU("groupShape").Shapes.ItemU("rectangle").text 这没有返回正确的值。它是说它将返回Object,所以我相信它不会返回字符串,而是返回一个Object 为了返回文本,

这将返回正确的值。 在C中,我使用的是microsoft.office.interop.visio.dll引用。我能够很好地读取形状名称,因此我知道我的应用程序和文档对象工作正常。在C语言中,上面的代码如下所示:

var text = "";
text = Doc.Shapes.ItemU("groupShape").Shapes.ItemU("rectangle").text
这没有返回正确的值。它是说它将返回Object,所以我相信它不会返回字符串,而是返回一个Object

为了返回文本,我可以做些什么来解决这个问题?谢谢

编辑: 下面是我正在编写的实际代码。vba与c

VBA:

c

另一编辑: 我还尝试通过引用文本所在的单元格来研究形状数据属性,但仍然没有成功

Txt_JobName.Text = tempShape.Shapes.ItemU["textJobName"].CellsSRC[8, 0, 0].ResultStr[0];

我对Visio类型库不是很熟悉,但是:

groupShape.shapes.item("rectangle")
正在返回形状对象。抓取该对象引用,而不是用另一个点丢弃它。VBA在这方面很有帮助,它让您可以编写只能在运行时解决的后期绑定调用—C只允许使用dynamic关键字,您通常不希望针对dynamic编写代码—您希望使用强类型:

Dim rectangle As Shape
Set rectangle = groupShape.shapes.item("rectangle")

Dim rectangleText As String
rectangleText = rectangle.Text
C/interop代码需要执行相同的操作:

var groupShape = (Shape)Doc.Shapes.ItemU("groupShape");
var rectangle = (Shape)groupShape.Shapes.ItemU("rectangle");
var rectangleText = rectangle.Text // assuming Text is defined on the Shape interface
换句话说,要时刻注意你所使用的类型;如果一个成员返回一个对象,并且您需要它是一个更具体的类型,那么您需要在对该成员调用进行编译时验证之前根据需要强制转换,或者如果您不关心编译时验证并将其推迟到运行时,则需要强制转换为动态:

var text = (string)((dynamic)groupShape.Shapes.ItemU("rectangle")).Text

注意对字符串的转换;文本将是一个字符串。忘记强制转换,您的代码将不得不处理在整个执行路径中的动态传播,就像癌症一样,并破坏您的类型安全-您不希望这样。

我对Visio类型库不是很熟悉,但这:

groupShape.shapes.item("rectangle")
正在返回形状对象。抓取该对象引用,而不是用另一个点丢弃它。VBA在这方面很有帮助,它让您可以编写只能在运行时解决的后期绑定调用—C只允许使用dynamic关键字,您通常不希望针对dynamic编写代码—您希望使用强类型:

Dim rectangle As Shape
Set rectangle = groupShape.shapes.item("rectangle")

Dim rectangleText As String
rectangleText = rectangle.Text
C/interop代码需要执行相同的操作:

var groupShape = (Shape)Doc.Shapes.ItemU("groupShape");
var rectangle = (Shape)groupShape.Shapes.ItemU("rectangle");
var rectangleText = rectangle.Text // assuming Text is defined on the Shape interface
换句话说,要时刻注意你所使用的类型;如果一个成员返回一个对象,并且您需要它是一个更具体的类型,那么您需要在对该成员调用进行编译时验证之前根据需要强制转换,或者如果您不关心编译时验证并将其推迟到运行时,则需要强制转换为动态:

var text = (string)((dynamic)groupShape.Shapes.ItemU("rectangle")).Text
注意对字符串的转换;文本将是一个字符串。忘记强制转换,您的代码将不得不处理在整个执行路径中的动态传播,就像癌症一样,并破坏您的类型安全-您不希望这样。

首先,尝试使用.Item not.ItemU,这两个函数是不同的。在VBA中隐式使用的默认项是Item。实际上,您可能正在用c语言处理一个不同的形状

第二,.Text应该以大写字母T开头,带小T的代码不应该编译。请确保.text(小写)不是从某处导入的扩展方法,与Visio无关

第三个警告-为了确保在UI中看到的形状中获得文本,最好使用shape.Characters.text,因为如果形状包含字段,shape.text将返回占位符“obj”,用于字段文本应该出现的位置。但这适用于VBA和C

第四。。VBA中的groupShape似乎是一个变量名,而不是形状名。从代码中不清楚该组形状的名称。你是怎么在VBA中得到这个的?可能值得检查。

首先,尝试使用.Item而不是.ItemU,这两个函数是不同的。在VBA中隐式使用的默认项是Item。实际上,您可能正在用c语言处理一个不同的形状

第二,.Text应该以大写字母T开头,带小T的代码不应该编译。请确保.text(小写)不是从某处导入的扩展方法,与Visio无关

第三个警告-为了确保在UI中看到的形状中获得文本,最好使用shape.Characters.text,因为如果形状包含字段,shape.text将返回占位符“obj”,用于字段文本应该出现的位置。但这适用于VBA和C


第四。。VBA中的groupShape似乎是一个变量名,而不是形状名。从代码中不清楚该组形状的名称。你是怎么在VBA中得到这个的?可能值得检查。

像往常一样,我来找出.Text返回Obj的原因是形状中没有任何文本

信息技术如果有文本,它将返回它。我太专注于回报了,Obj。我想知道,如果形状中没有文本,为什么它不返回空文本或null。无论如何,关于这个问题的所有其他答案都非常有用,它们引导我找到我的问题

一如既往,我来找出.Text返回Obj的原因是形状中没有任何文本。如果有文本,它将返回它。我太专注于回报了,Obj。我想知道,如果形状中没有文本,为什么它不返回空文本或null。无论如何,关于这个问题的所有其他答案都非常有用,它们引导我找到我的问题

我用实际代码对我的问题进行了更新。我已经在c中签下了所有这些内容。库中只有一个项目不存在。itemu@jediderek如果互操作库中有get_Item方法,请使用该方法。@Mat'smugh.ItemU是get_Item方法。是的,COM互操作是脆弱的,您应该更喜欢使用getter方法,而不是索引器和属性。@Mat'sMug您能推荐一个更好的库吗?我用实际代码对我的问题进行了更新。我已经在c中签下了所有这些内容。库中只有一个项目不存在。itemu@jediderek如果互操作库中有get_Item方法,请使用该方法。@Mat'smugh.ItemU是get_Item方法。是的,COM互操作是脆弱的,您应该更喜欢使用getter方法,而不是索引器和属性。@Mat'smugh您会推荐一个更好的库吗?您所说的有道理,但遗憾的是对我不利。我试着创建一个第二个形状的对象,就像你的例子一样,并尝试抓取文本,但结果仍然相同。我还尝试了其他一些方法,使用你提供的信息,以及将其转换为动态/字符串。我不知道这是什么,但突然之间这一切都起作用了。以前不起作用,但现在起作用了。可能是放错了括号。你说的有道理,但遗憾的是对我不起作用。我试着创建一个第二个形状的对象,就像你的例子一样,并尝试抓取文本,但结果仍然相同。我还尝试了其他一些方法,使用你提供的信息,以及将其转换为动态/字符串。我不知道这是什么,但突然之间这一切都起作用了。它以前不起作用,但现在起作用了。可能是放错了括号。这意味着,您的形状有字段。这是我的第3项,字段。使用shape.Characters.Text检查Visio文档中的字段。这意味着您的形状具有字段。这是我的第3项,字段。使用shape.Characters.Text检查Visio文档中的字段。