我是JSON的新手,我手上有这个项目,需要我解析一个JSON并在ListView中显示它的一些内容.问题是我现在阅读的文档处理的是包含JSON数组的JSON对象,而我的案例涉及处理嵌套对象.简而言之,这里是摘要:我正在使用带有DBXJSON的Delphi XE2.我将一些值发布到服务器,并使用看起来像这样的JSON对象进行回复:
{
"products": {
"Men's Sneakers": {
"instock": false,
"size": "423",
"manufacturer": "Adidas",
"lastcheck": "20120529"
},
"Purse": {
"instock": true,
"size": "not applicable",
"manufacturer": "Prada",
"lastcheck": "20120528"
},
"Men's Hood": {
"instock": false,
"size": "M",
"manufacturer": "Generic",
"lastcheck": "20120529"
}
},
"total": 41,
"available": 30
}
Run Code Online (Sandbox Code Playgroud)
我想要实现的是将每个项目(即Purse)解析并添加为listview中的标题,以及一个子项目(制造商).我创建了一个以JSON字符串作为参数的过程,创建了JSON对象,但我不知道如何进一步解析嵌套对象.
procedure TForm1.ParseString(const AString: string);
var
json : TJSONObject;
jPair : TJSONPair;
jValue : TJSONValue;
jcValue : TJSONValue;
l,i : Integer;
begin
json := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(AString),0) as TJSONObject;
try
//get the pair to evaluate …Run Code Online (Sandbox Code Playgroud) 我的应用程序显示从TWebBrowser控件中的Web加载的小横幅.这个横幅实际上是一个包含图像的HTML页面; 当用户点击图片时,它会将他们带到我们当前正在运行的促销活动中.
这里的坏处是,当点击TWebBrowser中的链接时,活动页面将在Internet Explorer中打开,而不是在默认浏览器中打开.我知道这TWebBrowser是因为是一个基于IE的控件,但有没有办法在用户的浏览器中打开链接?
谢谢.
我正在编写一个应用程序,其中我有如下函数:
var a,b,c, algorithm: string
begin
a := some-operations-with-regular-expressions;
b := some-other-operation-with-regular-expressions;
c := just-similar-to-b-but-different;
algorithm := IniFile.ReadString('XML Info','AlgorithmExpression', '');
//algorithm is fetched like 'http://wwww.urlhere' + a + '/' + b + '/' + c
DoDownload (algorithm, true);
end;
Run Code Online (Sandbox Code Playgroud)
现在我的期望是a,b&c自动替换为具有相同名称的变量的值,但看起来我错了.有没有办法让算法变量的结果由''和变量值之间的字符串组成?
任何建议(即使它要求重大的重新设计)都将非常感激.
谢谢,sphynx
我有一个接受要拖放的文件的表单,以及放在同一表单上的TPanel控件上的TWebBrowser控件.
主要的是,当我在表单上删除文件时,它的路径被添加到TEdit控件.但是,当用户在表单上拖放文件时,有时他们可能会将其放在TWebBrowser上,这样可以根据文件类型为用户保存或运行文件.这是我实际上不想发生的事情,我只是想让TWebBrowser忽略丢弃的文件或者像表单那样处理它.
这是我用来处理WM_DROPFILES消息的代码:
procedure TMainForm.AcceptFiles( var msg : TMessage );
const
cnMaxFileNameLen = 255;
var
i,
nCount : integer;
acFileName : array [0..cnMaxFileNameLen] of char;
begin
// find out how many files we're accepting
nCount := DragQueryFile( msg.WParam,
$FFFFFFFF,
acFileName,
cnMaxFileNameLen );
// query Windows one at a time for the file name
for i := 0 to nCount-1 do
begin
DragQueryFile( msg.WParam, i,
acFileName, cnMaxFileNameLen );
// do your thing with the acFileName
//MessageBox( Handle, acFileName, '', MB_OK ); …Run Code Online (Sandbox Code Playgroud) 我试图通过Indy 10.5.8在多部分/表格数据中使用POST发送文件.我正在使用Delphi XE2,我一直在尝试将文件发布到服务器上.这是我第一次尝试这个,因为我对Indy的经验非常有限,我采用了以下代码片段:
unit MsMultiPartFormData;
interface
uses
SysUtils, Classes;
const
CONTENT_TYPE = 'multipart/form-data; boundary=';
CRLF = #13#10;
CONTENT_DISPOSITION = 'Content-Disposition: form-data; name="%s"';
FILE_NAME_PLACE_HOLDER = '; filename="%s"';
CONTENT_TYPE_PLACE_HOLDER = 'Content-Type: %s' + crlf + crlf;
CONTENT_LENGTH = 'Content-Length: %d' + crlf;
type
TMsMultiPartFormDataStream = class(TMemoryStream)
private
FBoundary: string;
FRequestContentType: string;
function GenerateUniqueBoundary: string;
public
procedure AddFormField(const FieldName, FieldValue: string);
procedure AddFile(const FieldName, FileName, ContentType: string; FileData: TStream); overload;
procedure AddFile(const FieldName, FileName, ContentType: string); overload;
procedure PrepareStreamForDispatch;
constructor Create;
property Boundary: …Run Code Online (Sandbox Code Playgroud) [以下是我之前提出的问题的改述,被认为是含糊不清的].
我正在深入研究为演示应用程序创建基本许可机制.我想到的是这样的:应用程序创建一个空的"许可证文件",在第一次运行时称为"0b1xa487x.ini",然后在第一次执行后30天到期,不能再运行了很长时间因为该特定文件存在于系统上.
我正在寻找的是一种以某种方式保护该特定文件以阻止删除的方法.由于它将是一个空白文件,没有任何内容,我不介意它是腐败的,有腐败的标题,无效的日期,无论如何保持不可取消.
我在某处根据文件属性看到了类似的方法(文件中设置了HX属性); 然而,属性方法让我无处可去,因为我找不到任何有关文件属性X存在的文档特征.
我也知道还有其他方法,包括作为系统用户启动的rootkit驱动程序和系统服务,但是这个特定的方法似乎最适合这种情况.同样,我概述了文件的内容也可能无法访问,我不打算使用该方法从文件中运行任何类型的恶意软件,因为我在下面被指责:)
我写了一个小型客户端 - 服务器应用程序,它运行在两台或多台不同的机器上,用于重启/关闭.由于我对客户端 - 服务器应用程序比较陌生,所以我在这里采用了关于Delphi的方法.简而言之,我的服务器应用程序等待端口7676上的连接,将客户端添加到客户端列表然后什么也不做(稍后将实现关闭和重新启动过程).但是,即使它是被动的,只需连接两个客户端,它就会占用高达90%的CPU.这是客户端代码,由TidTCPServer和TidAntiFreeze组成:
type
PClient = ^TClient;
TClient = record
PeerIP : string[15]; { Client IP address }
HostName : String[40]; { Hostname }
Connected, { Time of connect }
LastAction : TDateTime; { Time of last transaction }
AContext : Pointer; { Pointer to thread }
end;
[...]
procedure TForm1.StartServerExecute(Sender: TObject);
var
Bindings: TIdSocketHandles;
begin
//setup and start TCPServer
Bindings := TIdSocketHandles.Create(TCPServer);
try
with Bindings.Add do
begin
IP := DefaultServerIP;
Port := DefaultServerPort; …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用以下代码解析Delphi XE2中的MusicBraninz XML文件:
webquery := 'http://www.musicbrainz.org/ws/2/recording/?query='+escape(tracktitle)+'&artist:'+escape(ArtistTitle);
Log('WebQuery: ' + webquery, 0);
begin
XMLDoc:= TXMLDocument.Create(nil);
XMLDoc.FileName := webQuery;
XMLDoc.Active := True;
Log('Report: ' + XMLDoc.XML.Text, 0);
StartItemNode := XMLDoc.DocumentElement.ChildNodes.First.ChildNodes.FindNode('release-list') ;
ANode := StartItemNode;
repeat
Result.Album := ANode.ChildNodes['title'].Text; <-- Access Violation
Result.Status:= ANode.ChildNodes['status'].Text;
ANode := ANode.NextSibling;
until ANode = nil;
end;
Run Code Online (Sandbox Code Playgroud)
正确获取XML文件,看起来如下所示:
<metadata xmlns="http://musicbrainz.org/ns/mmd-2.0#" xmlns:ext="http://musicbrainz.org/ns/ext#-2.0">
<recording-list offset="0" count="1">
<recording ext:score="100" id="a399eec1-d45d-4505-b475-ead0da6cad17">
<title>Mestec?ni?</title>
<length>359000</length>
<artist-credit>
<name-credit>
<artist id="8fb78a16-0cba-4175-8c92-d9645dfb007d">
<name>Bucovina</name>
<sort-name>Bucovina</sort-name>
</artist>
</name-credit>
</artist-credit>
<release-list>
<release id="22b00afc-86ea-445a-8805-b6bfa33da74e">
<title>Duh</title>
<status>Official</status>
<release-group type="EP" id="4e8fb87c-3760-48c1-a3d7-88e7a2c839fa">
<primary-type>EP</primary-type>
</release-group> …Run Code Online (Sandbox Code Playgroud)