mirror of
https://github.com/HeidiSQL/HeidiSQL.git
synced 2025-08-06 18:24:26 +08:00

* Don't try to access a passed tree if it has been destroyed by some earlier event. * Don't try to access registry in DoDisconnect after key has been closed. * Now that DoDisconnect lives in FormDestroy it is save to call it slightly earlier, before registry has been closed. There should be no later paint events which will trigger random database queries.
200 lines
5.0 KiB
ObjectPascal
200 lines
5.0 KiB
ObjectPascal
unit column_selection;
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows, Classes, Controls, Forms, StdCtrls, CheckLst, ExtCtrls, Contnrs,
|
|
helpers;
|
|
|
|
type
|
|
TColumnSelectionForm = class(TForm)
|
|
pnlBevel: TPanel; // This panel has the only duty to display a normal border at the edges of the form
|
|
btnCancel: TButton;
|
|
btnOK: TButton;
|
|
chkSelectAll: TCheckBox;
|
|
chklistColumns: TCheckListBox;
|
|
chkSort: TCheckBox;
|
|
procedure btnCancelClick(Sender: TObject);
|
|
procedure FormShow(Sender: TObject);
|
|
procedure chklistColumnsClickCheck(Sender: TObject);
|
|
procedure chkSelectAllClick(Sender: TObject);
|
|
procedure btnOKClick(Sender: TObject);
|
|
procedure chkSortClick(Sender: TObject);
|
|
procedure FormClose(Sender: TObject; var Action: TCloseAction);
|
|
procedure FormDeactivate(Sender: TObject);
|
|
procedure FormCreate(Sender: TObject);
|
|
private
|
|
{ Private declarations }
|
|
public
|
|
{ Public declarations }
|
|
end;
|
|
|
|
var
|
|
reg_name : String;
|
|
|
|
implementation
|
|
|
|
uses main;
|
|
|
|
|
|
{$R *.dfm}
|
|
|
|
|
|
|
|
procedure TColumnSelectionForm.FormCreate(Sender: TObject);
|
|
begin
|
|
InheritFont(Font);
|
|
end;
|
|
|
|
|
|
{**
|
|
FormShow
|
|
}
|
|
procedure TColumnSelectionForm.FormShow(Sender: TObject);
|
|
var
|
|
i: Integer;
|
|
begin
|
|
for i:=0 to Mainform.SelectedTableColumns.Count-1 do
|
|
chklistColumns.Items.Add(Mainform.SelectedTableColumns[i].Name);
|
|
|
|
// Check items!
|
|
if Mainform.DataGridHiddenColumns.Count = 0 then // Simply check all items
|
|
ToggleCheckListBox( chklistColumns, True )
|
|
else // Only check selected items
|
|
ToggleCheckListBox( chklistColumns, False, Mainform.DataGridHiddenColumns );
|
|
|
|
// Call check-event to update state of "Select / Deselect all" checkbox
|
|
chklistColumnsClickCheck( Sender );
|
|
|
|
// Restore last used sorting state from registry
|
|
chkSort.Checked := GetRegValue(REGNAME_SORTDISPLAYEDCOLUMNS, chkSort.Checked);
|
|
end;
|
|
|
|
|
|
{**
|
|
OK clicked
|
|
}
|
|
procedure TColumnSelectionForm.btnOKClick(Sender: TObject);
|
|
var
|
|
i : Integer;
|
|
begin
|
|
// Prepare string for storing in registry.
|
|
// Use quote-character as separator to ensure columnnames can
|
|
// be extracted safely later
|
|
Mainform.DataGridHiddenColumns.Clear;
|
|
for i := 0 to chklistColumns.Items.Count - 1 do
|
|
begin
|
|
if not chklistColumns.Checked[i] then
|
|
Mainform.DataGridHiddenColumns.Add(chklistColumns.Items[i]);
|
|
end;
|
|
InvalidateVT(Mainform.DataGrid, VTREE_NOTLOADED_PURGECACHE, False);
|
|
btnCancel.OnClick(Sender);
|
|
end;
|
|
|
|
|
|
{**
|
|
Select / Deselect all
|
|
}
|
|
procedure TColumnSelectionForm.chkSelectAllClick(Sender: TObject);
|
|
begin
|
|
// Avoid executing when checkbox was toggled by code (see proc below)
|
|
if (Sender as TCheckBox).Focused then
|
|
ToggleCheckListBox( chklistColumns, (Sender as TCheckBox).Checked );
|
|
end;
|
|
|
|
|
|
{**
|
|
Click within column list
|
|
Updates state of "Select / deselect all" checkbox
|
|
}
|
|
procedure TColumnSelectionForm.chklistColumnsClickCheck(Sender: TObject);
|
|
var
|
|
i : Integer;
|
|
allSelected, noneSelected : Boolean;
|
|
begin
|
|
allselected := True;
|
|
noneSelected := True;
|
|
for i := 0 to chklistColumns.Items.Count - 1 do
|
|
begin
|
|
if chklistColumns.Checked[i] then
|
|
begin
|
|
noneSelected := False;
|
|
end
|
|
else
|
|
begin
|
|
allSelected := False;
|
|
end;
|
|
end;
|
|
if noneSelected then
|
|
chkSelectAll.State := cbUnchecked
|
|
else if allSelected then
|
|
chkSelectAll.State := cbChecked
|
|
else
|
|
chkSelectAll.State := cbGrayed;
|
|
|
|
end;
|
|
|
|
|
|
{**
|
|
Sort / Unsort the list with fields
|
|
}
|
|
procedure TColumnSelectionForm.chkSortClick(Sender: TObject);
|
|
var
|
|
checkedfields : TStringList;
|
|
i: Integer;
|
|
begin
|
|
// Memorize checked items in a list
|
|
checkedfields := TStringList.Create;
|
|
for i := 0 to chklistColumns.Items.Count - 1 do begin
|
|
if chklistColumns.Checked[i] then
|
|
checkedfields.Add(chklistColumns.Items[i]);
|
|
end;
|
|
|
|
chklistColumns.Sorted := TCheckBox(Sender).Checked;
|
|
|
|
// Setting Sorted to false doesn't resort anything in the list.
|
|
// So we have to add all items again in original order
|
|
if not chklistColumns.Sorted then begin
|
|
// Add all fieldnames again
|
|
chklistColumns.Items.BeginUpdate;
|
|
chklistColumns.Clear;
|
|
for i:=0 to Mainform.SelectedTableColumns.Count-1 do
|
|
chklistColumns.Items.Add(Mainform.SelectedTableColumns[i].Name);
|
|
chklistColumns.Items.EndUpdate;
|
|
end;
|
|
|
|
// check those which are in the checkedfields list
|
|
for i := 0 to chklistColumns.Items.Count-1 do begin
|
|
chklistColumns.Checked[i] := checkedfields.IndexOf( chklistColumns.Items[i] ) > -1;
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TColumnSelectionForm.btnCancelClick(Sender: TObject);
|
|
begin
|
|
Mainform.tbtnDataColumns.Down := False;
|
|
Close;
|
|
end;
|
|
|
|
|
|
{**
|
|
Cancel this dialog if the user clicks elsewhere on mainform
|
|
}
|
|
procedure TColumnSelectionForm.FormDeactivate(Sender: TObject);
|
|
begin
|
|
btnCancel.OnClick(Sender);
|
|
end;
|
|
|
|
|
|
{**
|
|
Be sure the form is destroyed after closing.
|
|
}
|
|
procedure TColumnSelectionForm.FormClose(Sender: TObject; var Action:
|
|
TCloseAction);
|
|
begin
|
|
Action := caFree;
|
|
end;
|
|
|
|
|
|
end.
|