我想创建一个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
其删除,但我想确保我的后代类也将支持AfterInstall
和AfterUninstall
事件。
我之前从 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) 我试图在 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) 我在将文件加载到IXMLDOMDocument2
. 如果文件名包含并load
设置为:False
%
parseError
系统找不到指定的资源。
%
该文件存在,当从其名称中删除时,它工作得很好。
有什么方法可以加载%
名称中包含的 XML 文件吗?
我正在使用 Indy 调用第 3 方 API
\nvar loRespJson: TMemoryStream;\nIdHTTP1.GET(lsURL, loRespJson)\n
Run Code Online (Sandbox Code Playgroud)\n它返回一个 JSON 数组:
\nvar 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 时是一个大问题:
\nloJSon.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) 我有以下 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
,它会按预期工作,即使先前的值是''
(空字符串)并且IsNull
是True
。
fdqr.MacroByName('datevalue').Clear;
{ at this point IsNull = True and AsRaw is …
Run Code Online (Sandbox Code Playgroud) 我需要获取包含以下 JSONsubitem1
的 a 的值:LResponse
"Information": {
"subitem1": "2011",
"subitem2": "Test"
}
Run Code Online (Sandbox Code Playgroud)
我正在使用此代码来获取其他值,它运行良好,但是当我尝试获取Information
, subitem1
or时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 ×6
delphi-2010 ×2
firedac ×1
firemonkey ×1
json ×1
macros ×1
mshtml ×1
msxml ×1
oop ×1
response ×1
twebbrowser ×1