我正在使用Delphi XE2,并且听说了他们在XE3中自动更新的新的Live Binding(不需要像在XE2中那样调用Notify())。 在C#或Delphi XE2中,我们必须在Delphi中实现INotifyPropertyChanged ( Notify(); ),这种方法确实很有意义,因为我们可以完全控制要更新的内容以及何时更新,以便我们可以微调性能和轻松实现虚拟化。 但是我只是想知道它是如何工作的,他们为了实现它而做了什么样的机制,我不知道他们是如何做到的,以下是可能用于实现自动更新的假设。 计时器:计时器经常打勾并刷新所有数据 性能非常低,没有虚拟化 编译器级别特性:编译器实现的所有notify() events相关代码都是自动神奇的 大量的头 索姆其他方法: 请帮我确定他们是如何实施它的。 我目前正在使用XE3试用,所以我没有访问源代码, 你的答案将帮助我决定是否切换到新function 。 我有一个具有400个属性的类(集合项)绑定(并不是所有的时候都是这样),所以性能在我的应用程序的稳定性中确实扮演着重要的angular色。
我已经使用需要C代码的Delphi XE6在Android上构build了一个应用程序。 但是在iOS上我无法使它工作。 我怀疑这个问题与arm/拇指状态有关,但我不确定。 从任何一个系统调用Pascal的C代码都没有问题。 但是,如果C代码callback一个Pascal过程,则iOS会生成一个"bad system call (12)" 这是pascal代码: function testarm(a,b:integer):integer; cdecl; external "testC.o"; Procedure testC; Begin testarm(1,2); end; function BackToPascal(a,b:integer): integer; cdecl; Begin result := a+b; end; …… exports BackToPascal; 这里是C代码: extern int BackToPascal(int a,int b); extern int testarm(int a,int b) { int i; i = BackToPascal(a,b); return i+1; } 在Android上,这是我如何编译(这是工作): …"arm-linux-androideabi-gcc.exe" -c […]
FmtBcd.pas在Delphi XE2中进行了大量修改。 在我的一个项目中,我有一个使用两个Bcd值的除法操作的例子,但是这两个版本产生不同的结果。 在最坏的情况下,Delphi XE2可能会抛出Bcd overflow error 。 示例:在Delphi XE2控制台应用程序中运行以下代码: var A, B, C, D: TBcd; begin A := StrToBcd('1'); B := StrToBcd('3'); BcdDivide(A, B, C); WriteLn(BcdToStr(C)); try BcdMultiply(C, C, D); WriteLn(BcdToStr(D)); except on E: Exception do WriteLn(E.Message); end; ReadLn; end. 以上的输出将是: 0.333333333333333333333333333333333333333333333333333333333333333 BCD overflow variablesC包含具有63位小数位的Bcd值。 对variablesC执行第二次BcdMultiply操作将导致Bcd overflow error 。 但是,在Delphi XE中运行相同的代码将得到以下结果,而不会有任何exception提示: 0.3333333333 0.11111111108888888889 任何人都可以请build议一个最佳实践的方法来解决这个问题?
假设你有一个菜单项和一个button来完成相同的任务。 为什么不好的做法是将任务的代码放到一个控件的action事件中,然后从另一个控件中调用该事件? delphi允许这与vb6一样,但realbasic不,并说你应该把代码放入一个方法,然后调用的菜单和button
我想要创build一个string跨越多行来分配给标签标题属性。 delphi如何做到这一点?
我已经开始将Webview接口转换为在Delphi中使用。 我设法加载webkit库,并调用接口方法似乎正常工作,但是,我似乎无法显示在主窗体上的Webview。 以下是我声明的接口 WebFrameClass = interface(NSObjectClass) ['{7BE750C8-DFEC-4870-851A-12DBCB0B78F6}'] end; WebFrame = interface(NSObject) ['{BCFA04BE-41AB-4B78-89C0-3330F12C7695}'] procedure loadRequest(request: NSURLRequest); cdecl; end; TWebFrame = class(TOCGenericImport<WebFrameClass, WebFrame>) end; WebViewClass = interface(NSViewClass) ['{0D9F44B7-09FD-4E35-B96E-8DB71B9A2537}'] {class} function canShowMIMEType(MIMEType: NSString): Boolean; cdecl; end; WebView = interface(NSView) ['{C36D8016-2FCB-49F0-BA1C-C9913A37F9AC}'] procedure clos; cdecl; procedure setHostWindow(hostWindow: NSWindow); cdecl; function initWithFrame(frame: NSRect; frameName: NSString; groupName: NSString): Pointer; cdecl; function mainFrame: […]
在Delphi 2009中,SysUtils.pas在第425行中包含这一点: EProgrammerNotFound = class(Exception); 这只是一个复活节彩蛋或严重的东西? 什么时候应该提出这个例外? 在Delphi Prism和/或Free Pascal中是否也存在? 问:这个exception类是否仍然在Delphi(现在是XE7)中声明? 答:是的,甚至有logging ! 指示软件故障的非标准方式。 您可以使用EProgrammerNotFound来替代指示运行时检测到的软件故障。
我在Delphi XE2中使用XML数据绑定向导。 该模式具有这种types的标签: <xs:element name="MyReport" type="MyReportType" /> <xs:complexType name="MyReportType"> <xs:all> <xs:element name="Header" type="HeaderType" /> <xs:element name="Values" type="ValuesType" /> <xs:element name="Events" type="EventsType" /> </xs:all> </xs:complexType> 问题是,如果我不向Value组添加任何元素,则不会有<Values> -tag,并且XML文件将无法通过XSD进行validation。 如果界面提供了一种“添加”Values-tag的方法,这可能不会成为问题。 有没有处理这个标准的方法,或者我正确地使用生成的代码? 简单地说 ,是否有任何方式,变通方法或其他方法,使用数据绑定向导中的代码来生成以下XML(在没有子节点时使用上述模式进行validation所需的),给定HeaderType ,ValuesType和EventsType是complexType: <MyReport> <Header /> <Values /> <Events /> </MyReport> (我知道还有其他类似的问题,比如<xs:sequence>生成的代码没有在最终的XML文件中强制执行正确的顺序,但至less对于这个问题,只需要在我仍然认为如果Embarcadero提供一个完整的界面,将会考虑更多这些function,那么这样做还是不错的。)
我是Delphi的新手,我一直在运行一些testing,以查看默认情况下初始化了哪些对象variables和堆栈variables: TInstanceVariables = class fBoolean: boolean; // always starts off as false fInteger: integer; // always starts off as zero fObject: TObject; // always starts off as nil end; 这是我习惯于其他语言的行为,但是我想知道在Delphi中依赖它是否安全? 例如,我想知道它是否可能依赖于编译器设置,或者可能在不同的机器上以不同的方式工作。 依赖于对象的默认初始化值是正常的,还是显式设置构造函数中的所有实例variables? 至于stack(procedure-level)variables,我的testing显示单位化的布尔值是真的,单位化的整数是2129993264,而未经初始化的对象只是无效的指针(即不是零)。 我猜的规范是在访问它们之前总是设置过程级别的variables?
不久前,我问了一个关于隐式接口variables的类似问题 。 这个问题的来源是我的代码中的一个错误,因为我没有意识到编译器创build的隐式接口variables的存在。 这个variables在拥有它的过程完成时已经完成。 这反过来造成了一个错误,由于variables的寿命比我预期的更长。 现在,我有一个简单的项目来说明编译器的一些有趣的行为: program ImplicitInterfaceLocals; {$APPTYPE CONSOLE} uses Classes; function Create: IInterface; begin Result := TInterfacedObject.Create; end; procedure StoreToLocal; var I: IInterface; begin I := Create; end; procedure StoreViaPointerToLocal; var I: IInterface; P: ^IInterface; begin P := @I; P^ := Create; end; begin StoreToLocal; StoreViaPointerToLocal; end. StoreToLocal按照您的想象进行编译。 局部variablesI (函数的结果)作为隐含的varparameter passing给Create 。 整理StoreToLocal可以调用IntfClear […]