我使用TdwsUnit.ExposeRTTI方法将Delphi类暴露给脚本.它适用于基本数据类型.
但是当我添加一个时,它不起作用TNotifyEvent.我的Delphi类有一个OnChange : TNotifyEvent属性,当OnChage在脚本中分配它时,我收到一个错误
"Syntax Error: More arguments expected!"
Run Code Online (Sandbox Code Playgroud)
看起来脚本编译器理解我想调用事件处理程序而不是分配OnChange属性.添加"@"标志无济于事.
我的Delphi对象怎么能有一个事件处理程序在脚本中有他的处理程序代码?
问候.
Delphi 10.2(支持Linux)具有跨平台功能AtomicExchange,相当于Windows InterlocekdEchange.到现在为止还挺好...
我必须使用没有AtomicExchangeAdd等效的InterlockedExchangeAdd来移植Win32代码.
我的问题是:在为Linux编译时,我可以使用什么来替换InterlockedExchangeAdd?
我正在开发一个可视化组件(VCL),一个专门的TPanel.当用户在编辑表单时移动放在我的特殊面板上的控件时,我需要拦截.我需要拦截移动以调整放在同一特殊面板上的其他控件的视觉属性.
我的问题是:当用户在IDE中编辑表单时,如何拦截/检测/响应TCustomPanel派生组件上的控件移动?
需要绘制16位灰度内存位图.将a TCanvas与位图相关联将是非常了不起的.我使用Delphi,但任何语言都可以.我只需要这个主意.
任何的想法 ?
将灰度转换为RGB不是一种选择,因为在此过程中会丢失一半的分辨率(像素深度).
使用DWScript,我没有看到检查FileCreate函数返回值的明显方法.
示例(不工作)脚本:
function TestFileCreate : Boolean;
var
F : File;
begin
F := FileCreate('MyTestFile.txt');
Result := (F = -1); // Not working!
Result := (F.Handle = -1); // Not working!
end;
Run Code Online (Sandbox Code Playgroud)
从DWScript源代码中提取:
procedure TFileCreateFunc.DoEvalAsVariant(const args : TExprBaseListExec; var result : Variant);
var
h : THandle;
i : IdwsFileHandle;
begin
h:=FileCreate(args.AsFileName[0]);
i:=TdwsFileHandle.Create(h);
Result:=IUnknown(i);
end;
Run Code Online (Sandbox Code Playgroud)
如您所见,在内部调用Delphi CreateFile,失败时结果值为-1.此数值将转换为IdwsFileHandle.
我正在将 C 代码移植到 Delphi,并发现编译器(Delphi 10.4.1 和 MSVC2019,均针对 x32 平台)处理 +NAN 与零的比较的方式存在问题。两种编译器都使用 IEEE754 表示双浮点值。我发现了这个问题,因为我移植到 Delphi 的 C 代码附带了一堆数据来验证代码的正确性。
原始源代码很复杂,但我能够在 Delphi 和 C 中生成最小的可重现应用程序。
C代码:
#include <stdio.h>
#include <math.h>
double AngRound(double x) {
const double z = 1 / (double)(16);
volatile double y;
if (x == 0)
return 0;
y = fabs(x);
/* The compiler mustn't "simplify" z - (z - y) to y */
if (y < z)
y = z - (z - y); // <= This line is *NOT* …Run Code Online (Sandbox Code Playgroud) 在Windows平台上,通过调用Windows API EnterCriticalSection/LeaveCriticalSection来实现TCriticalSection.Microsoft文档明确指出,在线程拥有关键部分的所有权后,它可以对EnterCriticalSection进行额外调用.
到现在为止还挺好.
但是Delphi支持的其他平台下的行为如OSX,iOS和Android呢?
其他平台似乎使用TMonitor.所以这个问题可以改写为TMonitor.
我有一个应用程序,它加载了一个使用Delphi GDI + Library的DLL .该应用程序在卸载DLL(Calling FreeLibrary)时挂起.
我将问题跟踪到GdiPlus.pas单元终结部分,该部分调用GdiPlusShutdown,它永远不会返回.
如何避免这种僵局?
有一个运行DWS脚本的Delphi应用程序.Delphi应用程序向脚本公开一个对象实例,我们称之为"MyApplication".被暴露的对象有一个方法,其中一个参数是一个过程.
从根本上说,目标是让一个Delphi方法进行一些计算,并在回调程序说它完成时停止这个计算.回调过程在脚本内部.
我已经通过将回调函数的名称作为字符串传递来实现这一点.它工作得很好,除了在脚本编译时没有进行类型检查.我想传递一个实际的过程,以便脚本编译器可以在编译时捕获任何错误.
怎么做?
为了帮助读者理解我的意思,我展示了一些 - 不工作 - 代码:
首先是Delphi方面的简化版本:
Interface
type
TAppCheckProc = procedure (var Done : Boolean);
TMyApplication = class(TPersistent)
published
procedure Demo(CheckProc : TAppCheckProc);
end;
Implementation
TMyApplication.Demo(CheckProc : TAppCheckProc);
var
Done : Boolean;
begin
Done := FALSE;
while not Done do begin
// Some more code here...
CheckProc(Done);
end;
end;
Run Code Online (Sandbox Code Playgroud)
第二,在脚本方面我有这个(也简化):
procedure CheckProc(
var Done : Boolean);
var
Value : Integer;
begin
DigitalIO.DataIn(1, Value);
Done := (Value and 8) = 0;
end;
procedure …Run Code Online (Sandbox Code Playgroud) 我正在尝试为 Ubutun 18.04.4 LTS(在 RAD SERVER 10.3 中构建)重新编译 10.4.1 中的一些 API,但是拥有此库“REST.Response.Adapter”的 API 编译器会失败,并且出现此错误:
[DCC 错误] E2597 C:\Program Files (x86)\Embarcadero\Studio\21.0\bin\ld-linux.exe: 错误:找不到 -lz [DCC 致命错误] F2588 链接器错误代码:1 ($00000001)。
我已经安装了 10.4 的一些 linux 补丁。我尝试重新安装linux SDK,什么也没有......
有人知道吗?