小编Mar*_*tti的帖子

如何使用 RTTI 将事件处理程序分配给事件属性?

我有一个包含一些事件属性的类和另一个包含事件处理程序的类。在编译时我不知道任何一个类的结构,在运行时我只知道使用它们的名称的事件属性和事件处理程序之间的匹配。使用 RTTI,我想将事件处理程序分配给相应的事件属性,我该怎么做?

我目前有这样的事情:

type
  TMyEvent = reference to procedure(const AInput: TArray<string>; out AOutput: TArray<string>);
  TMyBeforeEvent = reference to procedure(const AInput: TArray<string>; out AOutput: TArray<string>; out ACanContinue: boolean);

  TMyClass = class
  private
    FOnBeforeEvent: TMyBeforeEvent;
    FOnEvent: TMyEvent;
  public
    property OnBeforeEvent: TMyBeforeEvent read FOnBeforeEvent write FOnBeforeEvent;
    property OnEvent: TMyEvent read FOnEvent write FOnEvent;
  end;

  TMyEventHandler = class
  public
    procedure DoBeforeEvent(const AInput: TArray<string>; out AOutput: TArray<string>; out ACanContinue: boolean);
    procedure DoEvent(const AInput: TArray<string>; out AOutput: TArray<string>);
  end;

  procedure AssignEvent;

implementation

uses
  Vcl.Dialogs, System.RTTI;

{ …
Run Code Online (Sandbox Code Playgroud)

delphi rtti delphi-10.3-rio

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

无需外部库即可很好地缩放图像

我正在使用 Delphi 10.4.2,我正在尝试找到一种缩放图像的方法,以保持图像质量并且不需要外部库

这是我尝试过的,您可以在以下位置找到这两个测试{$REGION}

procedure TFrmTestGenImg.Test;
var
  LOldWidth, LOldHeight, LNewWidth, LNewHeight: integer;
  LImageNameIn, LImageNameOut, LExt: string;
  LClass: TGraphicClass;
  LImageIn, LImageOut: TGraphic;
  LBitmap, LResized: TBitmap;
begin
  // Original image: 1366 x 768
  LOldWidth := 1366;
  LOldHeight := 768;
  LNewWidth := 800;
  LNewHeight := 449;

  LImageNameIn := 'C:\temp\Input.png';
  LImageNameOut := 'C:\temp\Output_' + FormatDateTime('yyyy.mm.dd hh.nn.ss.zzz', Now) + '.png';

  LExt := TPath.GetExtension(LImageNameIn);
  Delete(LExt, 1, 1);
  if (CompareText(LExt, 'bmp') = 0) then
    LClass := TBitmap
  else if (CompareText(LExt, 'gif') …
Run Code Online (Sandbox Code Playgroud)

delphi image-scaling delphi-10.4-sydney delphi-10.4.2

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

CreateProcess 的权限低于调用者

我们有一个以管理员权限运行的应用程序,其中(除了实际需要管理员权限的其他操作之外)用户可以发送电子邮件。

我们的电子邮件系统的工作原理如下:管理员运行的应用程序预编译电子邮件字段并启动(通过CreateProcess)我们的电子邮件应用程序,该应用程序调用实际的电子邮件发送。如果电子邮件完整并准备就绪,它将直接发送,否则它将显示 Outlook 电子邮件表单,让用户填写缺少的字段并发送。

我们的电子邮件应用程序用于TJclEmail处理电子邮件发送和显示 Outlook 电子邮件表单。我的问题是这样的:如果 Outlook 不以管理员身份运行,电子邮件应用程序将不会显示 Outlook 电子邮件表单,我猜是因为它是从管理员运行的应用程序调用的,所以它继承了权限。由于 Outlook 很少以管理员身份运行,我想找到一种CreateProcess以普通用户权限进行调用的方法,而不是从调用者那里继承管理权限。

有办法这样做吗?

delphi email winapi createprocess delphi-xe3

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