ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Delphi 生成前端TreeView Json数据

2022-04-09 03:31:54  阅读:433  来源: 互联网

标签:begin end String level Delphi FDQuery Json TreeView children


前面的树形图,也就是TreeView一般读取的都是Json数据

例如

[{dispCode:01,dispName:'上级1, children: [

      {dispCode:0101,dispname:'子级1' },       {dispCode:0102,dispname:'子级2' },     ] }]

下面代码,读取的数据表里需要有以下字段 

DispCode:编码 DispName:名称  level_num:级次

实现思路是先生成一个个对象(TeleItem),再将对象转化成JSONObject对象,再输出JSON文本。

可以调用REs.jSON里的TJson.ObjectToJsonString直接生成JSON文本,但是他会给输入增加一个Name叫XXXhelper。不是我要的。所以最终只能先自行将

TeleItem生成JSONObject再将jsonobjct生成Jsonobject。

Teleitem

实现代码

  1 unit UntTree;
  2 
  3 interface
  4 uses System.Generics.Collections, FireDAC.Comp.Client,JSON,REST.Json,System.SysUtils;
  5 type
  6   TeleItem=class
  7     dispcode:string;    //编码
  8     dispName:String;      //名称
  9     level_num:integer;     //级次
 10     children:TList<Teleitem>;    //子级
 11     destructor Destroy; override;
 12 
 13   end;
 14 
 15 
 16 function IntTree(FDQuery:TFDQuery;tableName,SetCode:String):String;    //方法1  先生成Teleitem再生成Jsonobject
 17 function LoadEleTree(FDQuery:TFDQuery;tableName,SetCode:String):String;    //方法2 直接生成Jsonobject
 18 
 19 implementation
 20 function LoadEleTree(FDQuery:TFDQuery;tableName,SetCode:String):String;
 21 var
 22  FJOlist:TList<TJSONObject>;
 23  FJData:TJSONObject;
 24  I,levelnum,J:integer;
 25  cDispCode:string;
 26  JOParent,JO:TJsonObject;
 27  JaData,Children:TJSONArray;
 28  begin
 29   FJData:=TJsonObject.Create;
 30   FJOlist:=TList<TJSONObject>.Create;
 31   JaData:=TJSONArray.Create;
 32   FJData.AddPair('data',JaData);
 33   FDQuery.Close;
 34   FDQuery.open('select * from '+tableName +' where set_Code='''+setCode+''' and is_leaf<>10');
 35   FDQuery.FetchAll;
 36   while Not FDQuery.Eof do
 37    begin
 38      try
 39         JO:=TJSONObject.Create;
 40        J:=FDQuery.FieldByName('level_num').AsInteger;
 41        cDispCode:=FDQuery.FieldByName('disp_Code').asstring;
 42        JO.AddPair('DispCode',cdispCode);
 43        JO.AddPair('DispName',FDQuery.FieldByName('disp_Name').asstring);
 44        JO.AddPair('LevelNum',INTTOSTR(J));
 45 
 46        FJOlist.Add(JO);
 47         if FDQuery.FieldByName('level_num').asinteger<>1 then
 48            begin
 49              for  I := 0 to FJOlist.Count-1 do
 50               begin
 51                JOParent:=FJOlist[I];
 52                levelnum:=JOParent.Values['LevelNum'].Value.tointeger;
 53               if levelnum+1<>J then Continue;
 54                 var dispCode:=JOParent.Values['DispCode'].Value;
 55                 if Pos(dispcode,cdispCode)=1 then
 56                  begin
 57                    if not Assigned(JOParent.Values['Children']) then
 58                      begin
 59                        Children:=TJSONArray.Create;
 60                        JOParent.AddPair('Children',Children);
 61                      end else
 62                      Children:=JOParent.Values['Children'] as TJSONArray;
 63                    Children.Add(JO);
 64                    break;
 65                  end;
 66               end;
 67            end else
 68          JaData.Add(JO);
 69      finally
 70        FDQuery.Next;
 71      end;
 72    end;
 73   Result:=FJData.ToJSON();
 74   FJData.Free;
 75   FJOlist.Free;
 76  end;
 77 function IntTree(FDQuery:TFDQuery;tableName,SetCode:String):String;
 78 var
 79   I:integer;
 80   dispcode:String;
 81   Data:TJSONObject;
 82   FList,FTree:TList<TeleItem>;
 83    {$REGION 'ConvertToObject'}
 84     procedure ConvertToObject(Item:Teleitem;var Perent:TJSONArray);
 85     var
 86      aItem:TJSONObject;
 87      I:Integer;
 88 
 89      begin
 90       aitem:=TJSONObject.Create;
 91       aitem.AddPair('dispcode',item.dispcode);
 92       aitem.AddPair('dispname',item.dispname);
 93       Perent.add(aitem);
 94       IF Not Assigned(Item.children) then Exit;
 95       var P:=TJSONArray.Create;
 96       aitem.AddPair('children',P);
 97       For I:=0 to item.children.count-1 do
 98        begin
 99          ConvertToObject(item.children[I],P);
100        end;
101 
102      end;
103    {$ENDREGION 'ConvertToObject'}
104  begin
105     FDQuery.Close;
106     FDQuery.open('select * from '+tableName +' where set_Code='''+setCode+''' and is_leaf<>10');
107     FDQuery.FetchAll;
108     FList:=TList<Teleitem>.create;
109     FTree:=TList<Teleitem>.create;
110     while Not FDQuery.eof do
111      begin
112        try
113          Var AEle:=TEleitem.create;
114             aEle.dispCode:=FDQuery.FieldByName('disp_Code').asstring;
115             aele.dispName:=FDQuery.fieldByName('disp_Name').asstring;
116             AEle.level_num:=FDQuery.FieldByName('level_num').asinteger;
117             FList.Add(AEle);
118             if FDQuery.FieldByName('level_num').asinteger<>1 then
119              begin
120                for I := 0 to Flist.Count-1 do
121                 begin
122                 if Flist[I].level_num+1<>AEle.level_num then Continue;
123                   dispCode:=Flist[I].dispCode;
124                   if Pos(dispcode,aEle.dispCode)=1 then
125                    begin
126                      if not Assigned(Flist[I].children) then
127                        Flist[I].children:=TList<Teleitem>.create;
128                      FList[I].children.Add(aele);
129                      break;
130                    end;
131 
132                 end;
133               end else
134               FTree.Add(Aele);
135        finally
136          FDQuery.Next;
137        end;
138      end;
139 
140     Data:=TJSONObject.create;
141     var P:=TJSONArray.Create;
142     data.AddPair('data',P);
143     for I := 0 to FTree.Count-1 do
144      begin
145       ConvertToObject(FTree[I],P);
146      end;
147    Result:=data.ToJSON();
148    data.Free;
149    for I :=FList.count-1 downto 0 do
150     begin
151       Flist[I].Free;
152     end;
153     FList.Free;
154     FTree.Free;
155  end;
156 { TeleItem }
157 
158 destructor TeleItem.Destroy;
159 begin
160   if Self.children<>nil then
161     Self.children.Free;
162 end;
163 
164 end.

最终的结果如下,是一个json文本,然后前端如何生成Tree,自行研究

 

标签:begin,end,String,level,Delphi,FDQuery,Json,TreeView,children
来源: https://www.cnblogs.com/wuxi15/p/16120696.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有