标签: delphi-10.1-berlin

释放具有MainForm作为所有者的表单是一个错误吗?

在我们现有的代码中,我们有一堆这样的表单,其中使用MainForm作为所有者(而不是nil)创建表单,但我们明确地释放它.

function SomeFunc(): Boolean;
var
  form: TMyForm; // subclasses TForm
begin
  with TMyForm.Create(Application.MainForm) do
    try
      ShowModal;
      Exit(True);
    finally
      Free;
    end
end;
Run Code Online (Sandbox Code Playgroud)

这会导致任何形式的错误或崩溃,还是安全的?

我似乎无法通过阅读文档来解决这个问题:

http://docwiki.embarcadero.com/Libraries/Berlin/en/System.Classes.TComponent.Owner

http://docwiki.embarcadero.com/Libraries/Berlin/en/System.Classes.TComponent.Create

delphi delphi-10.1-berlin

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

如何在文字上使用TExtendedHelper?

System.SysUtils.TShortIntHelper(和其他人)我可以写:

output := 5.ToString();
Run Code Online (Sandbox Code Playgroud)

将数字格式化5string.同样,有System.SysUtls.TExtendedHelper,但我无法编译:

output := (5.0).ToString();
Run Code Online (Sandbox Code Playgroud)

E2018:需要记录,对象或类类型

其他不起作用的版本:

  • 5.0.ToString()
  • (1.0+5.1).toString()
  • (5+0.).toString() (说E2029:')'预期但'''找到了)

实际工作的版本:

  • (1+5.1).toString()
  • (1.1+1+5.1).toString()
  • 5.9e0.toString()

如果声明了扩展值const,它也不起作用:

function TestFormat(): String;
const
  q = 5.5;
begin
  Result := q.ToString();
end;
Run Code Online (Sandbox Code Playgroud)

但它的定义是q : extended = 5.5;有效的.所以,我想知道为什么编译器会以这种方式运行.

delphi class-helpers delphi-10.1-berlin

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

FireDac冻结了GUI

我正在Delphi 10.1 Berlin下使用FireDac.

为了向用户显示数据,我使用像TDBEdit这样的数据感知控件.

我使用TFDQuery和TDataSource将它们与控件链接起来.

这有效,但需要一些时间来执行的长sql查询将冻结GUI.

我想知道如何在执行那些长时间运行的查询时阻止gui冻结.

我在考虑背景线程.

在维基上,我读到FireDac可以使用多线程:http://docwiki.embarcadero.com/RADStudio/XE6/en/Multithreading_(FireDAC )

然而,在Embarcadero的社区论坛线程杰夫Overcash写道:

我没有看到的一件事或德米特里提到的是你不能在背景线程查询中使用TDataSource或LiveBindings.如果您是后台线程,则显示结果的查询应断开LB或DataSource,打开并获取所有数据,然后重新建立连接.

这两个将尝试将光标移动到您或查询缓冲区以显示,而缓冲区非常易变,在另一个线程中移动.

我想知道是否有人也使用FireDac并在表单上显示值可以帮助我在这里.

delphi concurrency firedac delphi-10.1-berlin

4
推荐指数
1
解决办法
992
查看次数

循环遍历大记录的TList时出现长时间延迟

我在Windows 10中使用Delphi 10.1 Berlin.

我有两个不同大小的记录.我编写代码来遍历其中两个TList<T>记录来测试经过的时间.循环遍历较大记录的列表运行速度要慢得多.

任何人都可以解释原因,并提供一个解决方案,使循环运行更快?

type
  tTestRecord1 = record
    Field1: array[0..4] of Integer;
    Field2: array[0..4] of Extended;
    Field3: string;
  end;

  tTestRecord2 = record
    Field1: array[0..4999] of Integer;
    Field2: array[0..4999] of Extended;
    Field3: string;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  _List: TList<tTestRecord1>;
  _Record: tTestRecord1;
  _Time: TTime;
  i: Integer;
begin
  _List := TList<tTestRecord1>.Create;

  for i := 0 to 4999 do
  begin
    _List.Add(_Record);
  end;

  _Time := Time;

  for i := 0 to 4999 do
  begin
    if _List[i].Field3 = 'abcde' then
    begin …
Run Code Online (Sandbox Code Playgroud)

delphi record tlist delphi-10.1-berlin

4
推荐指数
1
解决办法
240
查看次数

是否可以单独根据BPL/DCP构建针对BPL/DCP的EXE项目,其中"Build With Runtime Packages"未经检查?

我有一个BPL项目(有一些基础东西)和一个EXE项目,它在其搜索路径中有另一个项目输出的位置(BPL和DCP).当使用"Build With Runtime Packages"构建EXE项目时,它构建正常.但是,它需要我部署EXE和BPL.到现在为止还挺好.

因为我宁愿只部署EXE(无论它变大),我猜我只是取消选中"Build With Runtime Packages"并且就是这样,但事实并非如此.它不会构建,并开始抱怨缺少的类.我可以编译EXE项目的唯一方法是将实际BPL项目的DCU路径添加到EXE项目的搜索路径中.我可以这样做,但为什么我被迫指向DCU?德尔福不能把它们从BPL中拿走吗?这不只是一个品味的问题,如果我走这条路,并链接到DCU,当谈到属于表格的DCU时,它会询问我表格DFM,迫使我也将我的来源文件夹包含在EXE中项目的搜索路径,现在它们似乎正在编译,这是令人望而却步的.每次我想编译我的EXE项目时,我都无法重新编译我的BPL项目代码库.

我希望我已经说清楚了.

如何实现标题中提出的任何帮助表示赞赏.

谢谢.

delphi build bpl dcu delphi-10.1-berlin

4
推荐指数
1
解决办法
1024
查看次数

32位和64位不同类型的动态数组长度?

我有一个在Win32上正常运行的DUnitX测试套件.但是当我尝试为Win64编译它时,这一行会产生编译错误:

Assert.AreEqual(4, Length(r.Values));
Run Code Online (Sandbox Code Playgroud)

[dcc64错误] ...:E2532无法从方法'AreEqual'的不同参数类型推断泛型类型参数

r.Values定义为:

Type TIntegers = TArray<Integer>
Run Code Online (Sandbox Code Playgroud)

Assert.AreEqual有不同的重载实现,dcc64无法选择正确的...好的,但为什么呢?为什么dcc32可以没有问题地编译它?

我唯一的线索是,如果我用鼠标悬停,Delphi会告诉我Length是System.Smallint类型.使用Smallint参数没有Assert.AreEqual实现......果然,如果我将它转换为Integer,dcc64将编译它.

但这让我很烦恼.如果我查看System.pas单元,我可以看到DynArraySetLength采用NativeInt参数...一个64位整数(我希望无符号,但不确定).那么为什么Length会返回一个16位有符号整数?这似乎等待发生麻烦,对吧?

我错过了什么?

delphi delphi-10.1-berlin

4
推荐指数
1
解决办法
324
查看次数

如何在剪贴板上可靠地检测RICHTEXT格式?

Embarcadero公司的RAD Studio VCL有TClipboard.HasFormat方法,有使用例如Clipboard.HasFormat(CF_TEXT)Clipboard.HasFormat(CF_BITMAP)等.

但我没有找到任何支持CF_RTFCF_RICHTEXT格式描述符,表明剪贴板中的富文本格式.

所以我在Microsoft WordPad中创建了一些格式化文本并将其复制到剪贴板.然后我用剪贴板间谍程序来检查剪贴板上的格式:

在此输入图像描述

这里列出了3种富文本格式的格式描述符C078,C16BC1A5.

这些格式描述符是普遍的还是依赖于单个系统或当前情况?即,我通常可以Clipboard.HasFormat($C078)用来检测剪贴板上的任何RichText格式吗?还是有另一种方法吗?

delphi clipboard richtext delphi-10.1-berlin

4
推荐指数
1
解决办法
787
查看次数

使用TStyleBook时的旧/深色对话框

此问题与以下问题高度相关:为什么所有对话框都使用“旧” Android 2.x样式?

我正在使用Delphi Berlin(10.1),该问题已得到解决:

在此处输入图片说明

但是,一旦将TStyleBook放到窗体中并分配给它(例如,通过右键单击一个组件,然后“编辑自定义样式”),对话框(所有对话框)将再次变为深色样式:

在此处输入图片说明

自动创建的“修剪”样式仍然是“ light”版本(“ AndroidL Light”)。是的,我检查了FMX.Helpers.Android.pas中的函数“ GetNativeTheme()”分配了Result,甚至复制了文件并将其添加到项目中。从Form1.StyleBook再次显示本机样式对话框中删除任务。

在仍然继续使用TStyleBook的情况下如何解决?

delphi android firemonkey delphi-10.1-berlin

4
推荐指数
1
解决办法
162
查看次数

防止FireMonkey缩小照片

问题:

我在FireMonkey(XE 10.1 Berlin)中有一个需要拍照的移动应用程序.问题是FireMonkey似乎将我的图片重新调整为更小,至少在Android上.我不只是看到这发生在我自己的应用程序,而且还附带FireMonkey的PhotoEditor演示应用.

当我使用FireMonkey外部的相机拍照时,图像大小约为6-7 Mb,大小为5184 x 2916像素.
当我使用我的应用程序或使用PhotoEditor演示应用程序拍照时,图像大小介于140和180 kB之间,尺寸为365 x 648像素.

这发生在Android上; 我没有Mac方便,所以我目前无法在iPad或iPhone上进行测试.

到目前为止我发现了什么:

我在代码中设置断点以找出发生的位置.当OnDidFinishTaking事件处理程序被调用时,它接收到的图像已经今非昔比.

本次活动是由所谓的procedure TImageManagerAndroid.DidReceiveBitmap(const Sender: TObject; const M: TMessage);FMX.MediaLibrary.Android.pas.在这种情况下,我看到了这一行:

Photo := TBitmap.CreateFromFile(ImagePath);
Run Code Online (Sandbox Code Playgroud)

ImagePath 是指设备上已经缩小的.jpg文件.

进一步查看调用堆栈,我看到一个调用

procedure TFMXNativeActivityListener.onReceiveImagePath(ARequestCode: Integer; AFileName: JString);
Run Code Online (Sandbox Code Playgroud)

这个程序存在于FMX.Platform.Android.pas.在查看此过程的声明时,我发现它后跟关键字cdecl,这可能意味着从本机Android代码调用此方法.

我也看过这个教程.这里IFMXCameraService.TakePhoto使用该过程.值得注意的是,这个没有在PhotoEditor演示中使用!
它可能是一个使用它的选项,因为它采用包含RequiredResolution字段的参数的记录.但是,我更喜欢使用类似于PhotoEditor演示的方法.

问题:
如何防止FireMonkey缩小我的照片?

delphi android firemonkey delphi-10.1-berlin

3
推荐指数
1
解决办法
522
查看次数

为什么释放TObjectList也会删除控件?

我使用TObjectList来处理特定的标签列表.但是当我在Try Final中执行推荐的.Free时,它也会删除列表中的控件.

3个标签的简单示例:

Procedure GetHeaderLabels(var aList:TObjectList<TLabel>);
begin
  aList.Add(Form1.lblHeaderCars);
  aList.Add(Form1.lblHeaderBrands);
  aList.Add(Form1.lblHeaderModels);
end;

procedure TForm1.Button1Click(Sender: TObject);
var vHeaderLabelsList:TObjectList<TLabel>;
begin
  vHeaderLabelsList:=TObjectList<TLabel>.Create;
  try
     GetHeaderLabels(vHeaderLabelsList);
      {... process Header Labels }
  finally
    vHeaderLabelsList.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,当我执行此代码时,我最终缺少标签控件 - 它们从表单中删除,在调试中我看到控件是零.

我不应该.Free TObjectList?我如何免费使用TObjectlist并保持控件?

delphi tobjectlist delphi-10.1-berlin

3
推荐指数
2
解决办法
221
查看次数