标签: delphi-xe8

TList <T>中的Delphi XE8错误,需要解决方法

升级到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?

更新:非正式修复在这里

delphi generics tlist delphi-xe8

38
推荐指数
1
解决办法
3676
查看次数

如何在XE8中禁用Castalia?

假设我希望禁用XE8中引入的新集成的Castalia.我该如何以干净的方式做到这一点?我在Castalia菜单上看不到任何允许我通过设置一个选项来禁用它的内容.

人们可能希望禁用Castalia的原因包括:

delphi delphi-xe8

29
推荐指数
1
解决办法
8383
查看次数

如何配置新的Delphi XE8 Editor初始视觉提示?

Delphi XE8编辑器具有视觉提示,以便您知道哪个begin与哪个相关end.在我们的团队中,我们总是将惯例begin与owner子句放在同一行.

有没有办法让视觉提示与相应的对齐end而不是它begin

截图

更新:此问题似乎在Delphi Seattle 10中得到修复.

delphi delphi-xe8

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

Delphi-自XE8起如何正确注册图形类?

我正在编写一个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以来,情况发生了变化。

这是我的问题:

  • 我用来注册自定义图形类的方法是否正确?
  • 如果没有,正确的方法是什么?
  • 自XE8以来似乎有所不同,注册图形组件的新正确方式是什么?
  • 还有其他人遇到过同样的问题吗?他是如何解决的?
  • 这可能是RAD Studio的新错误,还是这个问题就在我这边?

delphi components timage registration delphi-xe8

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

右键单击TOpenDialog中的文件时,使用自定义样式会显示无效字符

请参阅以下步骤以重现.适用于XE2,但不适用于XE8.

  1. 创建一个新的VCL表单应用程序 - Delphi
  2. 在表格上放置一个TButton和一个TOpenDialog
  3. 在按钮OnClick事件调用中OpenDialog1.Execute
  4. 运行程序,打开文件对话框,右键单击文本文件=>显示菜单项确定
  5. 转到项目/选项/应用程序/外观.启用并选择自定义样式(例如"Ruby Graphite")并重新编译
  6. 运行程序,打开文件对话框,右键单击文本文件=>不正确显示菜单项(显示无效字符)

使用XE8订阅更新1(Windows从8.1升级到10)进行测试

delphi topendialog vcl-styles windows-10 delphi-xe8

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

在W10上检查Windows版本

有谁知道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 operating-system windows-10 delphi-xe8

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

在类声明中使用自己的类作为类型参数约束

我在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

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

Delphi XE8在应用程序启动时正常处理ETetheringException

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 exception tethering delphi-xe8

8
推荐指数
1
解决办法
514
查看次数

Delphi Rest.JSON JsonToObject仅适用于f变量

我正在使用Delphi XE8.

我只是看REST.Json ObjectToJsonString()JsonToObject()电话.

主要是尝试做这样的事情:

如何将对象转换为JSON并返回一行代码

我注意到,当他们开始使用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 rest json vcl delphi-xe8

8
推荐指数
2
解决办法
8505
查看次数

不兼容的类型:'PAnsiChar'和'PWideChar'

我是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 delphi-xe8

8
推荐指数
1
解决办法
1万
查看次数