小编Pet*_*olf的帖子

在 Delphi 中,如何在基类及其后代类中启用方法指针属性

我想创建一个TService后代类,用作我的 Windows 服务实现的基础。在我的基类中,我引入了一个已发布的ServiceDescription属性,并且我正在使用AfterInstall事件处理程序将此描述写入 Windows 注册表中的适当位置。

请注意,由于TServer类(在 中声明Vcl.SvcMgr)是TDataModule后代,为了允许ServiceDescription属性在对象检查器中可见,有必要在设计时包中声明此基类,并使用对 的调用在 Delphi 中注册它RegisterCustomModule。此外,此基类的后代必须由 OTA(开放工具 API)向导或某种代码生成器(.pas 和 .dfm 文件)生成。没问题,我已经整理好了,如果您有兴趣,可以从 Marco Cantu 的书 ( http://www.marcocantu.com/ddh/ddh15/ddh15e.htm ) 中阅读更多相关信息。

我遇到的问题是我想使用AfterInstall基类中的事件处理程序写入注册表,然后将AfterUninstall其删除,但我想确保我的后代类也将支持AfterInstallAfterUninstall事件。

我之前从 Ray Konopka 那里了解到,如果你想重新引入一个属性,你必须在后代类中使用访问器方法。因此,这里是一个代码段,代表我针对AfterInstall事件执行此操作的尝试:

  private
    // field to store method pointer for the descendant AfterInstall event handler
    FFAfterInstall: TServiceEvent;
    …
  protected
    function GetAfterInstall: TServiceEvent;
    procedure SetAfterInstall( value: TServiceEvent );
    …
  published …
Run Code Online (Sandbox Code Playgroud)

delphi oop windows-services

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

如何在 TWebBrowser IDispatchEvent 中获取自定义事件参数

我试图在 Javascript 和我的TWebBrowser. 在我的第一次迭代中,我能够注册属性更改事件,以便当标记更改时,Delphi 会获取更改,然后读取触发更改的标记的值。这样我们就可以让 Javascript 设置一个隐藏标签,Delphi 将接收更改,然后 Delphi 将读取隐藏标签以获取值。这工作正常,但感觉有点hacky。

在第二次迭代中,我尝试触发 Javascript 中引发的自定义事件。我能够使其正常工作,但我找不到一种方法来获取传递给自定义事件的参数。这是我创建的代码IDispatch

constructor TWebBrowserEvent.Create(const OnEvent: TCallback);
begin
   inherited Create;
   FOnEvent := OnEvent;
end;

function TWebBrowserEvent.GetIDsOfNames(const IID: TGUID; Names: Pointer; NameCount, LocaleID: Integer; DispIDs: Pointer): HResult;
begin
   Result := E_NOTIMPL;
end;

function TWebBrowserEvent.GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult;
begin
   Result := E_NOTIMPL;
end;

function TWebBrowserEvent.GetTypeInfoCount(out Count: Integer): HResult;
begin
   Result := E_NOTIMPL;
end;

function TWebBrowserEvent.Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, …
Run Code Online (Sandbox Code Playgroud)

delphi mshtml delphi-2010 twebbrowser

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

Delphi IXMLDOMDocument2 无法加载文件名中包含 % 的 XML 文件

我在将文件加载到IXMLDOMDocument2. 如果文件名包含并load设置为:False%parseError

系统找不到指定的资源。

%该文件存在,当从其名称中删除时,它工作得很好。

有什么方法可以加载%名称中包含的 XML 文件吗?

delphi msxml

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

Delphi:将 JSON 数组添加到 JSON 对象

我正在使用 Indy 调用第 3 方 API

\n
var loRespJson: TMemoryStream;\nIdHTTP1.GET(lsURL, loRespJson)\n
Run Code Online (Sandbox Code Playgroud)\n

它返回一个 JSON 数组:

\n
var loRespJson: TMemoryStream;\nIdHTTP1.GET(lsURL, loRespJson)\n
Run Code Online (Sandbox Code Playgroud)\n

反过来,我的函数创建一个新的 JSON 对象,添加附加信息和响应,并将其返回给调用程序。期望的结果:

\n
[\n    {\n        "Active": "1",\n        "SourceId": "215",\n        "SourceName": "MyVal1"\n    },\n    {\n        "Active": "1",\n        "SourceId": "383",\n        "SourceName": "MyVal2"\n    }\n]\n
Run Code Online (Sandbox Code Playgroud)\n

我怎样才能实现上述目标?如果我使用以下内容添加,它会在数组周围创建“”(引号),这在解析 JSON 时是一个大问题:

\n
loJSon.AddPair(TJSONPair.Create(\'responseCode\', IntToStr(idHttp1.ResponseCode)));\nloJSon.AddPair(TJSONPair.Create(\'companyNo\', CompanyNo));\n\nif idHttp1.ResponseCode = 200 then\nbegin\n  lsRespMsg := StreamToString(loRespJSon);\n  liSuper := SO(lsRespMsg);\n  loJSon.AddPair(TJSONPair.Create(\'responseMessage\', liSuper.AsJSon()));\n  \xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n

我也尝试过循环遍历 JSON 数组,但该选项在每个数组项周围添加了“”

\n
{ create an json-array }\nloJSA := TJsonArray.Create();\n{ add array to object }\nloJSP …
Run Code Online (Sandbox Code Playgroud)

delphi json delphi-2010

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

在 Delphi Rio (10.3.3) 中,当宏为 NULL 时,fdQuery 无法正确翻译条件函数“iif”

我有以下 SQL 命令来运行TFDQuery使用 PostgreSQL 作为数据库的查询:

fdqr.SQL.Text: = 
  'select * from (values (current_date-1), (current_date), (current_date + 1)) as t (datetest) ' +
  '{iif (! Datevalue, where datetest =! Datevalue)}';
Run Code Online (Sandbox Code Playgroud)

当我使用该Clear方法清除宏值时,我希望解释脚本以便消除过滤器,但事实并非如此。

fdqr.MacroByName('datevalue').Clear;
fdqr.Open;
Run Code Online (Sandbox Code Playgroud)

结果数据库日志:

fdqr.SQL.Text: = 
  'select * from (values (current_date-1), (current_date), (current_date + 1)) as t (datetest) ' +
  '{iif (! Datevalue, where datetest =! Datevalue)}';
Run Code Online (Sandbox Code Playgroud)

但是,如果您通过 包含赋值AsRaw,它会按预期工作,即使先前的值是''(空字符串)并且IsNullTrue

fdqr.MacroByName('datevalue').Clear;
{ at this point IsNull = True and AsRaw is …
Run Code Online (Sandbox Code Playgroud)

delphi macros firedac

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

如何从 Delphi 中的 TRESTReponse 获取子项值?

我需要获取包含以下 JSONsubitem1的 a 的值:LResponse

"Information": {
    "subitem1": "2011",
    "subitem2": "Test"
}
Run Code Online (Sandbox Code Playgroud)

我正在使用此代码来获取其他值,它运行良好,但是当我尝试获取Information, subitem1or时subitem2,它返回一个空值。

var
  LClient: TRESTClient;
  LRequest: TRESTRequest;
  LResponse: TRESTResponse;
begin
  LClient := TRESTClient.Create(URL_API);
  try
    LRequest := TRESTRequest.Create(LClient);
    try
      LResponse := TRESTResponse.Create(LClient);
      try
        LRequest.Client := LClient;
        LRequest.Response := LResponse;
        LRequest.Method := rmGET;
        LRequest.Params.AddHeader('Authorization','Bearer '+FToken);
        LRequest.Params.ParameterByName('Authorization').Options := [poDoNotEncode];
        LRequest.Params.AddHeader('Accept', 'application/json');
        LRequest.Execute;

        LResponse.GetSimpleValue('subitem1', FLogradouro);
        { ... }
Run Code Online (Sandbox Code Playgroud)

delphi response firemonkey

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