unigui TUniTreeView demo
unit untTree;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, uniGUITypes, uniGUIAbstractClasses,
uniGUIClasses, uniGUIFrame, uniGUIBaseClasses, uniToolBar, uniTreeView,
Data.DB, Datasnap.DBClient, untEditBase, untDll;
type
PNodeRec = ^TNodeRec;
TNodeRec = record
id: string;
name: string;
pid: string;
end;
type
TfrmTree = class(TUniFrame)
UniToolBar1: TUniToolBar;
btnQuery: TUniToolButton;
btnAppend: TUniToolButton;
btnEdit: TUniToolButton;
btnDelete: TUniToolButton;
ClientDataSet1: TClientDataSet;
UniTreeView1: TUniTreeView;
btnExpand: TUniToolButton;
btnCollapse: TUniToolButton;
procedure btnExpandClick(Sender: TObject);
procedure btnCollapseClick(Sender: TObject);
procedure UniTreeView1Click(Sender: TObject);
private
{ Private declarations }
protected
procedure append(f: TfrmEditBase);
function Del(const table: string): Boolean;
procedure edit(f: TfrmEditBase);
procedure Query(const sql: string);
public
{ Public declarations }
end;
procedure CreateTree(dataset: TClientDataSet; treeview: TUniTreeView);
procedure FreeTree(treeview: TUniTreeView);
implementation
{$R *.dfm}
{ TfrmTree }
procedure CreateTree(dataset: TClientDataSet; treeview: TUniTreeView);
// table struct example: id,name,pid
var
List: TStringList;
Node: TUniTreeNode;
Index: Integer;
PNode: PNodeRec;
begin
treeview.Items.Clear;
List := TStringList.Create;
try
List.Sorted := True;
dataset.First;
while not dataset.Eof do
begin
PNode := new(PNodeRec);
PNode^.id := dataset.Fields[0].Text;
PNode^.name := dataset.Fields[1].Text;
PNode^.pid := dataset.Fields[2].Text;
if (dataset.Fields[2].Text = '') or
(dataset.Fields[0].Text = dataset.Fields[2].Text) then
// add root node
Node := treeview.Items.AddChild(nil, dataset.Fields[1].Text)
else
begin
// add child node
Index := List.IndexOf(dataset.Fields[2].Text);
Node := treeview.Items.AddChild(TUniTreeNode(List.Objects[Index]),
dataset.Fields[1].Text);
end;
Node.Data := PNode;
List.AddObject(dataset.Fields[0].Text, Node);
dataset.Next;
end;
finally
List.Free;
end;
end;
procedure FreeTree(treeview: TUniTreeView);
var
i: Integer;
Node: TUniTreeNode;
begin
for i := treeview.Items.Count - 1 downto 0 do
begin
Node := treeview.Items[i];
Dispose(PNodeRec(Node.Data));
end;
end;
procedure TfrmTree.append(f: TfrmEditBase);
begin
ClientDataSet1.append;
if UniTreeView1.Selected <> nil then
begin
ClientDataSet1.Fields[0].Text := PNodeRec(UniTreeView1.Selected.Data)^.id;
ClientDataSet1.Fields[2].Text := PNodeRec(UniTreeView1.Selected.Data)^.id;
end;
f.FClientDataSet := ClientDataSet1;
f.ShowModal(
procedure(Res: Integer)
begin
CreateTree(ClientDataSet1, UniTreeView1);
end);
end;
procedure TfrmTree.btnCollapseClick(Sender: TObject);
begin
UniTreeView1.FullCollapse;
end;
procedure TfrmTree.btnExpandClick(Sender: TObject);
begin
UniTreeView1.FullExpand;
end;
function TfrmTree.Del(const table: string): Boolean;
begin
if ClientDataSet1.IsEmpty then
Exit;
MessageDlg('是否删除?', mtConfirmation, mbYesNo,
procedure(Res: Integer)
begin
if Res = mrYes then
begin
ClientDataSet1.Delete;
if untDll.SaveData(table, ClientDataSet1.Delta) then
begin
ClientDataSet1.MergeChangeLog;
ShowMessage('删除成功');
end
else
ShowMessage('删除失败');
end;
end);
end;
procedure TfrmTree.edit(f: TfrmEditBase);
begin
if ClientDataSet1.IsEmpty then
Exit;
ClientDataSet1.edit;
f.FClientDataSet := ClientDataSet1;
f.ShowModal(
procedure(Res: Integer)
begin
CreateTree(ClientDataSet1, UniTreeView1);
end);
end;
procedure TfrmTree.Query(const sql: string);
begin
ClientDataSet1.Data := untDll.QuerySql(sql);
if ClientDataSet1.IsEmpty then
Exit;
CreateTree(ClientDataSet1, UniTreeView1);
end;
procedure TfrmTree.UniTreeView1Click(Sender: TObject);
begin
if not ClientDataSet1.IsEmpty then
ClientDataSet1.Locate(ClientDataSet1.Fields[0].FieldName,
VarArrayOf([PNodeRec(UniTreeView1.Selected.Data)^.id]), []);
end;
end.
unigui TUniTreeView demo的更多相关文章
- uniGUI试用笔记(十四)TUniTreeView的CheckBox
TUniTreeView目前版本没有封装CheckBox功能,所以需要手工处理,幸好0.99版提供部分代码了,修改过程如下: 1.uniGUIAbstractClasses.pas单元中修改基类TUn ...
- uniGUI试用笔记(二)
前几天做的demo今天启动后,浏览器打开页面后死活不显示窗体,找了半天原因才发现是360浏览器启动了兼容模式,改成极速模式后就正常了.有点晕.... 今天简单测试了TUniGUIServerModul ...
- 用uniGUI做B/S下业务系统的产品原型体验
从10月份到重庆工作后,一直忙于工作,感兴趣的几个方面的技术都处于暂停. 一个多月来,按照公司要求在做B/S集中式基卫产品的原型,主要是画原型图,开始是用Axure,弄来弄去感觉功能还是弱了些,尤其是 ...
- UNIGUI:How to redirect and close session?
Hello, i would have 2 unigui app. the first app is a simple authentification app and second will be ...
- unigui菜单【3】
unigui菜单TuniTreeView 根据数据库表中的内容,显示菜单的处理: function TMainForm.CreateMenu: Integer; var myMenuPoint : P ...
- unigui的session【1】
目前是1394. 明白session如何使用管理,看demo Session List和SessionTimeout unit Main; interface uses Windows, Messag ...
- uniGUI之学习方法(18)
官方例子D:\Program Files\FMSoft\Framework\uniGUI\Demos\Desktop 在Design里Main上右键,View as Form看到变化的属性. 看出变化 ...
- 通过一个demo了解Redux
TodoList小demo 效果展示 项目地址 (单向)数据流 数据流是我们的行为与响应的抽象:使用数据流能帮我们明确了行为对应的响应,这和react的状态可预测的思想是不谋而合的. 常见的数据流框架 ...
- 很多人很想知道怎么扫一扫二维码就能打开网站,就能添加联系人,就能链接wifi,今天说下这些格式,明天做个demo
有些功能部分手机不能使用,网站,通讯录,wifi基本上每个手机都可以使用. 在看之前你可以扫一扫下面几个二维码先看看效果: 1.二维码生成 网址 (URL) 包含网址的 二维码生成 是大家平时最常接触 ...
随机推荐
- HDU 1404 (博弈) Digital Deletions
首先如果第一个数字是0的话,那么先手必胜. 对于一个已知的先手必败状态,凡是能转移到先手必败的状态一定是必胜状态. 比如1是必败状态,那么2~9可以转移到1,所以是必胜状态. 10,10*,10**, ...
- Odoo 的库存管理与OpenERP之前的版本有了很大的不同,解读Odoo新的WMS模块中的新特性
原文来自:http://shine-it.net/index.php/topic,16409.0.html 库存移动(Stock Move)新玩法Odoo的库存移动不仅仅是存货在两个“存货地点”之间的 ...
- php开启curl扩展
配置方法: 1.拷贝PHP目录中的libeay32.dll 和 ssleay32.dll 两个文件到 system32 目录. 2.修改php.ini:配置好 extension_dir ,去掉 ex ...
- ffmpeg命令学习
1.组成 程序:ffmpeg.ffplay.ffprobe.ffserverffmpeg:转码程序ffplay:播放程序ffserver:服务器程序 库:libavcodec.libavdevice. ...
- POJ 1861 Network (MST)
题意:求解最小生成树,以及最小瓶颈生成树上的瓶颈边. 思路:只是求最小生成树即可.瓶颈边就是生成树上权值最大的那条边. //#include <bits/stdc++.h> #includ ...
- matplotlib 绘制柱状图的几个例子
1 error bar #!/usr/bin/env python # a bar plot with errorbars import numpy as np import matplotlib.p ...
- (六)6.12 Neurons Networks from self-taught learning to deep network
self-taught learning 在特征提取方面完全是用的无监督的方法,对于有标记的数据,可以结合有监督学习来对上述方法得到的参数进行微调,从而得到一个更加准确的参数a. 在self-taug ...
- size_type、size_t、differentce_type以及ptrdiff_t
目录(?)[-] size_type size_t different_type ptrdiff_t size_t是unsigned类型,用于指明数组长度或下标,它必须是一个正数,std::siz ...
- ASCII和16进制
所谓的ASCII和16进制都只是概念上的东西,在计算机中通通是二进制 转换应该是输出的转换,同样是一个数,在计算机内存中表示是一样的,只是输出不一样ASCII是针对字符的编码,几乎是键盘上的字符的编码 ...
- open file 值修改
有时候在程序里面需要打开多个文件,进行分析,系统一般默认数量是1024,(用ulimit -a可以看到)对于正常使用是够了,但是对于程序来讲,就太少了. 修改办法: 重启就OK 修改2个文件. 1./ ...