Delphi 7 with..do语句不能使用variablesvariables

我正在通过Delphi 7与Microsoft Excel。它工作正常,但格式化行和范围,我不得不写这样的长string。

XLApp.Workbooks[1].WorkSheets[NameDoc].Range['A19:L19'].Font.Bold := true; 

所以我想摆脱艰苦的工作,并通过像这样的“… ..”声明来做到这一点

 with XLApp.Workbooks[1].WorkSheets[NameDoc] do begin Range['A19:L19'].Font.Bold := true; end; 

但在汇编阶段,我看到这个错误

 Record, object or class type required 

在string上 – “with..do”。

我用这种方法创buildExcel对象

 XLApp: Variant; XLApp := CreateOleObject('Excel.Application'); 

我认为,.. do语句doesen不适用于variablestypesvariables,但我想知道我是否正确? 如果我是对的,有什么解决办法,使其工作?

variables可以是任何东西或什么都不是 – 编译器不知道它,也不知道:它被称为“dynamictypes的值”。 由于它不知道 – 它不知道是否会有任何成员(属性,方法),如果有的话 – 他们会有什么名字。

为了获得强大的编译时input的好处 – 包括使用但不仅仅是 – 你必须使用接口variables,由TExcelApplication组件提供的那些接口variables和具有那些“静态typerd”值的底层单元 – 从而提供给Delphi编译器编译时知道值types,在运行之前。 有很多types,如iWorsksheet,iRange和其他单位。

但是,由于这是关于引用计数和生命周期,我build议你去显式使用临时variables,而不是使用with和隐式的不可见variables。 由于你无法控制他们的寿命和清除率,你以后可能会在一些意想不到的地方撞墙。 我做了。

 var tmpR: iRange; // assuming we have statically-typed API // for example - providing we using ExcelXP or Excel2000 unit tmpR := XLApp.Workbooks[1].WorkSheets[NameDoc]; tmpR.Range['A19:L19'].Font.Bold := true; // instead of with with tmpR do // also possible but gives little benefit now begin // when we made a dedicated temp var Range['A19:L19'].Font.Bold := true; end; tmpR := nil; // crucial unless the most short and simplistic functions // just release hold on Excel's object - let it manage its memory freely, // by letting Excel know your program no more uses that object. 

还读

可以with Variant一起使用吗?

没有。

你可以在编译时使用其成员已知的types。 但变种,为此. 运算符在运行时进行评估,不属于这一类。 因此with不适用于变体。

文件说,我的重点是:

with语句是引用logging的字段或对象的字段,属性和方法的简写。 with语句的语法是:

 with obj do statement 

要么:

 with obj1, ..., objn do statement 

其中obj是产生对logging,对象实例,类实例,接口或类types(元类)实例的引用的expression式,并且语句是任何简单的或结构化的语句。