我是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) 我想执行一个彻底的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中为教育目的编写一个简单的编译器.我读过有关Coco/R的文章,并发现了Delphi的这个实现:http://code.google.com/p/dcocor/.根据我的阅读,这是Delphi 2009语法的解析器.
将解析后的文件转换为字节码需要做什么?Coco/R可以这样做吗?
我知道像FastScript或DWS这样的脚本语言,但我想尝试为自己的目的编写自己的脚本.
请给我一些建议或澄清一点.
我试图理解MVC模式,这就是我想出的.如果你可以如此善良并告诉我,如果我做得正确,建议一些改进,或者让我完全失败,我会非常高兴!
这是该项目的链接(Delphi 7):http://www.sendspace.com/file/ynpgre
是否可以以这种方式设置编译器,以便为x86和x64编译可执行文件/ DLL?我的意思是,一个文件适合两个平台.
我只知道单独选择平台的方法,但我想要两者.
可能吗?
我想知道如何像设备管理器一样获取特定设备的所有驱动程序文件?
我有以下代码:
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) 我使用米/秒作为基础为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 =光速
如何添加公式以添加类型?
我在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)
它确实在我的窗体上显示窗口,但有时会丢失玻璃边框(特别是当我移动窗体时),很难将焦点恢复到嵌入窗口(我需要多次单击).
可能是什么导致了这个?另外,您是否看到使用此方法可能遇到的任何潜在问题?
感谢您的时间.
我现在面临的问题完全让我觉得我根本不懂编程.我有一个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.
我有一个多维数组,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()
功能?我试过xor
和CRC32
,但他们是不是真的适合这个任务,因为它们返回重复值.我想为每一行生成一个唯一的校验和.
编辑 哦,校验和应该以允许比较行的方式计算.我想拿两个不同行的校验和,并判断其中一个是否大于另一个,小于另一个,或相等.有机会实现这样的目标吗?
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) 这个问题可能看起来有点模糊,但我会尝试用非专业人的术语来分解.
假设我有一个Byte
包含24个值的数组,仅包含0
或1
:
011000100000001000000111
Run Code Online (Sandbox Code Playgroud)
该数组在逻辑上被划分为每组四个值的组,这给我们:
0110 0010 0000 0010 0000 0111
Run Code Online (Sandbox Code Playgroud)
现在,我想算一下,有多少后续组至少设置了一个值1
.在我提供的示例中,我们有2
后续的组.
我应该如何编程呢?