我有一个包含一些事件属性的类和另一个包含事件处理程序的类。在编译时我不知道任何一个类的结构,在运行时我只知道使用它们的名称的事件属性和事件处理程序之间的匹配。使用 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 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) 我们有一个以管理员权限运行的应用程序,其中(除了实际需要管理员权限的其他操作之外)用户可以发送电子邮件。
我们的电子邮件系统的工作原理如下:管理员运行的应用程序预编译电子邮件字段并启动(通过CreateProcess)我们的电子邮件应用程序,该应用程序调用实际的电子邮件发送。如果电子邮件完整并准备就绪,它将直接发送,否则它将显示 Outlook 电子邮件表单,让用户填写缺少的字段并发送。
我们的电子邮件应用程序用于TJclEmail处理电子邮件发送和显示 Outlook 电子邮件表单。我的问题是这样的:如果 Outlook 不以管理员身份运行,电子邮件应用程序将不会显示 Outlook 电子邮件表单,我猜是因为它是从管理员运行的应用程序调用的,所以它继承了权限。由于 Outlook 很少以管理员身份运行,我想找到一种CreateProcess以普通用户权限进行调用的方法,而不是从调用者那里继承管理权限。
有办法这样做吗?