我目前正在使用Delphi XE2,并听说他们在XE3中使用自动更新进行新的Live Binding(无需像XE2那样调用Notify()).
在C#或Delphi XE2中我们必须实现INotifyPropertyChanged(Notify();在Delphi中),这种方法确实有意义,因为我们可以完全控制要更新的内容以及何时更新它,这样我们就可以轻松调整性能并实现虚拟化.
但我只是想知道它是如何工作的,它们为实现它做了什么样的机制,我不知道它们是如何做到的,以下是可能用于实现自动更新的假设.
计时器:计时器经常打勾并刷新所有数据
性能非常慢没有虚拟化
编译器级别功能:notify() events编译器自动执行的所有相关代码
很多头脑
索姆其他方法:
请帮助我确定他们是如何实现它的.
我目前正在使用XE3试用版,因此我无法访问源代码,您的答案将帮助我决定是否切换到新功能.
我有一个类(集合项)有400个属性要绑定(并非所有时间都是这样),所以性能确实在我的应用程序的稳定性中发挥了重要作用.  
我试图从标准的VCL TEdit控件中检索可访问的信息.get_accName()和Get_accDescription()方法返回空字符串,但get_accValue()返回输入TEdit的文本值.
我刚开始尝试了解MSAA,此时我有点迷失了.
我的TEdit是否需要具有可以向MSA公开的其他已发布属性?如果是这样,那就需要创建一个从TEdit下降的新组件,并添加其他已发布的属性,如"AccessibleName","AccessibleDescription"等......?
另外,请注意,我查看了应该可访问的VTVirtualTrees组件,但MS Active Accessibility Object Inspector仍然看不到AccessibleName已发布属性,即使在该控件上也是如此.
在这一点上,我感到茫然,并对此事的任何建议或帮助表示感谢.
...
interface
uses
   Winapi.Windows,
   Winapi.Messages,
   System.SysUtils,
   System.Variants,
   System.Classes,
   Vcl.Graphics,
   Vcl.Controls,
   Vcl.Forms,
   Vcl.Dialogs,
   Vcl.StdCtrls,
   Vcl.ComCtrls,
   Vcl.ExtCtrls,
   oleacc;
const
  WM_GETOBJECT = $003D; // Windows MSAA message identifier
  OBJID_NATIVEOM = $FFFFFFF0;
type
  TForm1 = class(TForm)
    lblFirstName: TLabel;
    edFirstName: TEdit;
    panel1: TPanel;
    btnGetAccInfo: TButton;
    accInfoOutput: TEdit;
    procedure btnGetAccInfoClick(Sender: TObject);
    procedure edFirstNameChange(Sender: TObject);
  private
    { Private declarations }
    FFocusedAccessibleObj: IAccessible;
    FvtChild: Variant;
    FAccProperties: TStringList;
    FAccName: string;
    FAccDesc: string;
    FAccValue: string;
    procedure DoGetAccessibleObjectFromPoint(aPoint: TPoint); …我们目前正在从Delphi XE切换到Delphi XE3,我们的预构建事件存在严重问题.
我们的预构建事件如下所示:
  SubWCRev "<SVN-Path>" "<InputFile>" VersionInfo.rc
  brcc32 -foProject.res VersionInfo.rc
(请注意,这两个命令出现在单独的行中;并且在我们的"真实"命令中包含绝对路径),即我们首先从工作副本中提取当前SVN版本,将此信息写入VersionInfo.rc然后使用Borland资源编译器生成资源文件.
这在以前的Delphi版本中完美运行,但每当我们在XE3中打开项目选项时,XE3会将其转换为:
  SubWCRev "<SVN-Path>" "<InputFile>" VersionInfo.rc &brcc32 -foProject.res VersionInfo.rc
(请注意,这是一行,两个命令由单个&符号分隔).这会导致构建失败.
我们当前的解决方法是手动将其更改为
  SubWCRev "<SVN-Path>" "<InputFile>" VersionInfo.rc && brcc32 -foProject.res VersionInfo.rc
即如果第一个命令成功,我们使用两个&符号来执行第二个命令.
这有效,但只有在我们再次编辑项目选项之前 - Delphi XE3总是弄乱预构建事件:-(
有人知道解决方案/解决方法吗?我想我们可以编写一个简单的命令行工具来调用SubWCRev和brcc32,但我更喜欢一个更简单的解决方案.
更新:轻松重现此错误的步骤
IDE
构建事件 - >预构建事件,输入此(两行,抱歉格式化):
echo one> out.txt
echo two >> out.txt
从IDE构建项目
RAD Studio命令提示符
IDE
我想知道如何计算Delphi中函数的消耗时间.
然后我想显示使用的时间并将其与另一个函数或组件进行比较,以便了解更快的函数.
我有这个测试程序https://gist.github.com/real-mielofon/5002732
  RttiValue := RttiMethod.Invoke(RttiInstance, [10]);
和带接口的简单单元:
unit Unit163;
interface
type
{$M+}
  ISafeIntf = interface
    function TestMethod(aI: integer): integer; safecall;
  end;
{$M-}
 type
   TSafeClass = class(TInterfacedObject, ISafeIntf)
   public
     function TestMethod(aI: integer): integer; safecall;
   end;
implementation
function TSafeClass.TestMethod(aI: integer): integer;
begin
  result := aI+1; // Exception !!
end;
end.
我有kaboom
result := aI+1;
如果它是程序或不安全,那么它没关系:-(
作为测试,我决定使用Delphi 4,5,6,7,2005,2010和XE3在Delphi中创建一个简单的"Hello world"应用程序.该应用程序只不过是一个TForm,一个带有OnClick事件的TButton调用ShowMessage('Hello world').
以下是关闭调试的每个最终EXE的结果:

有人可以解释为什么XE3版本比之前版本的Delphi平均大26倍?
以下是我对XE3的项目设置:


在以下示例中,调用将AssertTestObj()导致访问冲突.
Project InvokeTest2.exe引发异常类$ C0000005,并显示消息'0x00000000访问冲突:读取地址0x00000000'.
在调试时我可以看到Assigned(NotifyProc)测试中TSafeCall<T>.Invoke()没有按预期工作 - 因此Invoke()尝试执行NotifyProc哪个nil因此导致访问冲突.
任何想法为什么失败以及如何解决它?
program InvokeTest2;
{$APPTYPE CONSOLE}
uses
  System.SysUtils;
type
  TSafeCall<T> = class
  public
    type
      TNotifyProc = reference to procedure (Item: T);
    class procedure Invoke(NotifyProc: TNotifyProc; Item: T); overload;
  end;
  TOnObj = procedure (Value: String) of object;
{ TSafeCall<T> }
class procedure TSafeCall<T>.Invoke(NotifyProc: TNotifyProc; Item: T);
begin
  if Assigned(NotifyProc) then
    NotifyProc(Item);
end;
procedure AssertTestObj(OnExceptionObj_: TOnObj; Value_: String);
begin
  TSafeCall<String>.Invoke(OnExceptionObj_, Value_);
end;
begin
  try …所以在VCL中,可以使用以下代码行来检索应用程序路径:
ExtractFilePath(Application.ExeName)
我尝试了同样的事情Firemokey,我注意到ExeName不再可用.我可以使用哪些代码作为替代方案?
我正在研究一个从TCustomControl类派生的控件,它可以获得焦点,并且里面有一些内部元素.如果用户使用光标悬停它们,则可以突出显示这些内部元素,您可以选择它们,移动它们等等.现在问题......
如果用户持有或使用修饰符CTRL,我会使用(比如说)聚焦元素执行不同的操作.我想要的是如果用户悬停元素并保持例如键,则更改鼠标光标.非常简单,你只需覆盖和方法,并检查它们的参数是否等于.在这样的代码中:ALTSHIFTCTRLKeyDownKeyUpKeyVK_CONTROL
procedure TMyCustomControl.KeyDown(var Key: Word; Shift: TShiftState);
begin
  inherited;
  if Key = VK_CONTROL then
    Screen.Cursor := crSizeAll;
end;
procedure TMyCustomControl.KeyUp(var Key: Word; Shift: TShiftState);
begin
  inherited;
  if Key = VK_CONTROL then
    Screen.Cursor := crDefault;
end;
即使这不是检查CTRL按键是否被按下和释放的最佳方式(例如,由于现有的Shift状态参数),它可以按预期工作,控制具有焦点,甚至可以获得,但......
我的目标是当用户悬停控件时(或者确切地说,它内部的某个元素)更改鼠标光标,并且CTRL即使我的控件没有焦点也保持例如该键.可以说,所以只需覆盖MouseMove方法并在那里询问修饰符状态.这将是方式,但......
如果用户将鼠标光标停留在我的控件上并按下并释放该CTRL键,该怎么办?对于我的控制,这不会产生任何鼠标移动或按键事件,或者我错了?那么,我的问题很明显......
如果控件没有焦点且用户没有用鼠标移动,如何检测修改键更改?我在想这两个选项,但我希望有一些我错过的东西:
那么,您如何检测当前未关注的控件的修改键更改?
我有一个Button链接到ImageList.我换ImageIndex了一个OnClickEvent.
现在,我得到的问题,当我改变image与OnClickEvent它的变化,但如果我在它移动我的鼠标就说明我老之一,是脉冲.
任何人都知道如何禁用此脉冲/闪烁/交换?
编辑:HotImage是索引0.
delphi ×10
delphi-xe3 ×10
data-binding ×1
delphi-2006 ×1
delphi-2010 ×1
delphi-7 ×1
delphi-xe ×1
delphi-xe2 ×1
function ×1
msaa ×1
performance ×1
rtti ×1
timagelist ×1
time ×1
winapi ×1