升级到XE8后,我们的一些项目开始破坏数据.看起来像TList实现中的一个错误.
program XE8Bug1;
{$APPTYPE CONSOLE}
uses
System.SysUtils, Generics.Collections;
type
TRecord = record
A: Integer;
B: Int64;
end;
var
FRecord: TRecord;
FList: TList<TRecord>;
begin
FList := TList<TRecord>.Create;
FRecord.A := 1;
FList.Insert(0, FRecord);
FRecord.A := 3;
FList.Insert(1, FRecord);
FRecord.A := 2;
FList.Insert(1, FRecord);
Writeln(IntToStr(FList[0].A) + IntToStr(FList[1].A) + IntToStr(FList[2].A));
end.
Run Code Online (Sandbox Code Playgroud)
此代码在XE7和之前(应该是)打印"123",但在XE8中打印"120".也许有人知道这个的quickfix?
更新:非正式修复在这里
假设我希望禁用XE8中引入的新集成的Castalia.我该如何以干净的方式做到这一点?我在Castalia菜单上看不到任何允许我通过设置一个选项来禁用它的内容.
人们可能希望禁用Castalia的原因包括:
Delphi XE8编辑器具有视觉提示,以便您知道哪个begin与哪个相关end.在我们的团队中,我们总是将惯例begin与owner子句放在同一行.
有没有办法让视觉提示与相应的对齐end而不是它begin?

更新:此问题似乎在Delphi Seattle 10中得到修复.
我正在编写一个Delphi包,该包提供了一个新的自定义TGraphic对象,从而允许在VCL组件(如TImage)中读取新的图像格式。
我最初使用RAD Studio XE7开发了此程序包,并且运行良好。但是,我最近迁移到了RAD Studio编译器的较新版本,尽管我的软件包在该新版本上仍能正常工作,但我注意到一个从未出现过的奇怪错误。
我有一个包含多个组件的表单,其中一些是TImage组件。打开IDE之后,我在设计时第一次打开项目时,所有包含我的自定义TGraphic组件的TImage组件都会立即释放其内容。如果我关闭然后重新打开该项目,图像将重新出现,并且在我关闭并重新打开IDE之前该错误不再发生。
我挖了我的代码以了解可能导致此问题的原因。要注册我的自定义TGraphic组件,我使用类初始化部分,在其中编写了以下代码:
initialization
begin
Vcl.Graphics.TPicture.RegisterFileFormat('svg', 'Scalable Vector Graphics', TWSVGGraphic);
end;
Run Code Online (Sandbox Code Playgroud)
但是我发现,从XE8编译器版本开始,在初始化部分之前就调用了TImage构造函数,因此显然引起了上述问题。自XE8以来的所有编译器版本均会受到影响,但是此错误从未在XE7或更早版本上发生。自XE8以来,情况发生了变化。
这是我的问题:
请参阅以下步骤以重现.适用于XE2,但不适用于XE8.
TButton和一个TOpenDialogOnClick事件调用中OpenDialog1.Execute使用XE8订阅更新1(Windows从8.1升级到10)进行测试
有谁知道TOSVersion.Name是否仍适用于Windows 10?
我有一个vcl应用程序,它有一个表单show事件,它获取操作系统的详细信息,并使用SysUtils的TOSVersion记录在TMemo框中显示它们.
with mmoOSInfo.Lines do
begin
Clear;
Add(TOSVersion.ToString);
Add('');
Add('Architecture: ' + OSArchitectureToStr(TOSVersion.Architecture));
Add('Platform: ' + OSPlatformToStr(TOSVersion.Platform) +
IntToStr(PlatformFromPointer));
Add('Build: ' + IntToStr(TOSVersion.Build));
Add('Major: ' + IntToStr(TOSVersion.Major));
Add('Minor: ' + IntToStr(TOSVersion.Minor));
Add('Name: ' + TOSVersion.Name);
Add('Service Pack - Major: ' + IntToStr(TOSVersion.ServicePackMajor));
Add('Service Pack - Minor: ' + IntToStr(TOSVersion.ServicePackMinor));
end;
Run Code Online (Sandbox Code Playgroud)
代码在XP上没有任何问题执行(是的我们仍在使用它(羞愧地停下来)),Vista,Windows 7,Windows 8.1,台式电脑,笔记本电脑和Surface Pro,但在Windows 10上安装时却没有.
当我使用paserver调试时,TOSVersion.Name返回为:='Windows 8'.我做错了什么,或者我期望TOSVersion能够检测到Windows 10?没有例外被触发.在我可以访问的2台Windows 10机器中,一条迁移路径来自Windows 8.1,另一条迁移路径来自Windows 7.
非常感谢
我在Delphi XE8中有一个类的以下声明:
TestClass = class;
TestClass = class
function test<T: TestClass>(supplier: TFunc<T>): T; // Compiler error
end;
Run Code Online (Sandbox Code Playgroud)
这会抛出以下编译器错误:
E2086 Type 'TestClass' is not yet completely defined
Run Code Online (Sandbox Code Playgroud)
当我在混合中添加另一个类并将其作为约束使用时,它可以正常工作:
AnotherTestClass = class
end;
TestClass = class;
TestClass = class
function test<T: AnotherTestClass>(supplier: TFunc<T>): T; // No Error
end;
Run Code Online (Sandbox Code Playgroud)
我怀疑问题是前向类型声明没有告诉Delphi足够的TestClass类型.这可能更明显,因为以下尝试解决该问题会在不同的行上抛出相同的编译器错误:
TestClass = class;
AnotherTestClass = class (TestClass) // Compiler Error
end;
TestClass = class
function test<T: AnotherTestClass>(supplier: TFunc<T>): T;
end;
Run Code Online (Sandbox Code Playgroud)
我做错了什么,如果没有,是否有解决这个问题的方法?
delphi generics forward-declaration type-constraints delphi-xe8
Delphi应用程序网络共享管理器保留2020-2039范围内的20个端口,以启动其通信线程.我想知道当第21个应用程序在同一台计算机上启动时会发生什么.事实证明,这个应用程序只是挂起无响应,直到它被杀死,我还没有找到一种方法来优雅地终止它.
要重现,只需将TTetheringManager和TTetheringProfile放在空表单上,将配置文件连接到Manager,编译,在IDE外部启动应用程序20次,最后在IDE中启动第21个实例.
这是我到目前为止所发现的:
在System.Tether.NetworkAdapter:procedure TTetheringNetworkManagerCommunicationThread.Execute ; 一个ETetheringException.Create(SManagerNetworkCreation)时,无论是TCP或UDP的通信服务器不能启动被升高.到现在为止还挺好.
此异常显示在调试器中.当我继续并逐步执行以下代码时,应用程序最终挂起在System:function AcquireExceptionObject中,并且永远不会返回.
由于在Application.Run期间引发了应用程序,我试图通过以下方式捕获异常:
try
Application.Run;
except
ShowMessage('Something went terribly wrong!');
end;
Run Code Online (Sandbox Code Playgroud)
但这没用.有关我如何捕获(或阻止)此异常的任何建议?
我正在使用Delphi XE8.
我只是看REST.Json ObjectToJsonString()和JsonToObject()电话.
主要是尝试做这样的事情:
我注意到,当他们开始使用F角色时,我只能让变量工作.我找不到任何关于此的文件.这是预期的行为吗?我应该F在开始时使用a命名我的类中的所有变量吗?如果是,有人可以解释原因吗?
我创建了一个类TTestJSON并定义了两个成员变量并将它们设置为'WORKS'和'FAILS'.
然后我从对象创建了一个JSON字符串值:
{
"varThatWorksBeacuseItStartsWithF":"WORKS",
"sVarThatFailsBecauseItStartsWithS":"FAILS"
}
Run Code Online (Sandbox Code Playgroud)
从JSON字符串返回到对象时,只有fVarThatWorksBeacuseItStartsWithF正确地重置变量.在下面的代码中,test := TJson.JsonToObject<TTestJSON>(JsonStr);使用上面的JSON,注意sVarThatFailsBecauseItStartsWithS是""和否"FAILS".
procedure TForm3.btn1Click(Sender: TObject);
var
test : TTestJSON;
JsonStr : String;
begin
m1.Clear;
test := TTestJSON.Create;
try
test.fVarThatWorksBeacuseItStartsWithF := 'WORKS';
test.sVarThatFailsBecauseItStartsWithS := 'FAILS';
JsonStr := TJson.ObjectToJsonString( test );
finally
test.Free;
end;
m1.Lines.Add( '** JSONStr Value START **' + #13#10 + JsonStr + '** JSONStr Value …Run Code Online (Sandbox Code Playgroud) 我是delphi XE8的新手.我有以下代码来自我的delphi版本6,我想在delphi XE8中运行它.
1. function UTF8ToStringLen(const src: PChar; const Len: Cardinal): widestring;
2. var
3. l: Integer;
4. begin
5. SetLength(Result, Len);
6. if Len > 0 then
7. begin
8. l := MultiByteToWideChar( CP_UTF8, 0, src, Len, PWChar(Result), Len*SizeOf(WideChar)); <--error
9. SetLength(Result, l);
10. end;
11. end;
12.
13.
14. function StringToUTF8Len(const src: PChar; const Len: Cardinal): string;
15. var
16. bsiz: Integer;
17. Temp: string;
18. begin
19. bsiz := Len * 3;
20. SetLength(Temp, bsiz);
21. if …Run Code Online (Sandbox Code Playgroud) delphi ×10
delphi-xe8 ×10
generics ×2
windows-10 ×2
components ×1
exception ×1
json ×1
registration ×1
rest ×1
tethering ×1
timage ×1
tlist ×1
topendialog ×1
vcl ×1
vcl-styles ×1