小编Bog*_*atu的帖子

如何在Delphi XE2中解析嵌套的JSON对象?

我是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)

delphi json nested delphi-xe2

15
推荐指数
2
解决办法
4万
查看次数

在默认浏览器中打开TWebBrowser链接

我的应用程序显示从TWebBrowser控件中的Web加载的小横幅.这个横幅实际上是一个包含图像的HTML页面; 当用户点击图片时,它会将他们带到我们当前正在运行的促销活动中.

这里的坏处是,当点击TWebBrowser中的链接时,活动页面将在Internet Explorer中打开,而不是在默认浏览器中打开.我知道这TWebBrowser是因为是一个基于IE的控件,但有没有办法在用户的浏览器中打开链接?

谢谢.

browser delphi banner webbrowser-control delphi-xe2

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

在Delphi中解析包含变量名的字符串

我正在编写一个应用程序,其中我有如下函数:

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

delphi string variables casting

4
推荐指数
2
解决办法
1018
查看次数

防止TWebBrowser接受删除的文件

我有一个接受要拖放的文件的表单,以及放在同一表单上的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)

delphi file droppable twebbrowser

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

使用Indy 10.5.8进行POST时,标题中的垃圾

我试图通过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)

delphi post indy multipart

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

如何在Delphi中创建一个不可删除的文件

[以下是我之前提出的问题的改述,被认为是含糊不清的].

我正在深入研究为演示应用程序创建基本许可机制.我想到的是这样的:应用程序创建一个空的"许可证文件",在第一次运行时称为"0b1xa487x.ini",然后在第一次执行后30天到期,不能再运行了很长时间因为该特定文件存在于系统上.

我正在寻找的是一种以某种方式保护该特定文件以阻止删除的方法.由于它将是一个空白文件,没有任何内容,我不介意它是腐败的,有腐败的标题,无效的日期,无论如何保持不可取消.

我在某处根据文件属性看到了类似的方法(文件中设置了HX属性); 然而,属性方法让我无处可去,因为我找不到任何有关文件属性X存在的文档特征.

我也知道还有其他方法,包括作为系统用户启动的rootkit驱动程序和系统服务,但是这个特定的方法似乎最适合这种情况.同样,我概述了文件的内容也可能无法访问,我不打算使用该方法从文件中运行任何类型的恶意软件,因为我在下面被指责:)

delphi corrupt file file-manipulation

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

Indy 10 + Delphi客户端 - 服务器应用程序占用所有CPU

我写了一个小型客户端 - 服务器应用程序,它运行在两台或多台不同的机器上,用于重启/关闭.由于我对客户端 - 服务器应用程序比较陌生,所以我在这里采用了关于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 client-server indy10

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

在Delphi XE2中解析XML时访问冲突

我正在尝试使用以下代码解析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)

xml delphi musicbrainz delphi-xe2

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