小编Pat*_*man的帖子

如何在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万
查看次数

网络架构发现

我想执行一个彻底的LAN设备发现,这样我就可以创建一个类似于附加的图表,但是有IP和MAC地址等附加信息.

我尝试过Torry的代码:

type
  PNetResourceArray = ^TNetResourceArray;
  TNetResourceArray = array[0..100] of TNetResource;

function CreateNetResourceList(ResourceType: DWord;
                              NetResource: PNetResource;
                              out Entries: DWord;
                              out List: PNetResourceArray): Boolean;
var
  EnumHandle: THandle;
  BufSize: DWord;
  Res: DWord;
begin
  Result := False;
  List := Nil;
  Entries := 0;
  if WNetOpenEnum(RESOURCE_GLOBALNET,
                  ResourceType,
                  0,
                  NetResource,
                  EnumHandle) = NO_ERROR then begin
    try
      BufSize := $4000;  // 16 kByte
      GetMem(List, BufSize);
      try
        repeat
          Entries := DWord(-1);
          FillChar(List^, BufSize, 0);
          Res := WNetEnumResource(EnumHandle, Entries, List, BufSize);
          if Res = ERROR_MORE_DATA then
          begin
            ReAllocMem(List, …
Run Code Online (Sandbox Code Playgroud)

delphi lan network-programming discovery

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

Coco/R可以将解析后的文件转换为字节码吗?

我想在Delphi中为教育目的编写一个简单的编译器.我读过有关Coco/R的文章,并发现了Delphi的这个实现:http://code.google.com/p/dcocor/.根据我的阅读,这是Delphi 2009语法的解析器.

将解析后的文件转换为字节码需要做什么?Coco/R可以这样做吗?

我知道像FastScript或DWS这样的脚本语言,但我想尝试为自己的目的编写自己的脚本.

请给我一些建议或澄清一点.

delphi compiler-construction cocor

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

Delphi 7 - 试图理解MVC模式

我试图理解MVC模式,这就是我想出的.如果你可以如此善良并告诉我,如果我做得正确,建议一些改进,或者让我完全失败,我会非常高兴!

这是该项目的链接(Delphi 7):http://www.sendspace.com/file/ynpgre

delphi model-view-controller

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

编译x86和x64

是否可以以这种方式设置编译器,以便为x86和x64编译可执行文件/ DLL?我的意思是,一个文件适合两个平台.

我只知道单独选择平台的方法,但我想要两者.

可能吗?

windows delphi 32bit-64bit delphi-xe2

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

获取特定设备的驱动程序文件

我想知道如何像设备管理器一样获取特定设备的所有驱动程序文件?

我有以下代码:

procedure TdlgMain.Test(const DeviceIndex: Integer);
var
  PnPHandle: HDEVINFO;
  DevData: TSPDevInfoData;
  DeviceInterfaceData: TSPDeviceInterfaceData;
  FunctionClassDeviceData: PSPDeviceInterfaceDetailData;
  Success: LongBool;
  Devn: Integer;
  BytesReturned: DWORD;
  SerialGUID: TGUID;
begin
  ZeroMemory(@DevData, SizeOf(SP_DEVINFO_DATA));
  DevData.cbSize := SizeOf(SP_DEVINFO_DATA);

  ZeroMemory(@DeviceInterfaceData, SizeOf(TSPDeviceInterfaceData));
  DeviceInterfaceData.cbSize := SizeOf(TSPDeviceInterfaceData);

  if not SetupDiEnumDeviceInfo(hAllDevices,
    DeviceIndex, DevData) then Exit;

  SerialGUID := DevData.ClassGuid;

  PnPHandle := SetupDiGetClassDevs(@SerialGUID, nil, 0, DIGCF_PRESENT or DIGCF_DEVICEINTERFACE);
  if PnPHandle = Pointer(INVALID_HANDLE_VALUE) then
    Exit;

  Devn := 0;
  repeat
    DeviceInterfaceData.cbSize := SizeOf(TSPDeviceInterfaceData);
    Success := SetupDiEnumDeviceInterfaces(PnPHandle, nil, SerialGUID, Devn, DeviceInterfaceData);
    if Success then
    begin
      DevData.cbSize := SizeOf(DevData);
      BytesReturned …
Run Code Online (Sandbox Code Playgroud)

delphi file driver enumerate

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

扑克牌翻转动画

您知道任何可以实现3D翻转效果的免费组件/库吗?

在这里演示:snorkl.tv

delphi animation image flip

5
推荐指数
2
解决办法
3092
查看次数

将Warp Speed添加到转换系列

我使用米/秒作为基础为ConvUtils添加了一个Speed系列.

   Cf := RegisterConversionFamily('Speed');
   RegisterConversionType(Cf,'Meters per second'    ,1);
   RegisterConversionType(Cf,'Speed of Light'       ,0.000000003335641);
   RegisterConversionType(Cf,'Speed of Sound(Mach)' ,0.0029411765);
Run Code Online (Sandbox Code Playgroud)

现在我想添加'Warp Speed'作为一种类型.

我有公式

V = wf^3 * C
Run Code Online (Sandbox Code Playgroud)

其中:V =速度wf =翘曲因子C =光速

如何添加公式以添加类型?

delphi

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

将窗口嵌入另一个进程

我在StackOverflow上看过一些帖子,但没有一个对我有用.这是我用来在我的表单上显示标准计算器窗口的代码:

procedure TForm1.Button1Click(Sender: TObject);
var
  Tmp: Cardinal;
  R: TRect;
begin
  CalcWindow := FindWindow(nil, 'Calculator');
  if (CalcWindow <> 0) then
  begin
    GetWindowThreadProcessID(CalcWindow, CalcProcessID);

    Tmp := GetWindowLong(CalcWindow, GWL_STYLE);
    Tmp := (Tmp and not WS_POPUP) or WS_CHILD;
    SetWindowLong(CalcWindow, GWL_STYLE, Tmp);
    GetWindowRect(CalcWindow, R);

    SetForegroundWindow(CalcWindow);
    Windows.SetParent(CalcWindow, Panel1.Handle);
    SetWindowPos(CalcWindow, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_FRAMECHANGED);

    AttachThreadInput(GetCurrentThreadID(), CalcWindow, True);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

它确实在我的窗体上显示窗口,但有时会丢失玻璃边框(特别是当我移动窗体时),很难将焦点恢复到嵌入窗口(我需要多次单击).

可能是什么导致了这个?另外,您是否看到使用此方法可能遇到的任何潜在问题?

感谢您的时间.

delphi winapi

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

TDictionary.ContainsKey返回false,即使密钥存在

我现在面临的问题完全让我觉得我根本不懂编程.我有一个TDictionary由成对组成的对象TDate => TEvent (custom class).该对象用于由两个单独的应用程序共享的类(它们不通信).在一个应用程序中,以下工作正常:

  //  Get recipes from the very event.
  Tmp := FCalendar.ContainsKey(D);
  if (Tmp) then
  begin
    E := FCalendar[D];
    CopyRecipes(E);
  end;
Run Code Online (Sandbox Code Playgroud)

另一方面,同一段代码在其他应用程序中不起作用!怎么可能?我附上了调试器中发生的事情的屏幕截图:在此输入图像描述

如您所见,密钥存在于字典中,但ContainsKey()仍会返回FALSE.

是什么造成的?

此致,Patryk.

delphi generics dictionary delphi-xe2

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

数组元素的校验和

我有一个多维数组,Bytes定义如下:

type
  TRow = array[0..6] of Byte;
var
  All: array[0..19112079] of TRow;  
Run Code Online (Sandbox Code Playgroud)

现在,我想为数组所包含的每一行生成唯一的校验和并保存到文件中,如下所示:

var
  I: Integer;
begin
  for I := 0 to 19112079 do
  begin
    Checksum := GenerateChecksum(All[I]);
    Writeln(F, Checksum);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

我应该怎么做这个GenerateChecksum()功能?我试过xorCRC32,但他们是不是真的适合这个任务,因为它们返回重复值.我想为每一行生成一个唯一的校验和.

编辑 哦,校验和应该以允许比较行的方式计算.我想拿两个不同行的校验和,并判断其中一个是否大于另一个,小于另一个,或相等.有机会实现这样的目标吗?

EDIT2 两个相邻行中的示例数据:

Row x - 1: 120, 444, 323, 984, 1024, 76, 130
Row x:     120, 444, 323, 984, 1024, 76, 222
Row x + 1: 120, 444, 323, 984, 1024, 76, 121
. . …
Run Code Online (Sandbox Code Playgroud)

delphi checksum multidimensional-array

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

计算数组中后续组的数量

这个问题可能看起来有点模糊,但我会尝试用非专业人的术语来分解.

假设我有一个Byte包含24个值的数组,仅包含01:

011000100000001000000111
Run Code Online (Sandbox Code Playgroud)

该数组在逻辑上被划分为每组四个值的组,这给我们:

0110 0010 0000 0010 0000 0111
Run Code Online (Sandbox Code Playgroud)

现在,我想算一下,有多少后续组至少设置了一个值1.在我提供的示例中,我们有2后续的组.

我应该如何编程呢?

arrays delphi

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