标签: delphi-xe3

Delphi XE2 RTTI坏了吗?

我最近从D2010迁移到了DXE2,并在XE2和XE3(在我的朋友XE3中测试)中发现了与类内TBytes字段的RTTI生成相关的showstopper bug(或功能?).

我发现从不生成类中TBytes变量的RTTI信息.

以下代码在D2010中运行良好,但在XE2/XE3中显示消息"Error"

有没有人有任何线索?这将彻底打破我们所有的软件数据序列化实现

要测试代码,请将Rtti单位添加到使用声明中

type

  TMyClass = class
  public
    Field1: Integer;
    Field2: TBytes;
  end;


procedure TForm2.Button1Click(Sender: TObject);
var
  i: Integer;
  Data: TMyClass;
  Rtti: TRttiContext;
  RttiClassType: TRttiInstanceType;
begin

  Data := TMyClass.Create;
  try

    // Get the context
    Rtti := TRttiContext.Create;
    try

      // Get the type for the class
      RttiClassType := TRttiInstanceType(Rtti.GetType(Data.ClassInfo));

      // Check the fields
      for i := 0 to High(RttiClassType.GetFields) do
      begin

        // Check the field type
        if not Assigned(RttiClassType.GetFields[i].FieldType) then
          ShowMessage('Error');

      end;

    finally
      Rtti.Free;
    end;

  finally
    Data.Free;
  end; …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-2010 delphi-xe2 delphi-xe3

12
推荐指数
2
解决办法
1270
查看次数

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

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

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

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

编辑:HotImage是索引0.

delphi timagelist delphi-xe3

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

11
推荐指数
1
解决办法
1507
查看次数

如何在Delphi Docking示例中添加持久性

虽然我知道,除了包括德尔福对接演示还有其他更好的对接库,提供如开发快递库JVCL对接库,但对于具体的示范项目,我仅限于只使用Delphi的内置功能(尽管存在一些明显的缺陷).

我的问题涉及为对接状态添加持久性.我从检查Controls.pas看到,TDockTree是默认的Dock管理器,它有Stream I/O例程.在SO和各种论坛上挖掘,虽然我无法看到有人称这些例程.我已经尝试从相关的Create和OnDrop事件加载并保存到一个文件,但是我在黑暗中刺伤.我很高兴保存和恢复表单大小和状态,但我正在努力解决我应该保存的概念.任何善良的人都会给我一个起点吗?

我正在使用Delphi XE3,所以所有(?)的东西都是可能的!

非常感谢.

delphi persistence docking delphi-xe3

11
推荐指数
1
解决办法
791
查看次数

如何删除MDI客户端窗口的凹陷内边缘?

前几天,我开始开发我的新项目.应该有一个MDI表格,上面有一些子表格.但是当我开始开发时,我遇到了以下问题:当主窗体变为MDI形式时,它会在内部绘制一个可怕的边框(斜角).我不能把它带走.您可以在屏幕截图中看到这种情况:

http://s18.postimg.org/k3hqpdocp/mdi_problem.png

相反,MDI-Child表单没有相同的斜角.

该项目包含两种形式,Form1和Form2.Form1是主要的MDI形式.

Form1源代码:

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 346
  ClientWidth = 439
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  FormStyle = fsMDIForm
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
end
Run Code Online (Sandbox Code Playgroud)

Form2源代码:

object Form2: TForm2
  Left = 0
  Top = 0
  Caption = 'Form2'
  ClientHeight = 202
  ClientWidth = 331
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = …
Run Code Online (Sandbox Code Playgroud)

delphi mdi delphi-xe3

11
推荐指数
1
解决办法
2161
查看次数

如何在特定的本地时间运行Delphi Win32应用程序?

我有一个Delphi程序,在午夜运行时会出现错误行为.为了制作可重现的测试用例,我必须在午夜之前将系统的本地时间更改为某个时间,运行程序一段时间,检查错误并切换回来.虽然这肯定可以手动完成,但我有问题要自动进行测试.

是否有可能在不改变系统时间的情况下为应用程序提供特殊时间?这可以来自程序外部甚至内部.

虽然这可能是一般的Windows问题,但我使用Delphi标记它,因为使用Delphi的任何解决方案都很好,而在这种情况下,其他一些编程环境也没用.

windows delphi time delphi-xe3

11
推荐指数
1
解决办法
644
查看次数

如何可靠地等待刚刚创建的线程?

考虑以下程序:

program TThreadBug;
{$APPTYPE CONSOLE}

uses
  SysUtils, Classes, Windows;

type
  TMyThread = class(TThread)
  protected
    procedure Execute; override;
  end;

procedure TMyThread.Execute;
var
  i: Integer;
begin
  for i := 1 to 5 do begin
    Writeln(i);
    Sleep(100);
  end;
end;

procedure UseTThread;
var
  Thread: TMyThread;
begin
  Writeln('TThread');
  Thread := TMyThread.Create;
  Thread.Terminate;
  Thread.WaitFor;
  Thread.Free;
  Writeln('Finished');
  Writeln;
end;

procedure UseTThreadWithSleep;
var
  Thread: TMyThread;
begin
  Writeln('TThreadWithSleep');
  Thread := TMyThread.Create;
  Sleep(100);
  Thread.Terminate;
  Thread.WaitFor;
  Thread.Free;
  Writeln('Finished');
  Writeln;
end;

begin
  UseTThread;
  UseTThreadWithSleep;
  Readln;
end.
Run Code Online (Sandbox Code Playgroud)

输出是:

TThread
Finished

TThreadWithSleep
1
2 …

delphi delphi-xe3

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

使用初始化部分进行模块注册是个好主意吗?

我正在为分散式模块注册寻找一个好的解决方案.

我不想要一个使用项目所有模块单元的单元,但我宁愿让模块单元自己注册.

我能想到的唯一解决方案就是依赖initializationDelphi单元.

我写了一个测试项目:

单元2

TForm2 = class(TForm)
private
  class var FModules: TDictionary<string, TFormClass>;
public
  class property Modules: TDictionary<string, TFormClass> read FModules;
  procedure Run(const AName: string);
end;

procedure TForm2.Run(const AName: string);
begin
  FModules[AName].Create(Self).ShowModal;
end;

initialization
  TForm2.FModules := TDictionary<string, TFormClass>.Create;

finalization
  TForm2.FModules.Free;
Run Code Online (Sandbox Code Playgroud)

UNIT3

TForm3 = class(TForm)

implementation

uses
  Unit2;

initialization   
  TForm2.Modules.Add('Form3', TForm3);
Run Code Online (Sandbox Code Playgroud)

UNIT4

TForm4 = class(TForm)

implementation

uses
  Unit2;

initialization   
  TForm2.Modules.Add('Form4', TForm4);
Run Code Online (Sandbox Code Playgroud)

这有一个缺点.是否保证我的注册单元(在本例中为Unit2s)initialization部分始终先运行?

我经常阅读关于initialization部分的警告,我知道我必须避免在其中引发异常.

delphi module delphi-units initialization-order delphi-xe3

10
推荐指数
3
解决办法
4966
查看次数

尝试编译此代码会导致IDE终止或编译器无法运行,这是一个错误吗?

注意Exit内联函数中的命令用法!我一直在这里使用Delphi XE3.

症状

在某些情况下,当呼叫到包含一个内联函数取得Exit命令,并返回值的内联函数的用于直接WriteLn(),编译器报告的错误消息,

"dcc"退出代码1.

甚至最糟糕的是,Delphi IDE在没有任何确认的情况下终止.

function ProcessNumber(const iNumber: Integer): Boolean; inline;
begin
  if iNumber = 0 then begin
    Result := False;
    Exit;
  end;
  // some code here ...
  Result := True;
end;

procedure Test;
begin
  writeln( ProcessNumber(0) );
end;

begin
  Test;
  ReadLn;
end.
Run Code Online (Sandbox Code Playgroud)

但是,如果内联函数的返回值存储在变量中,然后使用该变量WriteLn(),则不会发生该问题.

procedure Test;
var
  b: Boolean;
begin
  b := ProcessNumber(0);
  writeln(b);
end;
Run Code Online (Sandbox Code Playgroud)

问题

  1. 这是编译器错误吗?
  2. 如果这是一个错误,是否有解决方法安全退出内联函数?

delphi delphi-xe3

10
推荐指数
1
解决办法
370
查看次数

Delphi中的泛型是否会导致性能瓶颈?

最近我一直在开发一个应用程序,并希望拥有几种类型的集合.我不想为它的类型声明和实现一个新的集合类.因此,我考虑使用泛型,但不确定泛型与普通类型实例相比的性能.性能是我正在关注的主要事情.我的应用程序是时间关键的,甚至减少几百毫秒也是不可取的.

我正在使用Delphi XE3

例如:

ICollectionItem = interface
  function GetID : string;
  property ID : string read GetId;
end;

TGenericCollection<T: ICollectionItem> = class
  function Add(T) : Integer;
end;
Run Code Online (Sandbox Code Playgroud)

相比

TSomeClass = class(TInterfacedObject, ICollectionItem)
  function GetId : string;
end;

TSomeClassList = class
  function Add(item : TSomeClass) : Integer;
end;
Run Code Online (Sandbox Code Playgroud)

delphi generics delphi-xe3

9
推荐指数
1
解决办法
1256
查看次数