我最近从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) 我有一个Button链接到ImageList.我换ImageIndex了一个OnClickEvent.
现在,我得到的问题,当我改变image与OnClickEvent它的变化,但如果我在它移动我的鼠标就说明我老之一,是脉冲.
任何人都知道如何禁用此脉冲/闪烁/交换?
编辑:HotImage是索引0.
虽然我知道,除了包括德尔福对接演示还有其他更好的对接库,提供如开发快递库和JVCL对接库,但对于具体的示范项目,我仅限于只使用Delphi的内置功能(尽管存在一些明显的缺陷).
我的问题涉及为对接状态添加持久性.我从检查Controls.pas看到,TDockTree是默认的Dock管理器,它有Stream I/O例程.在SO和各种论坛上挖掘,虽然我无法看到有人称这些例程.我已经尝试从相关的Create和OnDrop事件加载并保存到一个文件,但是我在黑暗中刺伤.我很高兴保存和恢复表单大小和状态,但我正在努力解决我应该保存的概念.任何善良的人都会给我一个起点吗?
我正在使用Delphi XE3,所以所有(?)的东西都是可能的!
非常感谢.
前几天,我开始开发我的新项目.应该有一个MDI表格,上面有一些子表格.但是当我开始开发时,我遇到了以下问题:当主窗体变为MDI形式时,它会在内部绘制一个可怕的边框(斜角).我不能把它带走.您可以在屏幕截图中看到这种情况:

相反,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程序,在午夜运行时会出现错误行为.为了制作可重现的测试用例,我必须在午夜之前将系统的本地时间更改为某个时间,运行程序一段时间,检查错误并切换回来.虽然这肯定可以手动完成,但我有问题要自动进行测试.
是否有可能在不改变系统时间的情况下为应用程序提供特殊时间?这可以来自程序外部甚至内部.
虽然这可能是一般的Windows问题,但我使用Delphi标记它,因为使用Delphi的任何解决方案都很好,而在这种情况下,其他一些编程环境也没用.
考虑以下程序:
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 …
我正在为分散式模块注册寻找一个好的解决方案.
我不想要一个使用项目所有模块单元的单元,但我宁愿让模块单元自己注册.
我能想到的唯一解决方案就是依赖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部分的警告,我知道我必须避免在其中引发异常.
注意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)
最近我一直在开发一个应用程序,并希望拥有几种类型的集合.我不想为它的类型声明和实现一个新的集合类.因此,我考虑使用泛型,但不确定泛型与普通类型实例相比的性能.性能是我正在关注的主要事情.我的应用程序是时间关键的,甚至减少几百毫秒也是不可取的.
我正在使用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 ×10
delphi-xe3 ×10
apng ×1
delphi-2010 ×1
delphi-units ×1
delphi-xe2 ×1
docking ×1
generics ×1
mdi ×1
module ×1
persistence ×1
png ×1
timagelist ×1
time ×1
windows ×1