1

我正在使用 C++/CLI 和 .Net 自动创建 PowerPoint。我的幻灯片上有一个文本框,想添加文本,但每次都出现构建错误。这是我的代码:

System::String^ hi = "hello";
slides[1]->Shapes[1]->TextFrame->TextRange->Text::set(hi);

构建错误是这样的:

error C2653: 'Text' : is not a class or namespace name

我已经查看了错误,但似乎无法弄清楚我做错了什么。如果我要使用 C#,我似乎会这样做:

TextRange.Text = "Hello";

所以我试着做:

TextRange->Text = "Hi";

但它引发了以下构建错误:

error C3293: 'Text': use 'default' to access the default property (indexer) for class 'Microsoft::Office::Interop::PowerPoint::TextRange'

我将如何设置文本?Text根据 MSDN,C++ 中的语法是:

public:
property String^ Text {
String^ get ();
void set (String^ value);
}
4

1 回答 1

4

默认属性有相当长的麻烦历史。它们提供了很好的语法糖,您不必命名它们,但由于它们可能产生歧义,它们会导致牙齿腐烂。VBA 中使用 Set 关键字的原因。如果使用 Set 则分配 TextRange 属性,如果不使用或使用 Let 则分配默认属性。

.NET 也支持默认属性,但通过要求默认属性接受参数来消除语法歧义。这解决了歧义,如果参数存在,编译器可以告诉您您的意思是默认属性。这样的属性称为“索引器”。List<> 类就是一个很好的例子,索引器被记录为“Item”属性,但您实际上并没有写出它的名称。您使用类似的语法list[0]来索引第一项。非常方便,它允许您在代码中将列表视为数组。

PowerPoint TextRange::Text 属性会引起问题,因为它是 TextRange 接口的默认属性,但不参数。因此,您不能使用“文本”,因为它是默认属性名称,并且您也不能省略它,因为它不是索引器。就像错误消息所说的那样修复它,使用default关键字:

System::String^ hi = "hello";
slides[1]->Shapes[1]->TextFrame->TextRange->default = hi;
于 2013-06-13T18:23:41.293 回答