QMsgPack的用法DEMO
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的更多相关文章
- Hystrix的用法demo
1.引入依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId> ...
- easyui 之ComboTree 用法Demo
实现效果如下: HTML部分: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="ser ...
- Java SPI机制用法demo
①构建一个maven工程 包含如下目录结构: src/main/java src/main/resources src/test/java src/test/resources ②在src/main/ ...
- Hibernate Validation与Spring整合各注解的用法Demo
转自:https://www.aliyun.com/jiaocheng/1315650.html <dependency> <groupId>org.hibernate< ...
- TryParse用法示例
int.Parse()是一种类型转换:表示将数字内容的字符串转为int类型.如果字符串为空,则抛出ArgumentNullException异常:如果字符串内容不是数字,则抛出FormatExce ...
- TryParse用法
int.Parse()是一种类型转换:表示将数字内容的字符串转为int类型. 如果字符串为空,则抛出ArgumentNullException异常: 如果字符串内容不是数字,则抛出FormatExce ...
- jQuery第一篇 (帅哥)
同学心目中的jQuery: 简单易用,功能强大,对移动端来说,体积稍大. 1.1 回顾前面学到的js我们遇到的一些痛点 window.onload 事件有个事件覆盖的问题,我们只能写一个 代码容错 ...
- cocos2d-x 观察者设计模式
1.参考文章 http://blog.csdn.net/vanquishedzxl/article/details/23616535 class HelloWorld : public cocos2 ...
- 通过IL分析C#中的委托、事件、Func、Action、Predicate之间的区别与联系
先说一下个人理解的结论吧: delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类. delegate声明的变量与delegate声明的事件,并没有本质的区别,事件是在dele ...
随机推荐
- ASP.NET Core 2.0 MVC 发布部署--------- Ubuntun 16.04 X64 具体操作
.Net Core 部署到Ubuntu 16.04 中的步骤 1.安装工具 1.apache 2..Net Core(dotnet-sdk-2.0) 3.Supervisor(进程管理工具,目的是服务 ...
- Robust Online Visual Tracking with a Single Convolutional Neural Network
Abstract:这篇论文有三个贡献,第一提出了新颖的简化的结构损失函数,能保持尽量多的训练样本,通过适应模型输出的不确定性来减少跟踪误差累积风险. 第二是增强了普通的SGD,采用了暂时的选择策略来进 ...
- 数据分析python应用到的ggplot(二)
还是优达学院的第七课 数据:https://s3.amazonaws.com/content.udacity-data.com/courses/ud359/hr_by_team_year_sf_la. ...
- hbase学习(一)hbase简介
1.hadoop生态系统 2.hbase简介 非关系型数据库知识面扩展 cassandra.hbase.mongodb.redis couchdb,文件存储数据库 Neo4j非关系型图数据库 3.hb ...
- MVC 之AjaxHelper
http://www.cnblogs.com/jyan/archive/2012/07/23/2604958.html 除了传统的Ajax方法之外,MVC提供了AjaxHelper类: Helper ...
- jquery文档
http://jquery.cuishifeng.cn/selected_1.html
- java EE :Servlet 接口
Servlet 生命周期 : 调用当前 Servlet 类构造函数进行实例化 Servlet 通过调用 init () 方法进行初始化 Servlet 调用 service() 方法来处理客户端的请 ...
- 4. CMake 系列 - 项目添加编译选项
目录 1. 项目目录结构 2. 相关代码 2.1 add 模块 2.2 sub 模块 2.3 example 模块 2.4 顶层 CMakeLists.txt 3. 配置&编译 1. 项目目录 ...
- .NET基本权限系统框架源代码
DEMO下载地址: 百度网盘:http://pan.baidu.com/s/147ilj http://download.csdn.net/detail/shecixiong/5372895 一.开发 ...
- 为什么主引导记录的内存地址是0x7C00?
转自:http://www.ruanyifeng.com/blog/2015/09/0x7c00.html 当时,搭配的操作系统是86-DOS.这个操作系统需要的内存最少是32KB.我们知道,内存地址 ...