小编fpi*_*tte的帖子

DWScript:在公开的Delphi类中使用事件

我使用TdwsUnit.ExposeRTTI方法将Delphi类暴露给脚本.它适用于基本数据类型.

但是当我添加一个时,它不起作用TNotifyEvent.我的Delphi类有一个OnChange : TNotifyEvent属性,当OnChage在脚本中分配它时,我收到一个错误

"Syntax Error: More arguments expected!"
Run Code Online (Sandbox Code Playgroud)

看起来脚本编译器理解我想调用事件处理程序而不是分配OnChange属性.添加"@"标志无济于事.

我的Delphi对象怎么能有一个事件处理程序在脚本中有他的处理程序代码?

问候.

delphi dwscript

18
推荐指数
1
解决办法
675
查看次数

使用Delphi 10.2等效的InterlockedExchangeAdd for Linux

Delphi 10.2(支持Linux)具有跨平台功能AtomicExchange,相当于Windows InterlocekdEchange.到现在为止还挺好...

我必须使用没有AtomicExchangeAdd等效的InterlockedExchangeAdd来移植Win32代码.

我的问题是:在为Linux编译时,我可以使用什么来替换InterlockedExchangeAdd?

linux delphi atomicity

11
推荐指数
2
解决办法
410
查看次数

编辑Delphi表单时如何拦截控件移动

我正在开发一个可视化组件(VCL),一个专门的TPanel.当用户在编辑表单时移动放在我的特殊面板上的控件时,我需要拦截.我需要拦截移动以调整放在同一特殊面板上的其他控件的视觉属性.

我的问题是:当用户在IDE中编辑表单时,如何拦截/检测/响应TCustomPanel派生组件上的控件移动?

delphi vcl

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

在内存中绘制16位灰度位图

需要绘制16位灰度内存位图.将a TCanvas与位图相关联将是非常了不起的.我使用Delphi,但任何语言都可以.我只需要这个主意.

任何的想法 ?

将灰度转换为RGB不是一种选择,因为在此过程中会丢失一半的分辨率(像素深度).

windows delphi gdi bitmap

7
推荐指数
1
解决办法
1933
查看次数

如何检查DWScript FileCreate函数的返回值?

使用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.

delphi dwscript

7
推荐指数
1
解决办法
254
查看次数

Delphi 和 MSVC 不会以相同的方式将 +NAN 与零进行比较

我正在将 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)

c delphi ieee-754

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

可以通过线程多次安全地调用TCriticalSection.Acquire吗?

在Windows平台上,通过调用Windows API EnterCriticalSection/LeaveCriticalSection来实现TCriticalSection.Microsoft文档明确指出,在线程拥有关键部分的所有权后,它可以对EnterCriticalSection进行额外调用.

到现在为止还挺好.

但是Delphi支持的其他平台下的行为如OSX,iOS和Android呢?

其他平台似乎使用TMonitor.所以这个问题可以改写为TMonitor.

delphi macos multithreading android ios

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

使用GdiPlus卸载DLL时程序挂起

我有一个应用程序,它加载了一个使用Delphi GDI + Library的DLL .该应用程序在卸载DLL(Calling FreeLibrary)时挂起.

我将问题跟踪到GdiPlus.pas单元终结部分,该部分调用GdiPlusShutdown,它永远不会返回.

如何避免这种僵局?

delphi dll gdi+

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

如何声明从具有过程类型参数的脚本调用的Delphi对象的方法

有一个运行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)

delphi dwscript

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

RAD SERVER 10.4.1“E2597(SystemPath)\ld-linux.exe:错误:找不到 -lz”部署到 Linux 64

我正在尝试为 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,什么也没有......

有人知道吗?

linux delphi rest rad-studio

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

标签 统计

delphi ×10

dwscript ×3

linux ×2

android ×1

atomicity ×1

bitmap ×1

c ×1

dll ×1

gdi ×1

gdi+ ×1

ieee-754 ×1

ios ×1

macos ×1

multithreading ×1

rad-studio ×1

rest ×1

vcl ×1

windows ×1