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和其他单位。
- Borland Delphi 7 TExcelApplication.Connect适用于办公室机器,但不适用于客户端
- http://www.delphipages.com/forum/showthread.php?t=157889
- http://delphikingdom.ru/asp/viewitem.asp?catalogid=1270
但是,由于这是关于引用计数和生命周期,我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式,并且语句是任何简单的或结构化的语句。