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.