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. error: expected expression before ‘struct

    Linux C/C++编程时常会遇到“error: expected expression before ‘struct’”错误,此错误一般是由未定义的宏(宏里套宏)或参量引起,导致编译器判断当前语句 ...

  2. golang基础之一

    一.第一个go程序 package main import ( "fmt" ) func main(){ fmt.Println("hello world") ...

  3. Pylint在项目中的使用

    需求背景: Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准和有潜在问题的代码. Pylint 是一个 Python 工具,除了平常代码分析 ...

  4. Java学习笔记()ArrayList

    1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 动态的增加和减少元素 实现了ICollection和ILis ...

  5. 【Mac】Chrome中添加截图扩展插件FireShot方法

    FireShot是一款可以使用谷歌浏览器快速捕捉当前网页中元素的chrome截图插件,在谷歌浏览器中安装FireShot插件以后可以对网页中整个屏幕或者是网页的部分视图进行截图操作,在截图之后用户还可 ...

  6. copy深浅拷贝

    我们在很多方法里都看到copy()方法,这是对变量的复制,赋值,下面来看一下实例: 复制方法调用的是copy模块中的方法: import copy copy.copy()         #前拷贝 c ...

  7. out与ref修饰符

    out修饰符 定义 作用 使用注意 总结 定义 out意为output,所以被out修饰的参数叫做输出参数. 通过使用out修饰的参数,方法可以返回对应参数的值   作用 先看一个例子 定义变量:   ...

  8. Knockout简介

    1 Knockout简介 (Introduction) Knockout是一个轻量级的UI类库,通过应用MVVM模式使JavaScript前端UI简单化. Knockout有如下4大重要概念: 声明式 ...

  9. 转:VMMAP内存查看工具

    转:http://blog.csdn.net/woddle/article/details/45337767 下面我根据VMMap来详细介绍一下内存的分类. 内存是一个很复杂的系统,其中的paging ...

  10. pip安装报错解决

    使用pip安装docker-compose时报 unsupported operand type(s) for -=: 'Retry' and 'int' 错误,经过一番google后,发现使用升级s ...