mirror of
https://github.com/HeidiSQL/HeidiSQL.git
synced 2026-03-13 09:24:25 +08:00
Revamp "Advanced table properties" dialog:
- Synchronize height of all listviews after moving the splitter on one page. - Drop maximum dimensions of form. - Store/restore form and list dimensions via registry - Documentation - Simplify code - Add useful popupmenu with items "Copy" + "Select all" to SynMemos which display the CREATE statements - Rely on modalresult of form, drop OnClick handler of Close-button - Format sum of table sizes using FormatByteNumber instead of always using KB as the unit of choice. - Add a statusbar to the form to signalize that the form can be resized.
This commit is contained in:
@@ -39,6 +39,9 @@ const
|
||||
REGNAME_DISPLAYEDCOLUMNS = 'DisplayedColumns';
|
||||
REGNAME_SORTDISPLAYEDCOLUMNS = 'DisplayedColumnsSorted';
|
||||
REGNAME_LISTTABLESCOLUMNNAMES = 'ListTablesColumnNames';
|
||||
REGNAME_TBLPROP_LISTHEIGHT = 'TablePropertiesListHeight';
|
||||
REGNAME_TBLPROP_FORMHEIGHT = 'TablePropertiesFormHeight';
|
||||
REGNAME_TBLPROP_FORMWIDTH = 'TablePropertiesFormWidth';
|
||||
|
||||
// how much memory we're aiming to use for the
|
||||
// data grid and it's automatic limit function
|
||||
|
||||
@@ -1,14 +1,11 @@
|
||||
object tbl_properties_form: Ttbl_properties_form
|
||||
Left = 611
|
||||
Top = 109
|
||||
Left = 771
|
||||
Top = 113
|
||||
BorderIcons = [biSystemMenu]
|
||||
BorderWidth = 5
|
||||
Caption = 'Table-Properties'
|
||||
ClientHeight = 339
|
||||
ClientWidth = 286
|
||||
ClientHeight = 415
|
||||
ClientWidth = 334
|
||||
Color = clBtnFace
|
||||
Constraints.MaxHeight = 550
|
||||
Constraints.MaxWidth = 450
|
||||
Constraints.MinHeight = 376
|
||||
Constraints.MinWidth = 304
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
@@ -18,34 +15,29 @@ object tbl_properties_form: Ttbl_properties_form
|
||||
Font.Style = []
|
||||
OldCreateOrder = False
|
||||
Position = poMainFormCenter
|
||||
OnClose = FormClose
|
||||
OnResize = FormResize
|
||||
OnShow = FormShow
|
||||
PixelsPerInch = 96
|
||||
TextHeight = 13
|
||||
object Bevel: TBevel
|
||||
Left = 0
|
||||
Top = 230
|
||||
Width = 286
|
||||
Height = 8
|
||||
Align = alBottom
|
||||
Shape = bsSpacer
|
||||
end
|
||||
object PageControl: TPageControl
|
||||
Left = 0
|
||||
Top = 0
|
||||
Width = 286
|
||||
Height = 230
|
||||
AlignWithMargins = True
|
||||
Left = 3
|
||||
Top = 3
|
||||
Width = 328
|
||||
Height = 286
|
||||
Margins.Bottom = 0
|
||||
Align = alClient
|
||||
HotTrack = True
|
||||
TabOrder = 0
|
||||
end
|
||||
object PanelSummary: TPanel
|
||||
Left = 0
|
||||
Top = 238
|
||||
Width = 286
|
||||
Height = 65
|
||||
Top = 289
|
||||
Width = 334
|
||||
Height = 107
|
||||
Align = alBottom
|
||||
BevelOuter = bvLowered
|
||||
BevelOuter = bvNone
|
||||
TabOrder = 1
|
||||
object LabelSizeOfTableData: TLabel
|
||||
Left = 8
|
||||
@@ -62,19 +54,17 @@ object tbl_properties_form: Ttbl_properties_form
|
||||
Caption = 'Size of Indexes:'
|
||||
end
|
||||
object LabelSizeOfTableDataValue: TLabel
|
||||
Left = 144
|
||||
Left = 112
|
||||
Top = 8
|
||||
Width = 134
|
||||
Height = 13
|
||||
Alignment = taRightJustify
|
||||
Caption = 'LabelSizeOfTableDataValue'
|
||||
end
|
||||
object LabelIndexesValue: TLabel
|
||||
Left = 188
|
||||
Left = 112
|
||||
Top = 24
|
||||
Width = 90
|
||||
Height = 13
|
||||
Alignment = taRightJustify
|
||||
Caption = 'LabelIndexesValue'
|
||||
end
|
||||
object LabelSum: TLabel
|
||||
@@ -91,11 +81,10 @@ object tbl_properties_form: Ttbl_properties_form
|
||||
ParentFont = False
|
||||
end
|
||||
object LabelSumValue: TLabel
|
||||
Left = 191
|
||||
Left = 112
|
||||
Top = 45
|
||||
Width = 88
|
||||
Height = 13
|
||||
Alignment = taRightJustify
|
||||
Caption = 'LabelSumValue'
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
@@ -104,26 +93,37 @@ object tbl_properties_form: Ttbl_properties_form
|
||||
Font.Style = [fsBold]
|
||||
ParentFont = False
|
||||
end
|
||||
end
|
||||
object PanelControl: TPanel
|
||||
Left = 0
|
||||
Top = 303
|
||||
Width = 286
|
||||
Height = 36
|
||||
Align = alBottom
|
||||
BevelOuter = bvNone
|
||||
TabOrder = 2
|
||||
object btnClose: TButton
|
||||
Left = 96
|
||||
Top = 9
|
||||
Width = 89
|
||||
Left = 112
|
||||
Top = 73
|
||||
Width = 97
|
||||
Height = 25
|
||||
Cancel = True
|
||||
Caption = 'Close'
|
||||
Default = True
|
||||
ModalResult = 1
|
||||
TabOrder = 0
|
||||
OnClick = btnCloseClick
|
||||
end
|
||||
end
|
||||
object StatusBar1: TStatusBar
|
||||
Left = 0
|
||||
Top = 396
|
||||
Width = 334
|
||||
Height = 19
|
||||
Panels = <>
|
||||
SimplePanel = True
|
||||
end
|
||||
object popupSynMemo: TPopupMenu
|
||||
Images = MainForm.ImageList1
|
||||
Left = 16
|
||||
Top = 24
|
||||
object Copy1: TMenuItem
|
||||
Action = MainForm.EditCopy1
|
||||
end
|
||||
object menuSelectAll: TMenuItem
|
||||
Caption = 'Select all'
|
||||
ShortCut = 16449
|
||||
OnClick = menuSelectAllClick
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -11,7 +11,7 @@ interface
|
||||
uses
|
||||
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
|
||||
StdCtrls, ComCtrls, HeidiComp, ExtCtrls, ZDataset, SynMemo, Synedit,
|
||||
VirtualTrees;
|
||||
VirtualTrees, Registry, Menus;
|
||||
|
||||
type
|
||||
Ttbl_properties_form = class(TForm)
|
||||
@@ -23,12 +23,16 @@ type
|
||||
LabelIndexesValue: TLabel;
|
||||
LabelSum: TLabel;
|
||||
LabelSumValue: TLabel;
|
||||
Bevel: TBevel;
|
||||
PanelControl: TPanel;
|
||||
StatusBar1: TStatusBar;
|
||||
btnClose: TButton;
|
||||
popupSynMemo: TPopupMenu;
|
||||
Copy1: TMenuItem;
|
||||
menuSelectAll: TMenuItem;
|
||||
procedure FormClose(Sender: TObject; var Action: TCloseAction);
|
||||
procedure FormShow(Sender: TObject);
|
||||
procedure btnCloseClick(Sender: TObject);
|
||||
procedure FormResize(Sender: TObject);
|
||||
procedure menuSelectAllClick(Sender: TObject);
|
||||
procedure SplitterMove(Sender: TObject);
|
||||
end;
|
||||
|
||||
function tbl_properties_Window(AOwner: TComponent): Boolean;
|
||||
@@ -40,6 +44,9 @@ uses
|
||||
|
||||
{$R *.DFM}
|
||||
|
||||
const
|
||||
DEFAULT_LISTHEIGHT = 150;
|
||||
|
||||
|
||||
{**
|
||||
Create form on demand
|
||||
@@ -56,9 +63,12 @@ begin
|
||||
end;
|
||||
|
||||
|
||||
{***
|
||||
|
||||
|
||||
{**
|
||||
Form gets displayed.
|
||||
- Setup dimensions of components
|
||||
- create one page + listview + synmemo for each selected table.
|
||||
- display data and CREATE TABLE statement
|
||||
- calculate the sum of their size
|
||||
}
|
||||
procedure Ttbl_properties_form.FormShow(Sender: TObject);
|
||||
var
|
||||
@@ -66,36 +76,40 @@ var
|
||||
t: Integer;
|
||||
ts: TTabSheet;
|
||||
list: TSortListView;
|
||||
ListTables: TVirtualStringTree;
|
||||
datasize: Int64;
|
||||
indexsize: Int64;
|
||||
isSelected: Boolean;
|
||||
FieldList: TStringList;
|
||||
splitter: TSplitter;
|
||||
synmemo: TSynMemo;
|
||||
query: TDataSet;
|
||||
Selected: TStringList;
|
||||
reg : TRegistry;
|
||||
listheight : Integer;
|
||||
begin
|
||||
ListTables := Mainform.Childwin.ListTables;
|
||||
|
||||
for i := (PageControl.PageCount - 1) downto 0 do
|
||||
begin
|
||||
PageControl.Pages[i].Free();
|
||||
end;
|
||||
|
||||
datasize := 0;
|
||||
indexsize := 0;
|
||||
listheight := DEFAULT_LISTHEIGHT;
|
||||
|
||||
query := Mainform.Childwin.GetResults( 'SHOW TABLE STATUS');
|
||||
|
||||
FieldList := TStringList.Create;
|
||||
for i := 0 to (query.FieldCount - 1) do
|
||||
begin
|
||||
FieldList.add( query.Fields[i].Fieldname );
|
||||
reg := TRegistry.Create;
|
||||
reg.OpenKey( REGPATH, true );
|
||||
try
|
||||
// Read values
|
||||
if reg.ValueExists( REGNAME_TBLPROP_LISTHEIGHT ) then
|
||||
listheight := reg.ReadInteger( REGNAME_TBLPROP_LISTHEIGHT );
|
||||
if reg.ValueExists( REGNAME_TBLPROP_FORMHEIGHT ) then
|
||||
Height := reg.ReadInteger( REGNAME_TBLPROP_FORMHEIGHT );
|
||||
if reg.ValueExists( REGNAME_TBLPROP_FORMWIDTH ) then
|
||||
Width := reg.ReadInteger( REGNAME_TBLPROP_FORMWIDTH );
|
||||
finally
|
||||
reg.CloseKey;
|
||||
reg.Free;
|
||||
end;
|
||||
|
||||
// Fetch selected nodes
|
||||
Selected := GetVTCaptions(ListTables, True);
|
||||
Selected := GetVTCaptions(Mainform.Childwin.ListTables, True);
|
||||
|
||||
query := Mainform.Childwin.GetResults( 'SHOW TABLE STATUS');
|
||||
|
||||
// for tables found
|
||||
for t := 0 to (query.RecordCount - 1) do
|
||||
@@ -127,11 +141,13 @@ begin
|
||||
// creates a splitter
|
||||
splitter := TSplitter.Create(self);
|
||||
splitter.Parent := ts;
|
||||
splitter.ResizeStyle := rsUpdate;
|
||||
splitter.OnMoved := SplitterMove;
|
||||
|
||||
// create a detailed properties list
|
||||
list := TSortListView.Create(self);
|
||||
list.Parent := ts;
|
||||
list.Height := 150;
|
||||
list.Height := listheight;
|
||||
list.ViewStyle := vsReport;
|
||||
list.ReadOnly := true;
|
||||
list.GridLines := true;
|
||||
@@ -151,11 +167,11 @@ begin
|
||||
|
||||
inc( datasize, StrToInt64Def(query.FieldByName('Data_length').AsString, 0) );
|
||||
inc( indexsize, StrToInt64Def(query.FieldByName('Index_length').AsString, 0) );
|
||||
for i:=0 to FieldList.count-1 do
|
||||
for i:=0 to query.FieldCount - 1 do
|
||||
begin
|
||||
with (list.Items.add) do
|
||||
begin
|
||||
Caption := FieldList[i];
|
||||
Caption := query.Fields[i].FieldName;
|
||||
SubItems.Add( query.Fields[i].AsString);
|
||||
end;
|
||||
end;
|
||||
@@ -175,7 +191,7 @@ begin
|
||||
synmemo.Font.Name := Mainform.Childwin.SynMemoQuery.Font.Name;
|
||||
synmemo.Font.Size := Mainform.Childwin.SynMemoQuery.Font.Size;
|
||||
synmemo.Lines.Text := Mainform.Childwin.GetVar( 'SHOW CREATE TABLE ' + Mainform.Childwin.mask(query.Fields[0].AsString), 1 );
|
||||
|
||||
synmemo.PopupMenu := popupSynMemo;
|
||||
|
||||
// realign the components to correct position
|
||||
list.Align := alTop;
|
||||
@@ -186,24 +202,87 @@ begin
|
||||
query.Next();
|
||||
end;
|
||||
|
||||
LabelSizeOfTableDataValue.Caption := FormatNumber(datasize div 1024) + ' KB';
|
||||
LabelIndexesValue.Caption := FormatNumber(indexsize div 1024) + ' KB';
|
||||
LabelSumValue.Caption := FormatNumber(datasize div 1024 + indexsize div 1024) + ' KB';
|
||||
LabelSizeOfTableDataValue.Caption := FormatByteNumber(datasize);
|
||||
LabelIndexesValue.Caption := FormatByteNumber(indexsize);
|
||||
LabelSumValue.Caption := FormatByteNumber(datasize + indexsize);
|
||||
end;
|
||||
|
||||
|
||||
procedure Ttbl_properties_form.btnCloseClick(Sender: TObject);
|
||||
{**
|
||||
Form closes. Store dimensions of relevant components.
|
||||
}
|
||||
procedure Ttbl_properties_form.FormClose(Sender: TObject; var Action:
|
||||
TCloseAction);
|
||||
var
|
||||
reg: TRegistry;
|
||||
i, listheight: Integer;
|
||||
begin
|
||||
Close();
|
||||
// Find height of dynamically created listviews
|
||||
listheight := DEFAULT_LISTHEIGHT;
|
||||
for i := 0 to ComponentCount-1 do
|
||||
begin
|
||||
if Components[i] is TListView then
|
||||
begin
|
||||
listheight := TListView(Components[i]).Height;
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
|
||||
reg := TRegistry.Create;
|
||||
reg.OpenKey( REGPATH, true );
|
||||
try
|
||||
// Save values
|
||||
reg.WriteInteger( REGNAME_TBLPROP_LISTHEIGHT, listheight );
|
||||
reg.WriteInteger( REGNAME_TBLPROP_FORMHEIGHT, Height );
|
||||
reg.WriteInteger( REGNAME_TBLPROP_FORMWIDTH, Width );
|
||||
finally
|
||||
reg.CloseKey;
|
||||
reg.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
{**
|
||||
Form has been resized. Adjust position of Close-button.
|
||||
}
|
||||
procedure Ttbl_properties_form.FormResize(Sender: TObject);
|
||||
begin
|
||||
btnClose.Left := PanelControl.Width div 2 - (btnClose.Width div 2);
|
||||
|
||||
LabelSizeOfTableDataValue.Left := PanelSummary.Width - LabelSizeOfTableDataValue.Width - 8;
|
||||
LabelIndexesValue.Left := PanelSummary.Width - LabelIndexesValue.Width - 8;
|
||||
LabelSumValue.Left := PanelSummary.Width - LabelSumValue.Width - 8;
|
||||
btnClose.Left := PanelSummary.Width div 2 - (btnClose.Width div 2);
|
||||
end;
|
||||
|
||||
|
||||
{**
|
||||
Select all text in a synmemo
|
||||
}
|
||||
procedure Ttbl_properties_form.menuSelectAllClick(Sender: TObject);
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
for i := 0 to ComponentCount - 1 do
|
||||
begin
|
||||
if (Components[i] is TSynMemo) and (TSynMemo(Components[i]).Parent = PageControl.ActivePage) then
|
||||
begin
|
||||
TSynMemo(Components[i]).SelectAll;
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
{**
|
||||
Splitter between list and synmemo was moved.
|
||||
Move all other splitters to the same position
|
||||
}
|
||||
procedure Ttbl_properties_form.SplitterMove(Sender: TObject);
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
for i := 0 to ComponentCount-1 do
|
||||
begin
|
||||
if Components[i] is TListView then
|
||||
TSortListView(Components[i]).Height := TSplitter(Sender).Top;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
end.
|
||||
|
||||
Reference in New Issue
Block a user