📄 dbinfofrm.pas
字号:
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 + -