⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbinfofrm.pas

📁 delphi本地数据库引擎
💻 PAS
📖 第 1 页 / 共 2 页
字号:
unit DBInfoFrm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics,
  Controls, Forms, Dialogs, ExtCtrls, ComCtrls,
  Db, TinyDB, ImgList, Menus, BaseFrm;

type
  TNodeType = (ntTable, ntField, ntIndex);
  PNodeData = ^TNodeData;
  TNodeData = record
    NodeType: TNodeType;
    TableName: string;
    SelfName: string;
  end;

  TDBInfoForm = class(TBaseForm)
    DBStructTreeView: TTreeView;
    TinyTable: TTinyTable;
    ImageList: TImageList;
    TablePopupMenu: TPopupMenu;
    TableMenuOpenItem: TMenuItem;
    TableMenuDeleteItem: TMenuItem;
    TableMenuRenameItem: TMenuItem;
    TableMenuN1: TMenuItem;
    TableMenuRefreshItem: TMenuItem;
    TableMenuN2: TMenuItem;
    TableMenuNewItem: TMenuItem;
    FieldPopupMenu: TPopupMenu;
    FieldMenuRenameItem: TMenuItem;
    FieldMenuN1: TMenuItem;
    FieldMenuRefreshItem: TMenuItem;
    FieldMenuN2: TMenuItem;
    FieldMenuNewItem: TMenuItem;
    IndexPopupMenu: TPopupMenu;
    IndexMenuRenameItem: TMenuItem;
    IndexMenuN1: TMenuItem;
    IndexMenuRefreshItem: TMenuItem;
    IndexMenuN2: TMenuItem;
    IndexMenuNewItem: TMenuItem;
    IndexMenuDeleteItem: TMenuItem;
    TableMenuEmptyItem: TMenuItem;
    FieldMenuPropItem: TMenuItem;
    IndexMenuPropItem: TMenuItem;
    TableMenuDesignItem: TMenuItem;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure DBStructTreeViewMouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure TableMenuOpenItemClick(Sender: TObject);
    procedure TableMenuRenameItemClick(Sender: TObject);
    procedure TableMenuRefreshItemClick(Sender: TObject);
    procedure TableMenuNewItemClick(Sender: TObject);
    procedure TableMenuDeleteItemClick(Sender: TObject);
    procedure TableMenuEmptyItemClick(Sender: TObject);
    procedure IndexMenuDeleteItemClick(Sender: TObject);
    procedure IndexMenuRenameItemClick(Sender: TObject);
    procedure DBStructTreeViewEditing(Sender: TObject; Node: TTreeNode;
      var AllowEdit: Boolean);
    procedure DBStructTreeViewEdited(Sender: TObject; Node: TTreeNode;
      var S: String);
    procedure FieldMenuRenameItemClick(Sender: TObject);
    procedure FieldMenuPropItemClick(Sender: TObject);
    procedure IndexMenuPropItemClick(Sender: TObject);
    procedure DBStructTreeViewDblClick(Sender: TObject);
    procedure TableMenuDesignItemClick(Sender: TObject);
  private
    { Private declarations }
    FTinyDatabase: TTinyDatabase;
    FCurNodeData: TNodeData;
    FCurNode: TTreeNode;

    procedure FillDBStructToTreeView;
    procedure AddNodeData(TreeNode: TTreeNode; NodeType: TNodeType; TableName, SelfName: string);
    procedure FreeNodeData(TreeNode: TTreeNode);
    procedure ClearNodeData;
    function GetNodeData(TreeNode: TTreeNode): TNodeData;
  public
    { Public declarations }
    procedure SetData(ATinyDB: TTinyDatabase);
    procedure InvokeNewTableForm;
    procedure RefreshDBInfo;
    procedure OpenTable(TableName: string);
    procedure DeleteTable(TableName: string);
    procedure EmptyTable(TableName: string);
    procedure DesignTable(TableName: string);
    procedure LocateNodeOfTableName(TableName: string);
    procedure DeleteIndex(TableName, IndexName: string);
    procedure RenameTable(OldTableName, NewTableName: string);
    procedure RenameField(TableName, OldFieldName, NewFieldName: string);
    procedure RenameIndex(TableName, OldIndexName, NewIndexName: string);
    procedure RefreshFormOfTableName(TableName: string);
    procedure CloseFormOfTableName(TableName: string);
    procedure CloseAllTable;
    procedure ExportDBToText(FileName: string);
  end;

var
  DBInfoForm: TDBInfoForm;

procedure ShowDBInfoForm(ATinyDB: TTinyDatabase);

implementation

uses
  LangMgr, MainFrm, DBTableFrm, DBGridFrm, DBCardFrm, NewTableFrm,
  FieldPropFrm, IndexPropFrm, TableListFrm;

{$R *.DFM}

procedure ShowDBInfoForm(ATinyDB: TTinyDatabase);
begin
  if DBInfoForm = nil then
  begin
    DBInfoForm := TDBInfoForm.Create(Application);
    DBInfoForm.ManualDock(MainForm.LeftDockPanel);
  end;
  DBInfoForm.CloseAllTable;
  DBInfoForm.SetData(ATinyDB);
  DBInfoForm.Show;
end;

procedure TDBInfoForm.FormClose(Sender: TObject; var Action: TCloseAction);
var
  I: Integer;
begin
  if (HostDockSite is TPanel) then
    MainForm.ShowDockPanel(HostDockSite as TPanel, False, nil);

  MainForm.AdjustUI(False);
  for I := 0 to FTinyDatabase.TableDefs.Count - 1 do
    CloseFormOfTableName(FTinyDatabase.TableDefs[I].Name);
  ClearNodeData;
  FTinyDatabase.Close;
  Action := caFree;
  DBInfoForm := nil;
end;

procedure TDBInfoForm.SetData(ATinyDB: TTinyDatabase);
begin
  FTinyDatabase := ATinyDB;
  TinyTable.DatabaseName := FTinyDatabase.DatabaseName;
  FillDBStructToTreeView;
end;

procedure TDBInfoForm.InvokeNewTableForm;
begin
  if ShowNewTableForm then
    FillDBStructToTreeView;
end;

procedure TDBInfoForm.RefreshDBInfo;
begin
  FillDBStructToTreeView;
end;

procedure TDBInfoForm.OpenTable(TableName: string);
var
  Value: TDBTableFormData;
begin
  Value.TinyDatabase := FTinyDatabase;
  Value.TableName := TableName;
  case MainForm.OpenTableMode of
    otGrid:
      ShowDBGridForm(Value);
    otCard:
      ShowDBCardForm(Value);
  end;
  LocateNodeOfTableName(TableName);
end;

procedure TDBInfoForm.DeleteTable(TableName: string);
var
  R: Integer;
begin
  R := Application.MessageBox(PChar(AppLangMgr.Trans('Are you sure to delete?')), PChar(Application.Title), 36);
  if R = ID_YES then
  begin
    CloseFormOfTableName(TableName);
    FTinyDatabase.DeleteTable(TableName);
    FillDBStructToTreeView;
  end;
end;

procedure TDBInfoForm.EmptyTable(TableName: string);
var
  R: Integer;
begin
  R := Application.MessageBox(PChar(AppLangMgr.Trans('Are you sure to clear all records?')), PChar(Application.Title), 36);
  if R = ID_YES then
  begin
    TinyTable.TableName := TableName;
    TinyTable.Open;
    TinyTable.EmptyTable;
    TinyTable.Close;
    RefreshFormOfTableName(TableName);
  end;
end;

procedure TDBInfoForm.DesignTable(TableName: string);
begin
  CloseFormOfTableName(TableName);
  if ShowDesignTableForm(FTinyDatabase, TableName) then
    FillDBStructToTreeView;
end;

procedure TDBInfoForm.FillDBStructToTreeView;
const
  FieldsStr = 'Fields';
  IndexesStr = 'Indexes';
var
  I, J: Integer;
  TableNode, FieldNode, IndexNode, TempNode: TTreeNode;
  TableName, FieldName, IndexName: string;
begin
  TinyTable.Close;
  TinyTable.DatabaseName := FTinyDatabase.DatabaseName;
  DBStructTreeView.Items.BeginUpdate;
  ClearNodeData;
  DBStructTreeView.Items.Clear;
  for I := 0 to FTinyDatabase.TableDefs.Count - 1 do
  begin
    TableName := FTinyDatabase.TableDefs[I].Name;
    TableNode := DBStructTreeView.Items.AddChild(nil, TableName);
    TableNode.ImageIndex := 0;
    TableNode.SelectedIndex := 0;
    AddNodeData(TableNode, ntTable, TableName, TableName);

    FieldNode := DBStructTreeView.Items.AddChild(TableNode, FieldsStr);
    FieldNode.ImageIndex := 1;
    FieldNode.SelectedIndex := 1;
    FieldNode.Data := nil;

    IndexNode := DBStructTreeView.Items.AddChild(TableNode, IndexesStr);
    IndexNode.ImageIndex := 2;
    IndexNode.SelectedIndex := 2;
    IndexNode.Data := nil;

    TinyTable.TableName := TableName;
    TinyTable.Open;
    for J := 0 to TinyTable.FieldDefs.Count - 1 do
    begin
      FieldName := TinyTable.FieldDefs[J].Name;
      TempNode := DBStructTreeView.Items.AddChild(FieldNode, FieldName);
      TempNode.ImageIndex := 1;
      TempNode.SelectedIndex := 1;
      AddNodeData(TempNode, ntField, TableName, FieldName);
    end;
    for J := 0 to TinyTable.IndexDefs.Count - 1 do
    begin
      IndexName := TinyTable.IndexDefs[J].Name;
      TempNode := DBStructTreeView.Items.AddChild(IndexNode, IndexName);
      TempNode.ImageIndex := 2;
      TempNode.SelectedIndex := 2;
      AddNodeData(TempNode, ntIndex, TableName, IndexName);
    end;
    TinyTable.Close;
  end;
  DBStructTreeView.Items.EndUpdate;
  DBStructTreeView.FullExpand;
end;

procedure TDBInfoForm.AddNodeData(TreeNode: TTreeNode; NodeType: TNodeType; TableName, SelfName: string);
var
  NodeDataPtr: PNodeData;
begin
  New(NodeDataPtr);
  NodeDataPtr^.NodeType := NodeType;
  NodeDataPtr^.TableName := TableName;
  NodeDataPtr^.SelfName := SelfName;
  TreeNode.Data := NodeDataPtr;
end;

procedure TDBInfoForm.FreeNodeData(TreeNode: TTreeNode);
begin
  if TreeNode.Data = nil then Exit;
  Dispose(PNodeData(TreeNode.Data));
end;

procedure TDBInfoForm.ClearNodeData;
var
  I: Integer;
begin
  for I := 0 to DBStructTreeView.Items.Count - 1 do
    FreeNodeData(DBStructTreeView.Items[I]);
end;

function TDBInfoForm.GetNodeData(TreeNode: TTreeNode): TNodeData;
begin
  Result := PNodeData(TreeNode.Data)^;
end;

procedure TDBInfoForm.RefreshFormOfTableName(TableName: string);
var
  I: Integer;
  DBTableForm: TDBTableForm;
  DBTableForms: array of TDBTableForm;
begin
  for I := 0 to MainForm.MDIChildCount - 1 do
  begin
    if MainForm.MDIChildren[I] is TDBTableForm then
    begin
      DBTableForm := MainForm.MDIChildren[I] as TDBTableForm;
      if DBTableForm.TableName = TableName then
      begin
        SetLength(DBTableForms, Length(DBTableForms) + 1);
        DBTableForms[High(DBTableForms)] := DBTableForm;
      end;
    end;
  end;
  for I := 0 to High(DBTableForms) do
    DBTableForms[I].TinyTable.Refresh;
  SetLength(DBTableForms, 0);
end;

procedure TDBInfoForm.CloseFormOfTableName(TableName: string);
var

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -