unit spDBTS_01_main; interface uses __DBTreeView_FireDac, _View_Text, ComObj, Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.Phys.SQLite, FireDAC.Phys.SQLiteDef, FireDAC.Stan.ExprFuncs, FireDAC.VCLUI.Wait, FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt, Vcl.ExtCtrls, Data.DB, FireDAC.Comp.DataSet, FireDAC.Comp.Client, Vcl.StdCtrls, Vcl.Grids, Vcl.DBGrids, Vcl.DBCtrls, Vcl.Buttons, Vcl.ComCtrls, Vcl.Samples.Spin, System.ImageList, Vcl.ImgList, Vcl.Menus; type TfMain = class(TForm) FDConn: TFDConnection; qTMP: TFDQuery; qTree1: TFDQuery; dsTree1: TDataSource; Panel1: TPanel; Panel2: TPanel; Panel3: TPanel; GroupBox1: TGroupBox; GroupBox2: TGroupBox; Splitter1: TSplitter; Splitter2: TSplitter; GroupBox3: TGroupBox; Panel4: TPanel; Label1: TLabel; sb_Refresh: TSpeedButton; DBNavigator_Scr: TDBNavigator; DBGrid_Tree: TDBGrid; TreeView1: TTreeView; ListBox_IdGuid: TListBox; qTree1id_guid: TStringField; qTree1id_parent_guid: TStringField; qTree1npp: TIntegerField; qTree1name_this: TStringField; qTree1level_this: TIntegerField; Panel5: TPanel; sbTreeRefresh: TSpeedButton; CheckBox_LevelMax: TCheckBox; Panel6: TPanel; se_LevMax: TSpinEdit; ImageList1: TImageList; qTree1pict_index: TIntegerField; MainMenu1: TMainMenu; N1: TMenuItem; N2: TMenuItem; N3: TMenuItem; N4: TMenuItem; N5: TMenuItem; N6: TMenuItem; N7: TMenuItem; N8: TMenuItem; N9: TMenuItem; N10: TMenuItem; N11: TMenuItem; procedure FDConnAfterConnect(Sender: TObject); procedure FDConnBeforeConnect(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure FormCreate(Sender: TObject); procedure sb_RefreshClick(Sender: TObject); procedure sbTreeRefreshClick(Sender: TObject); procedure ListBox_IdGuidClick(Sender: TObject); procedure TreeView1Click(Sender: TObject); procedure TreeView1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure qTree1AfterScroll(DataSet: TDataSet); procedure N7Click(Sender: TObject); procedure N3Click(Sender: TObject); procedure N5Click(Sender: TObject); procedure N9Click(Sender: TObject); procedure N11Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var fMain: TfMain; implementation {$R *.dfm} procedure TfMain.FormCreate(Sender: TObject); begin FDConn.Connected:=true; end; procedure TfMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose:=true; FDConn.Connected:=false; end; procedure TfMain.FDConnAfterConnect(Sender: TObject); begin sb_Refresh.Click; end; procedure TfMain.FDConnBeforeConnect(Sender: TObject); begin FDConn.Params.Values['Database'] := ExtractFilePath(ParamStr(0))+'spDBTreeView_SQLite.db'; end; procedure TfMain.qTree1AfterScroll(DataSet: TDataSet); begin if qTree1.Active then begin if DBGrid_Tree.Focused then begin TreeView1.Selected:=nil; ListBox_IdGuid.ItemIndex:=ListBox_IdGuid.Items.IndexOf(qTree1id_guid.AsString); if ListBox_IdGuid.ItemIndex>=0 then begin //................................. //Синхронизация ВЫБРАННОЙ строки в ListBox_IdGuid и TTreeView1 ListBox_IdGuid.SetFocus; TreeView_Synhro_by_ListBox(ListBox_IdGuid, TreeView1); DBGrid_Tree.SetFocus; //................................. end; end; end; end; procedure TfMain.ListBox_IdGuidClick(Sender: TObject); begin Application.ProcessMessages; //................................. //Синхронизация ВЫБРАННОЙ строки в ListBox_IdGuid и TTreeView1 TreeView_Synhro_by_ListBox(ListBox_IdGuid, TreeView1); //................................. //................................. //Синхронизация ВЫБРАННОЙ строки в ListBox_IdGuid и DBGrid_Tree if ListBox_IdGuid.ItemIndex>=0 then begin qTree1.Locate('id_guid', ListBox_IdGuid.Items[ListBox_IdGuid.ItemIndex], []); end; //................................. end; procedure TfMain.TreeView1Click(Sender: TObject); begin Application.ProcessMessages; //................................. //Синхронизация ВЫБРАННОГО узла TTreeView1 и строки в ListBox_IdGuid ListBox_Synhro_by_TreeView(TreeView1, ListBox_IdGuid); //................................. //................................. //Синхронизация ВЫБРАННОЙ строки в ListBox_IdGuid и DBGrid_Tree if ListBox_IdGuid.ItemIndex>=0 then begin qTree1.Locate('id_guid', ListBox_IdGuid.Items[ListBox_IdGuid.ItemIndex], []); end; //................................. end; procedure TfMain.TreeView1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Key=VK_PRIOR) or (Key=VK_NEXT) or (Key=VK_END) or (Key=VK_HOME) or (Key=VK_UP) or (Key=VK_DOWN) then begin //................................. //Синхронизация ВЫБРАННОГО узла TTreeView1 и строки в ListBox_IdGuid ListBox_Synhro_by_TreeView(TreeView1, ListBox_IdGuid); //................................. //................................. //Синхронизация ВЫБРАННОЙ строки в ListBox_IdGuid и DBGrid_Tree if ListBox_IdGuid.ItemIndex>=0 then begin qTree1.Locate('id_guid', ListBox_IdGuid.Items[ListBox_IdGuid.ItemIndex], []); end; //................................. end; end; procedure TfMain.sbTreeRefreshClick(Sender: TObject); var ParIdGuid:string; DeltaLev:integer; begin Application.ProcessMessages; ListBox_IdGuid.Items.Clear; TreeView1.Items.Clear; ParIdGuid:=qTree1id_guid.AsString; DeltaLev:=0; if CheckBox_LevelMax.Checked then DeltaLev:=se_LevMax.Value; if DeltaLev<0 then DeltaLev:=0; qTMP.Close; qTMP.SQL.Clear; Screen.Cursor:=crHourGlass; TRY Tree_CreateFromTableDB( qTMP, ParIdGuid, TreeView1, ListBox_IdGuid.Items, 'tree_01', 'id_guid', 'id_parent_guid', 'name_this', 'npp', //факультативно 'pict_index', //факультативно 'level_this', //факультативно DeltaLev //факультативно ); if TreeView1.Items.Count>0 then begin TreeView1.Selected:=TreeView1.Items[0]; TreeView1.Selected.Expand(true); end; FINALLY qTMP.Close; qTMP.SQL.Clear; Screen.Cursor:=crDefault; END; end; procedure TfMain.sb_RefreshClick(Sender: TObject); begin Application.ProcessMessages; ListBox_IdGuid.Items.Clear; TreeView1.Items.Clear; qTree1.Close; qTree1.Open; end; procedure TfMain.N9Click(Sender: TObject); Var List:TStrings; begin Application.ProcessMessages; List:=TStringList.Create; TRY TreeView_Node_Childs_to_TStrings( TreeView1, ListBox_IdGuid.Items, TreeView1.Selected, List, true ); View_Text(List.Text); FINALLY FreeAndNil(List); END; end; procedure TfMain.N11Click(Sender: TObject); Var sIdGuid:string; begin Application.ProcessMessages; sIdGuid:=IdGuid_Get; InputQuery('IdGuid','Скопируй в Clipboard',sIdGuid); end; procedure TfMain.N3Click(Sender: TObject); Var List:TStrings; begin Application.ProcessMessages; List:=TStringList.Create; TRY TreeView_SaveToTStrings(List, TreeView1); View_Text(List.Text); FINALLY FreeAndNil(List); END; end; procedure TfMain.N5Click(Sender: TObject); Var vExcel:Variant; vList:variant; begin Application.ProcessMessages; vExcel:=CreateOleObject('Excel.Application'); if not VarIsEmpty(vExcel) then begin vExcel.Visible:=1; if MessageDlg('Нажмите кнопку OK, если Excel запустился', mtConfirmation, mbOkCancel,0)=mrOk then begin vExcel.Workbooks.Add(); vList:=vExcel.ActiveWorkBook.WorkSheets.Add; if not VarIsEmpty(vList) then begin TreeView_SaveToExcel(TreeView1, vList); end; end; end; end; procedure TfMain.N7Click(Sender: TObject); begin Application.ProcessMessages; ListBox_IdGuid.Items.Clear; TreeView1.Items.Clear; end; end.