SQLite3 读写 TreeView!

这篇博客介绍了如何使用SQLite3数据库中的数据构建并显示在TreeView组件上。通过读取DataTable表,根据Parent字段来确定节点的层级关系,实现数据的树形结构展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, fcTreeView,SQLiteTable3, StdCtrls, ImgList, ComCtrls;


type
    TPItem = Record    //表中记录的类型
       Sign:Integer;
       Caption:string;
       Parent:Integer;

    end;


    PItem = ^TPItem;  //指向极开路的指针


    TForm1 = class(TForm)
    fcTreeView2: TfcTreeView;
    fcTreeView1: TfcTreeView;
    ImageList1: TImageList;
    Button1: TButton;
    Button4: TButton;
    function  FindParentNode(Id:Integer):TfcTreeNode;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  slDBpath: string;
  sldb: TSQLiteDatabase;
  sltb: TSQLIteTable;
  sSQL: String;
  Node :TfcTreeNode;

  Nodes:TfcTreeNodes;


implementation

{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
   slDBPath := ExtractFilepath(Application.exename)+ 'ReadAndWrite.db';
   sldb := TSQLiteDatabase.Create(slDBPath);
   try  //ID ,Caption 为节点的内容, parent 为父节点的编号 , Next 为同级下一个节点的编号
      if not sldb.TableExists('DataTable') then  //  DtaTable数据库中的表
      begin
          sSQL := 'CREATE TABLE DataTable ([ID] INTEGER PRIMARY KEY AUTOINCREMENT,[Sign] INTEGER NULL,[Caption] VARCHAR(255),'
          +'[Parent] INTEGER NULL);';
          sldb.execsql(sSQL);
      end;
   Except
       exit;
   end;
end;

//保存节点到数据库中!
procedure TForm1.Button1Click(Sender: TObject);
var
   I:Integer;
   PI:PItem;
   Record1:TPItem;
begin
   slDBPath := ExtractFilepath(Application.exename)+ 'ReadAndWrite.db';
   sldb := TSQLiteDatabase.Create(slDBPath);
   sldb.BeginTransaction;
   for I := 0 to fcTreeView2.Items.Count-1 do
   begin
      Record1.Sign:= I ;
      fcTreeView2.Items.Item[I].StringData := IntToStr(I);
      Record1.Caption := fcTreeView2.Items.Item[I].Text;
      if fcTreeView2.Items.Item[I].Parent <> nil then
         Record1.Parent := StrToInt(fcTreeView2.Items.Item[I].Parent.StringData)
      else
         Record1.Parent := -1;
      PI := @Record1;
   sSQL := 'INSERT INTO DataTable(Sign,Caption,Parent)VALUES('
       +IntToStr(PI.Sign)+',"'
       +PI.Caption+'",'
       +IntToStr(PI.Parent)+');';
   sldb.ExecSQL(utf8encode(sSQL));
   end;
   sldb.Commit;

end;

//找父节点

function TForm1.FindParentNode(Id:Integer):TfcTreeNode;
var
    I:Integer;
begin
   Result := nil;
   for i := 0 to fcTreeView1.Items.Count - 1 do
   begin
      if Integer(fcTreeView1.Items.Item[I].Data) = id then
      begin
         Result := fcTreeView1.Items[I];
         Break;
      end;
   end;

end;

//读取数据库 构造树

procedure TForm1.Button2Click(Sender: TObject);

begin

 try
   fcTreeView1.Items.BeginUpdate;
   fcTreeView1.Items.Clear;
      sltb :=slDb.GetTable('SELECT *FROM DataTable Order By Parent');
   while not sltb.EOF do
   begin
        if sltb.FieldAsInteger(sltb.FieldIndex['Parent'])= -1 then
        begin
           fcTreeView1.Items.AddObject(nil,sltb.FieldAsString(sltb.FieldIndex['Caption']),Pointer(sltb.FieldAsInteger(sltb.FieldIndex['Sign'])));
        end
        else
     begin
        Node := FindParentNode(sltb.FieldAsInteger(sltb.FieldIndex['Parent']));
           if Node <> nil then
           begin
              fcTreeView1.Items.AddChildObject(Node,sltb.FieldAsString(sltb.FieldIndex['Caption']),Pointer(sltb.FieldAsInteger(sltb.FieldIndex['Sign'])));
           end;
     end;
        sltb.Next;
   end;
 finally
       sltb.Free;
       fcTreeview1.Items.EndUpdate;
 end;

end.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值