QMsgPack的用法DEMO

引用单元文件:

uses qstring, qmsgpack, qjson;

演示一:

procedure TForm2.Button10Click(Sender: TObject);
var
AJson, AItem: TQMsgPack;
S: String;
begin
AJson := TQMsgPack.Create;
try
AJson.Add('Item1', 0);
AJson.Add('Item2', true);
AJson.Add('Item3', 1.23);
for AItem in AJson do  // 遍历
begin
S := S + AItem.Name + ' => ' + AItem.AsString + #13#10;
end;
mmResult.Lines.Add(S);
finally
AJson.Free;
end;
end;

演示二:

procedure TForm2.Button11Click(Sender: TObject);
var
AMsgPack: TQMsgPack;
ABytes: TBytes;
begin
AMsgPack := TQMsgPack.Create;
try
// 强制路径访问,如果路径不存在,则会创建路径,路径分隔符可以是./\之一
AMsgPack.ForcePath('demo1.item[0].name').AsString := '1';
AMsgPack.ForcePath('demo1.item[1].name').AsString := '100';
try
ShowMessage('下面正常会抛出一个异常');
AMsgPack.ForcePath('demo1[0].item[1]').AsString := '200';
except
// 这个应该抛出异常,demo1是对象不是数组,所以是错的
end;
// 访问第6个元素,前5个元素会自动设置为null
AMsgPack.ForcePath('demo2[5]').AsInteger := 103;
// 强制创建一个空数组对象,然后调用Add方法添加子成员
AMsgPack.ForcePath('demo3[]').Add('Value', 1.23);
// 下面的代码将生成"demo4":[{"Name":"demo4"}]的结果
AMsgPack.ForcePath('demo4[].Name').AsString := 'demo4';
// 直接强制路径存在
AMsgPack.ForcePath('demo5[0]').AsString := 'demo5';

mmResult.Text := AMsgPack.AsString;
finally
AMsgPack.Free;
end;
end;

演示三:

procedure TForm2.Button12Click(Sender: TObject);
var
AMsgPack: TQMsgPack;
AList: TQMsgPackList;
begin
AMsgPack := TQMsgPack.Create;
try
with AMsgPack.ForcePath('object') do
begin
Add('name', 'object_1');
Add('subobj').Add('name', 'subobj_1');
Add('subarray', mptArray).AsVariant := VarArrayOf([1, 3, 4]);
end;
with AMsgPack.Add('array', mptArray) do
begin
Add.AsInteger := 100;
Add.AsInteger := 200;
Add.AsInteger := 300;
Add.Add('name', 'object');
end;
AList := TQMsgPackList.Create;
AMsgPack.ItemByRegex('na.+', AList, true);
mmResult.Lines.Add('ItemByRegex返回' + IntToStr(AList.Count) + '项结果');
AList.Free;
mmResult.Lines.Add('ItemByPath(''object\subobj\name'')=' +
AMsgPack.ItemByPath('object\subobj\name').AsString);
mmResult.Lines.Add('ItemByPath(''object\subarray[1]'')=' +
AMsgPack.ItemByPath('object\subarray[1]').AsString);
mmResult.Lines.Add('ItemByPath(''array[1]'')=' +
AMsgPack.ItemByPath('array[1]').AsString);
mmResult.Lines.Add('ItemByPath(''array[3].name'')=' +
AMsgPack.ItemByPath('array[3].name').AsString);
mmResult.Lines.Add('ItemByPath(''object[0]'')=' +
AMsgPack.ItemByPath('object[0]').AsString);
finally
AMsgPack.Free;
end;
end;

演示四:

procedure TForm2.Button13Click(Sender: TObject);
var
AMsgPack, AChild: TQMsgPack;
B: TBytes;
begin
AMsgPack := TQMsgPack.Create;
AMsgPack.ForcePath('a.b.c[].d').AsString := 'OK';
if AMsgPack.HasChild('a.b.c[0].d', AChild) then
mmResult.Text := AMsgPack.AsJson + #13#10 + '子结点 a.b.c[0].d 存在,值为:' +
AChild.AsString
else
mmResult.Text := AMsgPack.AsJson + #13#10 + '子结点 a.b.c[0].d 不存在';
AMsgPack.Free;

end;

演示五:

procedure TForm2.Button14Click(Sender: TObject);
var
APack, AItem: TQMsgPack;
begin
APack := TQMsgPack.Create;
try
with APack.Add('ID', mptArray) do
begin
Add.AsString := 'Name';
Add.AsString := 'Group';
Add.AsString := 'Readme';
end;
with APack.Items[0] do
begin
ShowMessage(Items[0].AsString);
end;
AItem := APack.Add;
AItem.KeyAsInteger := 30;
AItem.AsInteger := 100;
ShowMessage(APack.AsJson);
finally
FreeObject(APack);
end;
end;

演示六(APack.LoadFromFile):

procedure TForm2.Button1Click(Sender: TObject);
var
APack: TQMsgPack;
T, Speed: Cardinal;
AFileSize: Int64;
begin
APack := TQMsgPack.Create;
try
if dlgOpen.Execute then
begin
T := GetTickCount;
APack.LoadFromFile(dlgOpen.FileName);
T := GetTickCount - T;
AFileSize := GetFileSize(dlgOpen.FileName);
if T > 0 then
Speed := AFileSize * 1000 div T
else
Speed := 0;
mmResult.Lines.Add(dlgOpen.FileName + ' - 大小' + RollupSize(AFileSize) +
', 用时:' + IntToStr(T) + 'ms,速度:' + RollupSize(Speed));
end;
finally
APack.Free;
end;
end;

演示七(APack.Add('Stream').BytesFromStream):

procedure TForm2.Button2Click(Sender: TObject);
var
APack: TQMsgPack;
ABytes: TBytes;
S: String;
I: Integer;
AStream: TMemoryStream;
begin
APack := TQMsgPack.Create;
try
APack.Add('Age', 25);
APack.Add('Name', 'Jone smith');
with APack.Add('Colors', mptArray) do
begin
Add.AsString := 'Red';
Add.AsString := 'Yellow';
Add.AsString := 'Blue';
Add.AsBoolean := False;
end;
with APack.Add('Arm') do
begin
Add('Name').AsString := 'Hande';
Add('Fat').AsBoolean := False;
Add('Length').AsInteger := 32;
end;
SetLength(ABytes, 10);
for I := 0 to 9 do
ABytes[I] := I + 1;
APack.Add('Bytes', ABytes);
AStream := TMemoryStream.Create;
AStream.WriteBuffer(ABytes[0], 10);
APack.Add('Stream').BytesFromStream(AStream, 0); // 直接从文件加载可以用BytesFromFile
FreeObject(AStream);
mmResult.Lines.Clear;
S := APack.AsString;
mmResult.Lines.Add('Text,Size(' + IntToStr(Length(S)) + 'B)');
mmResult.Lines.Add(S);
ABytes := APack.Encode;
mmResult.Lines.Add('Binary,Size(' + IntToStr(Length(ABytes)) + 'B)');
mmResult.Lines.Add(qstring.BinToHex(@ABytes[0], Length(ABytes)));
mmResult.Lines.Add('[AsString]');
mmResult.Lines.Add(APack.AsString);
mmResult.Lines.Add('[AsJson]');
mmResult.Lines.Add(APack.AsJson);
finally
APack.Free;
end;
end;

演示八(AMsgPack.SaveToFile):

procedure TForm2.Button3Click(Sender: TObject);
var
AMsgPack: TQMsgPack;
I, J: Integer;
S: TBytes;
str: String;
const
BinarySizes: array [0 .. 8] of Integer = (2, 3, 4, 6, 8, 15, 16,
65535, 65536);
begin
AMsgPack := TQMsgPack.Create;
try
for I := 0 to 8 do
begin
SetLength(S, BinarySizes[I]);
for J := 0 to BinarySizes[I] - 1 do
S[J] := J mod 255;
AMsgPack.Add('bin_' + IntToStr(BinarySizes[I]), S);
end;
// 浮点
AMsgPack.Add('single', 1.23);
AMsgPack.Add('double', 100.001);
// 整数
AMsgPack.Add('int_8_127', 127);
AMsgPack.Add('int_8_n1', -1);
AMsgPack.Add('int_8_n32', -32);
AMsgPack.Add('int_8_n128', -128);
AMsgPack.Add('int_8_255', 255);
AMsgPack.Add('int_16_w2', 32767);
AMsgPack.Add('int_16_n2', -32768);
AMsgPack.Add('int_32_w4', 32768);
AMsgPack.Add('int_32_n4', -32769);
AMsgPack.Add('int_64_w2', Int64(MaxInt) + 1);
AMsgPack.Add('int_64_n2', Int64(-MaxInt) - 10);
// 布尔
AMsgPack.Add('bool_true', true);
AMsgPack.Add('bool_false', False);
// NIL
AMsgPack.Add('null');
// 字符串
AMsgPack.Add('str_short', '0123456789012345678901234567890'); // 31
SetLength(str, 255);
for I := 1 to 254 do
str[I] := Char(Ord('a') + (I mod 32));
AMsgPack.Add('str_b255', str);
SetLength(str, 65535);
for I := 1 to 65534 do
str[I] := Char(Ord('a') + (I mod 32));
AMsgPack.Add('str_b65535', str);
SetLength(str, 65537);
for I := 1 to 65536 do
str[I] := Char(Ord('a') + (I mod 32));
AMsgPack.Add('str_b65537', str);
// Small array
with AMsgPack.Add('array_I8', mptArray) do
begin
for I := 0 to 14 do
Add.AsInteger := I;
end;
with AMsgPack.Add('array_U8', mptArray) do
begin
for I := 0 to 16 do
Add.AsInteger := I;
end;
with AMsgPack.Add('array_I16', mptArray) do
begin
for I := 0 to 320 do
Add.AsInteger := I;
end;
with AMsgPack.Add('array_I32', mptArray) do
begin
for I := 0 to 65536 do
Add.AsInteger := I;
end;
with AMsgPack.Add('submap_I8') do
begin
for I := 0 to 14 do
Add('item_' + IntToStr(I), I);
end;
with AMsgPack.Add('submap_U8') do
begin
for I := 0 to 16 do
Add('item_' + IntToStr(I), I);
end;
with AMsgPack.Add('submap_I16') do
begin
for I := 0 to 320 do
Add('item_' + IntToStr(I), I);
end;
with AMsgPack.Add('submap_I32') do
begin
for I := 0 to 65536 do
Add('item_' + IntToStr(I), I);
end;
if not dlgSave.Execute then
exit;
AMsgPack.SaveToFile(dlgSave.FileName);
finally
AMsgPack.Free;
end;
end;

演示九(加载RECORD)

procedure TForm2.Button6Click(Sender: TObject);
var
ARec, ARec1: TRttiTestSubRecord;
AMsgPack, ACopy, AItem: TQMsgPack;
begin
{$IFNDEF UNICODE}
ShowMessage('本功能在当前IDE中不受支持.');
{$ELSE}
ARec.Int64Val := 1;
ARec.UInt64Val := 2;
ARec.UStr := 'Test String';
ARec.AStr := 'AnsiString';
ARec.SStr := 'ShortString';
ARec.IntVal := 3;
ARec.MethodVal := Button2Click;
ARec.SetVal := [{$IFDEF UNICODE}TBorderIcon.{$ENDIF}biSystemMenu];
ARec.WordVal := 4;
ARec.ByteVal := 5;
ARec.ObjVal := Button2;
ARec.DtValue := Now;
ARec.CardinalVal := 6;
ARec.ShortVal := 7;
ARec.CurrVal := 8.9;
ARec.EnumVal := {$IFDEF UNICODE}TAlign.{$ENDIF}alTop;
ARec.CharVal := 'A';
ARec.VarVal := VarArrayOf(['VariantArray', 1, 2.5, true, False]);
SetLength(ARec.ArrayVal, 3);
ARec.ArrayVal[0] := 100;
ARec.ArrayVal[1] := 101;
ARec.ArrayVal[2] := 102;
AMsgPack := TQMsgPack.Create;
try
{$IFDEF UNICODE}
AItem := AMsgPack.Add('Record');
AItem.FromRecord(ARec);
ACopy := AItem.Copy;
ACopy.ItemByName('Int64Val').AsInt64 := 100;
ACopy.ItemByPath('UStr').AsString := 'UnicodeString-ByJson';
ACopy.ItemByPath('AStr').AsString := 'AnsiString-ByJson';
ACopy.ItemByPath('SStr').AsString := 'ShortString-ByJson';
ACopy.ItemByPath('EnumVal').AsString := 'alBottom';
ACopy.ItemByPath('SetVal').AsString := '[biHelp]';
ACopy.ItemByPath('ArrayVal').AsVariant := VarArrayOf([10, 30, 15]);
// 或者
// with ACopy.ItemByPath('ArrayVal') do
// begin
// Clear;
// Add.AsInteger:=10;
// Add.AsInteger:=30;
// Add.AsInteger:=15;
// end;
// ACopy.ItemByPath('VarVal').AsVariant:=VarArrayOf(['By Json',3,4,false,true]);
// ACopy.ToRecord<TRttiTestSubRecord>(ARec1);
FreeObject(ACopy);
AMsgPack.Add('NewRecord').FromRecord(ARec1);
{$ENDIF}
mmResult.Lines.Add(AMsgPack.AsString);
finally
AMsgPack.Free;
end;
{$ENDIF}
end;

QMsgPack的用法DEMO的更多相关文章

  1. Hystrix的用法demo

    1.引入依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId> ...

  2. easyui 之ComboTree 用法Demo

    实现效果如下: HTML部分: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="ser ...

  3. Java SPI机制用法demo

    ①构建一个maven工程 包含如下目录结构: src/main/java src/main/resources src/test/java src/test/resources ②在src/main/ ...

  4. Hibernate Validation与Spring整合各注解的用法Demo

    转自:https://www.aliyun.com/jiaocheng/1315650.html <dependency> <groupId>org.hibernate< ...

  5. TryParse用法示例

      int.Parse()是一种类型转换:表示将数字内容的字符串转为int类型.如果字符串为空,则抛出ArgumentNullException异常:如果字符串内容不是数字,则抛出FormatExce ...

  6. TryParse用法

    int.Parse()是一种类型转换:表示将数字内容的字符串转为int类型. 如果字符串为空,则抛出ArgumentNullException异常: 如果字符串内容不是数字,则抛出FormatExce ...

  7. jQuery第一篇 (帅哥)

      同学心目中的jQuery: 简单易用,功能强大,对移动端来说,体积稍大. 1.1 回顾前面学到的js我们遇到的一些痛点 window.onload 事件有个事件覆盖的问题,我们只能写一个 代码容错 ...

  8. cocos2d-x 观察者设计模式

    1.参考文章  http://blog.csdn.net/vanquishedzxl/article/details/23616535 class HelloWorld : public cocos2 ...

  9. 通过IL分析C#中的委托、事件、Func、Action、Predicate之间的区别与联系

    先说一下个人理解的结论吧: delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类. delegate声明的变量与delegate声明的事件,并没有本质的区别,事件是在dele ...

随机推荐

  1. DedeCms当前位置导航去掉最后的分隔符>

    DedeCms的当前位置导航调用标签{dede:field name=’position’ /},在栏目页里调用的当前位置导航,最后会出现分割符号“>”,如:主页 > DedeCms 模板 ...

  2. MVC公开课 – 1.基础 (2013-3-15广州传智MVC公开课)

    1.MVC设计模式 Model 是指 要处理的业务代码和数据操作代码 View 视图 主要是指的 跟用户打交道 并能够展示数据 Controller 看成是 Model和View的桥梁 优点: 1.1 ...

  3. AC日记——#2057. 「TJOI / HEOI2016」游戏 LOJ

    #2057. 「TJOI / HEOI2016」游戏 思路: 最大流: 代码: #include <cstdio> #include <cstring> #include &l ...

  4. 安装requests

    requests包让Python程序能够轻松地向网站请求信息以及检查返回的响应.要安装requests,请执行类似于下面的命令: $ pip3 install --user requests http ...

  5. Robot Framework自动化测试的应用

    Robot Framework自动化测试的应用(一) 最近尝试用Robot Framework代替之前全部采用python实现测试case,开始对Robot Framework进行些了解学习. 1. ...

  6. ArrayList to Array Conversion in Java

    ArrayList to Array Conversion in Java Following methods can be used for converting ArrayList to Arra ...

  7. Java Language Keywords

    Java Language Keywords 典型题目 true.false.null.sizeof.goto.synchronized 哪些是Java关键字?(goto.synchronized) ...

  8. BASH 的调试技巧

    平时在写 BASH 脚本时,总是会碰到让人抓狂的 BUG.和 C/C++ 这么丰富的调试工具相比,BASH 又有什么调试手段呢? 1 echo/print (普通技) 打印一些变量,或者提示信息.这应 ...

  9. 洛谷P2296 寻找道路 [拓扑排序,最短路]

    题目传送门 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...

  10. 洛谷P1099 BZOJ1999 树网的核 [搜索,树的直径]

    洛谷传送门,BZOJ传送门 树网的核 Description 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(treenetwork),其中V ...