标签: delphi-xe3

在XE3中使用自动更新进行实时绑定(无需像在XE2中那样调用Notify())

我目前正在使用Delphi XE2,并听说他们在XE3中使用自动更新进行新的Live Binding(无需像XE2那样调用Notify()).

在C#或Delphi XE2中我们必须实现INotifyPropertyChanged(Notify();在Delphi中),这种方法确实有意义,因为我们可以完全控制要更新的内容以及何时更新它,这样我们就可以轻松调整性能并实现虚拟化.

但我只是想知道它是如何工作的,它们为实现它做了什么样的机制,我不知道它们是如何做到的,以下是可能用于实现自动更新的假设.

  1. 计时器:计时器经常打勾并刷新所有数据

    性能非常慢没有虚拟化

  2. 编译器级别功能:notify() events编译器自动执行的所有相关代码

    很多头脑

  3. 索姆其他方法:

请帮助我确定他们是如何实现它的.

我目前正在使用XE3试用版,因此我无法访问源代码,您的答案将帮助我决定是否切换到新功能.
我有一个类(集合项)有400个属性要绑定(并非所有时间都是这样),所以性能确实在我的应用程序的稳定性中发挥了重要作用.

delphi data-binding virtualization performance delphi-xe3

64
推荐指数
1
解决办法
1755
查看次数

在Delphi中创建可访问的UI组件

我试图从标准的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); …
Run Code Online (Sandbox Code Playgroud)

delphi accessibility delphi-2006 msaa delphi-xe3

20
推荐指数
2
解决办法
3868
查看次数

Delphi XE3:复杂的预构建事件的问题

我们目前正在从Delphi XE切换到Delphi XE3,我们的预构建事件存在严重问题.

我们的预构建事件如下所示:

  SubWCRev "<SVN-Path>" "<InputFile>" VersionInfo.rc
  brcc32 -foProject.res VersionInfo.rc
Run Code Online (Sandbox Code Playgroud)

(请注意,这两个命令出现在单独的行中;并且在我们的"真实"命令中包含绝对路径),即我们首先从工作副本中提取当前SVN版本,将此信息写入VersionInfo.rc然后使用Borland资源编译器生成资源文件.

这在以前的Delphi版本中完美运行,但每当我们在XE3中打开项目选项时,XE3会将其转换为:

  SubWCRev "<SVN-Path>" "<InputFile>" VersionInfo.rc &brcc32 -foProject.res VersionInfo.rc
Run Code Online (Sandbox Code Playgroud)

(请注意,这是一行,两个命令由单个&符号分隔).这会导致构建失败.

我们当前的解决方法是手动将其更改为

  SubWCRev "<SVN-Path>" "<InputFile>" VersionInfo.rc && brcc32 -foProject.res VersionInfo.rc
Run Code Online (Sandbox Code Playgroud)

即如果第一个命令成功,我们使用两个&符号来执行第二个命令.

这有效,但只有在我们再次编辑项目选项之前 - Delphi XE3总是弄乱预构建事件:-(

有人知道解决方案/解决方法吗?我想我们可以编写一个简单的命令行工具来调用SubWCRev和brcc32,但我更喜欢一个更简单的解决方案.

更新:轻松重现此错误的步骤

IDE

  • 文件 - >新建 - > VCL表单应用程序(Delphi)
  • 构建Project1
  • 文件 - >全部保存,保留建议名称Unit1.pas/Project1.dpr
  • 项目 - >选项
  • 选择目标"所有配置 - 所有平台"
  • 构建事件 - >预构建事件,输入此(两行,抱歉格式化):

    echo one> out.txt

    echo two >> out.txt

  • 从IDE构建项目

  • 保存并关闭项目

RAD Studio命令提示符

  • 导航到项目目录
  • msbuild Project1.dproj =>好的

IDE

  • 项目 - >选项
    • 点击"搜索路径"
      • 进入一个"
      • 删除"a" …

delphi delphi-xe3

16
推荐指数
1
解决办法
2332
查看次数

如何计算函数的经过时间?

我想知道如何计算Delphi中函数的消耗时间.

然后我想显示使用的时间并将其与另一个函数或组件进行比较,以便了解更快的函数.

delphi time function delphi-xe3

16
推荐指数
2
解决办法
2万
查看次数

我如何用接口的safecall函数方法进行RTTI调用?

我有这个测试程序https://gist.github.com/real-mielofon/5002732

  RttiValue := RttiMethod.Invoke(RttiInstance, [10]);
Run Code Online (Sandbox Code Playgroud)

和带接口的简单单元:

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.
Run Code Online (Sandbox Code Playgroud)

我有kaboom

result := aI+1;
Run Code Online (Sandbox Code Playgroud)

如果它是程序或不安全,那么它没关系:-(

delphi rtti delphi-xe2 delphi-xe3

15
推荐指数
1
解决办法
774
查看次数

Delphi XE3 EXE文件大小比Dephi 7大25倍

作为测试,我决定使用Delphi 4,5,6,7,2005,2010和XE3在Delphi中创建一个简单的"Hello world"应用程序.该应用程序只不过是一个TForm,一个带有OnClick事件的TButton调用ShowMessage('Hello world').

以下是关闭调试的每个最终EXE的结果:

EXE的文件大小

有人可以解释为什么XE3版本比之前版本的Delphi平均大26倍?

以下是我对XE3的项目设置:

设置1

设置2

delphi delphi-7 delphi-2010 delphi-xe delphi-xe3

15
推荐指数
2
解决办法
9452
查看次数

如何检查对程序的引用是否为零?

在以下示例中,调用将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 …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-xe3

15
推荐指数
1
解决办法
1388
查看次数

在Firemonkey中获取应用程序路径

所以在VCL中,可以使用以下代码行来检索应用程序路径:

ExtractFilePath(Application.ExeName)
Run Code Online (Sandbox Code Playgroud)

我尝试了同样的事情Firemokey,我注意到ExeName不再可用.我可以使用哪些代码作为替代方案?

delphi delphi-xe3 firemonkey-fm2

14
推荐指数
2
解决办法
2万
查看次数

如何检测没有焦点的控件中的修改键更改?

背景:

我正在研究一个从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;
Run Code Online (Sandbox Code Playgroud)

即使这不是检查CTRL按键是否被按下和释放的最佳方式(例如,由于现有的Shift状态参数),它可以按预期工作,控制具有焦点,甚至可以获得,但......

我的目标是当用户悬停控件时(或者确切地说,它内部的某个元素)更改鼠标光标,并且CTRL即使我的控件没有焦点也保持例如该键.可以说,所以只需覆盖MouseMove方法并在那里询问修饰符状态.这将是方式,但......

如果用户将鼠标光标停留在我的控件上并按下并释放该CTRL键,该怎么办?对于我的控制,这不会产生任何鼠标移动或按键事件,或者我错了?那么,我的问题很明显......

题:

如果控件没有焦点且用户没有用鼠标移动,如何检测修改键更改?我在想这两个选项,但我希望有一些我错过的东西:

  • 键盘钩 - 可靠,但看起来对我来说太过分了
  • 用定时器定期检查修改器状态 - 我不能忍受延迟

那么,您如何检测当前未关注的控件的修改键更改?

delphi winapi delphi-xe3

14
推荐指数
2
解决办法
2461
查看次数

如何禁用按钮中的闪烁图像?

我有一个Button链接到ImageList.我换ImageIndex了一个OnClickEvent.

现在,我得到的问题,当我改变imageOnClickEvent它的变化,但如果我在它移动我的鼠标就说明我老之一,是脉冲.

任何人都知道如何禁用此脉冲/闪烁/交换?

编辑:HotImage是索引0.

delphi timagelist delphi-xe3

12
推荐指数
1
解决办法
604
查看次数