标签: delphi-xe8

简单的DataSnap客户端和服务器应用程序中的Delphi XE8未知内存泄漏

我使用echostring和reversestring示例方法在Delphi XE8中使用向导创建了一个简单的DataSnap客户端/服务器应用程序.当我在服务器dpr中放入"ReportMemoryLeaksOnShutdown:= True"并从客户端调用echostring和/或reversestring方法时结果很好但是当我关闭服务器应用程序时(关闭客户端之后)我总是得到2个或更多的未知内存泄漏.这是一个我在互联网上找不到的已知错误,还是有解决方案?

服务器代码:

unit ServerMethodsUnit;

interface

uses System.SysUtils, System.Classes, System.Json,
Datasnap.DSServer, Datasnap.DSAuth, DataSnap.DSProviderDataModuleAdapter;

type
{$METHODINFO ON}
  TServerMethods = class(TDataModule)
  private
    { Private declarations }
  public
    { Public declarations }
    function EchoString(Value: string): string;
    function ReverseString(Value: string): string;
  end;
{$METHODINFO OFF}

implementation

{%CLASSGROUP 'FMX.Controls.TControl'}

{$R *.dfm}


uses System.StrUtils;

function TServerMethods.EchoString(Value: string): string;
begin
  Result := Value;
end;

function TServerMethods.ReverseString(Value: string): string;
begin
  Result := System.StrUtils.ReverseString(Value);
end;

end.
Run Code Online (Sandbox Code Playgroud)

DFM

object ServerContainer: TServerContainer
  OldCreateOrder = False
  Height = 271
  Width = 415 …
Run Code Online (Sandbox Code Playgroud)

delphi memory-leaks datasnap delphi-xe8

6
推荐指数
1
解决办法
1660
查看次数

Firemonkey中的Cleartype字体/文本呈现

这是一个仅包含TEdit控件的示例VCL应用程序.

VCL

如果您编译类似的Firemonkey(FMX)应用程序,您会注意到:

FMX

(小L字母疯狂地跳来跳去)

在我的研究中,我发现这个 G +帖子导致:

在此输入图像描述

如您所见,结果更好.

跳跃消失了.然而,TCircle的渲染效果并不理想.

经过一些研究后我发现使用 initialization GlobalUseDX := False;有更好的输出:

在此输入图像描述

偶尔还会有一些"信件跳跃",但这是一个更好的结果.然而,小L'(黄色)后面似乎有一些背景颜色.

有没有人知道使用最新的Firemonkey实现类似ClearType的字体渲染的更好方法?

delphi firemonkey delphi-xe8

6
推荐指数
0
解决办法
705
查看次数

Unicode字符串上的Length()vs Sizeof()

引用Delphi XE8帮助:

对于单字节和多字节字符串,Length返回字符串使用的字节数.UTF-8的示例:

   Writeln(Length(Utf8String('1¢'))); // displays 3
Run Code Online (Sandbox Code Playgroud)

对于Unicode(WideString)字符串,Length返回字节数除以2.

这引起了一些重要问题:

  1. 为什么处理上的差异根本就存在?
  2. 为什么Length()没有做它预期的事情,只返回参数的长度(如,元素的数量),而不是在某些情况下给出字节大小?
  3. 为什么它声明它将结果除以2(Unicode(UTF-16)字符串?AFAIK UTF-16最多为4字节,因此会产生错误的结果.

delphi delphi-xe8

6
推荐指数
1
解决办法
6132
查看次数

在 TChromium(Chromium 嵌入式)中使用打印为 PDF 文件?

在带有 TChromium (DCEF3) 的 Delphi XE7/XE8 中,我需要以编程方式将当前网页打印(即保存)到 PDF 文档文件(可选地无需用户交互)到预定义的本地路径。目前,我只能通过使用自定义 PDF 打印机驱动程序并以编程方式打开打印机对话框来间接执行此操作:

procedure TMainForm.btnPrintToPDF(Sender: TObject);
begin
  // open the printer dialog:
  crm.Browser.Host.Print;
end;
Run Code Online (Sandbox Code Playgroud)

然而,这有两个缺点:

  1. 我不能假设最终用户安装了 PDF 打印机驱动程序
  2. 最终用户必须在文件对话框中选择文件路径,而文件路径应该是预定义的。

但Chrome有一个内置的PDF打印机驱动程序和打印预览,可以通过键盘快捷键CTRL+P显示。但是,当我在guiclient TChromium 演示应用程序中按 CTRL+P 时,什么也没有发生,也没有像 Chrome 中那样显示打印预览。

那么如何在 TChromium 中调用 PDF 打印预览,并可能使用预设输出路径(不显示文件对话框)?

delphi pdf-generation chromium-embedded delphi-xe8

5
推荐指数
0
解决办法
1910
查看次数

如何将alignof转换为Delphi?

如何将alignof运算符转换为Delphi?我需要翻译

#define INET_IS_ALIGNED(Pointer, Type) \
   (((ULONG_PTR)Pointer & (__builtin_alignof(Type)-1)) == 0)
Run Code Online (Sandbox Code Playgroud)

delphi delphi-xe8

5
推荐指数
1
解决办法
196
查看次数

禁用Getit时,x64调试失败

我总是尝试禁用未使用的软件包以节省一些IDE内存.所以在XE8u1中我尝试通过在注册表中将"$(BDS)\ Bin\GetIt220.bpl"重命名为"_GetIt"来禁用GetIt(我从不使用它).之后GetIt按预期从工具中消失,但出现奇怪的问题:当我尝试调试x64应用程序时,我得到"断开连接的会话"窗口并且IDE挂起.x86调试按预期工作.所有其他包都启用为dafault.也许有人知道GetIt如何触及x64调试器?我很好奇.

delphi delphi-xe8

5
推荐指数
1
解决办法
210
查看次数

Delphi REST mac内存泄漏

我目前正在寻找一种方法来解决REST客户端的Mac实现中的明显内存泄漏问题.生成内存泄漏的代码如下(运行XE8,更新1):

program mac_REST_leak_test;
{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils, REST.Client, REST.Types, IPPeerClient;

var
   request : TRestRequest;
   ii, iMax : integer;
begin
   iMax := 1; 
   for ii := 0 to iMax do
   begin
      request := TRestRequest.Create(nil);
      // Fake Online REST API for Testing and Prototyping 
      request.Client := TRestClient.Create('http://jsonplaceholder.typicode.com/');
      request.Method := rmPOST;
      request.Execute();

      request.Client.Free();
      request.Free();
   end;
end.
Run Code Online (Sandbox Code Playgroud)

这是演示泄漏的最小代码块.从本质上讲,我有一个同步服务,每隔一段时间就会发出一次REST请求.

当我在Windows上运行它时,使用MadExcept,没有发现泄漏.检查ProcessMonitor中的运行进程表明没有增加使用的内存量.

但是,在Mac上运行时,活动监视器会显示分配给应用程序的内存继续上升.此外,当使用Instruments运行时,似乎存在泄漏处理mac上的几个URL和HTTP类.

有人知道如何解决这个漏洞吗?

(顺便说一句,确切知道泄漏来自Mac的确切位置真的很有帮助,但列出的唯一Delphi类是TMethodImplementationIntercept.我相信这是因为Delphi没有生成一个适用于Mac的dSYM文件.如果有人知道解决方法,那也很棒!)

更新 通过iMax从1到10 变化并比较FastMM4输出,似乎泄漏是在类中Macapi.ObjectiveC.TConvObjID.XForm.与1次迭代相比,10次迭代输出包含9次泄漏,其作为堆栈跟踪.我已将此报告给Embarcadero作为RSP-12242.

delphi rest macos memory-leaks delphi-xe8

5
推荐指数
1
解决办法
235
查看次数

如何用Move连接多个字符串?

如何使用Move连接字符串数组.我试过这个,但我无法想象如何让Move操作正常工作.

program Project2;

{$POINTERMATH ON}

procedure Concat(var S: String; const A: Array of String);
var
  I, J: Integer;
  Len: Integer;
begin
  Len := 0;
  for I := 0 to High(A) do
  Len := Len + Length(A[I]);

  SetLength(S, Length(S) + Len);

  for I := 0 to High(A) do
  Move(PWideChar(A[I])[0], S[High(S)], Length(A[I]) * SizeOf(WideChar));
end;

var
  S: String;
begin
  S := 'test';
  Concat(S, ['test', 'test2', 'test3']);
end.
Run Code Online (Sandbox Code Playgroud)

delphi delphi-xe8

5
推荐指数
1
解决办法
360
查看次数

Firemonkey:在带有 BorderStyle 的表单中使用时未显示 TWebBrowser 无

我在Delphi XE8中开发Firemonkey应用,发现如下情况:

我需要在一个小表单中显示一个小网页,其中只有一个 TWebBrowser 控件,Align:=Client 和 Form BorderStyle = None 但由于某种原因,在 Windows 中,表单显示为灰色,并且 TWebBrowser 未显示,如您在图片中看到的那样。在 Mac OS 中按预期工作。

如果我禁用了像 Minimize、Maximize 或 SystemMenu 这样的 BorderIcons 之一,也会发生这种情况。我已经尝试过 Delphi 10 和同样的问题。我曾尝试使用 TMS WebBrowser for Firemonkey (TMSFMXWebBrowser) 的试用版和同样的问题。

在 Win32 中使用 TWebBrowser 和 FormStyle = Single 的表单 在此处输入图片说明

在 Win32 中使用 TWebBrowser 和 FormStyle = None 的表单 在此处输入图片说明

在 Win32 中使用 TWebBrowser 和 FormStyle = Single 和 Maximize Button = False 的表单 在此处输入图片说明

在 Mac OS 中使用 TWebBrowser 和 FormStyle = Single 形成表单 在此处输入图片说明

有人知道原因以及我如何解决这个问题吗?我真的很想以一种没有任何边框/图标的形式显示网页,就像在 Mac OS 中一样。

delphi firemonkey delphi-xe8 delphi-10-seattle

5
推荐指数
1
解决办法
618
查看次数

TSpeedbutton 中的图像与 TImageList

我尝试使用 和 来创建TToolbar一个TActionList工具TSpeedbuttonTImageList
我使用了32px的方形图像,但是当我在TSpeedButton中通过ImageIndex选择图像时,图像大小小于32px,我认为是16px。

如何TSpeedButtons使用来设置图像的大小TImageList

这是一个 MVCE:

unit Unit50;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  System.Actions, FMX.ActnList, FMX.Controls.Presentation, FMX.StdCtrls,
  System.ImageList, FMX.ImgList;

type
  TForm50 = class(TForm)
    ActionList1: TActionList;
    ImageList1: TImageList;
    SpeedButton1: TSpeedButton;
    Action1: TAction;
  end;

var
  Form50: TForm50;

implementation
{$R *.fmx}
end.
Run Code Online (Sandbox Code Playgroud)

设计制造:

object Form50: TForm50
  Left = 0
  Top = 0
  Caption = 'Form50'
  ClientHeight = 480
  ClientWidth = 640
  FormFactor.Width = …
Run Code Online (Sandbox Code Playgroud)

delphi timagelist firemonkey delphi-xe8

5
推荐指数
1
解决办法
4979
查看次数