mirror of
https://github.com/HeidiSQL/HeidiSQL.git
synced 2025-08-06 18:24:26 +08:00
Replace TSMDBGrid in Data + Query tabs by TTntDBGrid.
- Implement an alternative solution for handling sorted columns without usage of SMDBGrid's sortcolumns. Move relevant structures and functions from data_sorting.pas to childwin.pas and use them in both units. - Upgrade some code parts to use WideStrings instead of Strings so they don't break with the new grid. - Use Grid.OnDrawDataCell as an alternative to Grid.OnGetCellParams as the latter one is a feature of SMDBGrid - Cosmetic: enhance screen real estate in viewdata()
This commit is contained in:
@ -1249,9 +1249,7 @@ object AboutBox: TAboutBox
|
||||
Lines.Strings = (
|
||||
'ZeosLib under GPL - http://sourceforge.net/projects/zeoslib/'
|
||||
'SynEdit under LGPL - http://synedit.sourceforge.net'
|
||||
|
||||
'Scalabium Software for Freeware SMDBGrid - http://www.scalabium.' +
|
||||
'com/'
|
||||
'TNT Unicode Controls - http://www.mh-nexus.de/tntunicodecontrols.htm'
|
||||
'Inno Setup - http://www.jrsoftware.org/'
|
||||
'Sebasti'#225'n Mayor'#225' for EDBImage'
|
||||
'Daniel Hahler for the name "HeidiSQL" - http://daniel.hahler.de/'
|
||||
|
@ -889,20 +889,14 @@ object MDIChild: TMDIChild
|
||||
TabOrder = 2
|
||||
end
|
||||
end
|
||||
object gridData: TSMDBGrid
|
||||
object gridData: TTntDBGrid
|
||||
Left = 0
|
||||
Top = 31
|
||||
Width = 496
|
||||
Height = 189
|
||||
Align = alClient
|
||||
DataSource = DataSource1
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'Tahoma'
|
||||
Font.Style = []
|
||||
Options = [dgEditing, dgTitles, dgIndicator, dgColumnResize, dgColLines, dgRowLines, dgTabs, dgAlwaysShowSelection, dgConfirmDelete, dgMultiSelect]
|
||||
ParentFont = False
|
||||
PopupMenu = popupDataGrid
|
||||
TabOrder = 1
|
||||
TitleFont.Charset = DEFAULT_CHARSET
|
||||
@ -912,20 +906,11 @@ object MDIChild: TMDIChild
|
||||
TitleFont.Style = []
|
||||
OnColEnter = DBGridColEnter
|
||||
OnColumnMoved = gridDataColumnMoved
|
||||
OnDrawDataCell = GridDrawDataCell
|
||||
OnDblClick = DBGridDblClick
|
||||
OnKeyUp = controlsKeyUp
|
||||
OnMouseDown = gridMouseDown
|
||||
OnTitleClick = gridDataTitleClick
|
||||
ExOptions = [eoBooleanAsCheckBox, eoCheckBoxSelect, eoCellHint, eoENTERlikeTAB, eoKeepSelection]
|
||||
OnGetCellParams = DBGridGetCellParams
|
||||
RegistryKey = 'Software\MikeSoft'
|
||||
RegistrySection = 'SMDBGrid'
|
||||
WidthOfIndicator = 23
|
||||
ScrollBars = ssHorizontal
|
||||
ColCount = 2
|
||||
RowCount = 2
|
||||
Col = 1
|
||||
Row = 1
|
||||
end
|
||||
end
|
||||
object tabQuery: TTabSheet
|
||||
@ -1229,7 +1214,7 @@ object MDIChild: TMDIChild
|
||||
end
|
||||
end
|
||||
end
|
||||
object gridQuery: TSMDBGrid
|
||||
object gridQuery: TTntDBGrid
|
||||
Left = 0
|
||||
Top = 159
|
||||
Width = 496
|
||||
@ -1251,18 +1236,9 @@ object MDIChild: TMDIChild
|
||||
TitleFont.Name = 'Tahoma'
|
||||
TitleFont.Style = []
|
||||
OnColEnter = DBGridColEnter
|
||||
OnDrawDataCell = GridDrawDataCell
|
||||
OnDblClick = DBGridDblClick
|
||||
OnMouseDown = gridMouseDown
|
||||
ExOptions = [eoBooleanAsCheckBox, eoCellHint, eoENTERlikeTAB, eoKeepSelection]
|
||||
OnGetCellParams = DBGridGetCellParams
|
||||
RegistryKey = 'Software\MikeSoft'
|
||||
RegistrySection = 'SMDBGrid'
|
||||
WidthOfIndicator = 11
|
||||
ScrollBars = ssHorizontal
|
||||
ColCount = 2
|
||||
RowCount = 2
|
||||
Col = 1
|
||||
Row = 1
|
||||
end
|
||||
object ProgressBarQuery: TProgressBar
|
||||
Left = 0
|
||||
|
@ -22,9 +22,15 @@ uses
|
||||
ZAbstractRODataset, ZConnection,
|
||||
ZSqlMonitor, EDBImage, ZDbcLogging,
|
||||
SynCompletionProposal, HeidiComp, SynEditMiscClasses, MysqlQuery,
|
||||
MysqlQueryThread, queryprogress, communication, MysqlConn, smdbgrid, Tabs,
|
||||
VirtualTrees, createdatabase, tbl_properties;
|
||||
MysqlQueryThread, queryprogress, communication, MysqlConn, Tabs,
|
||||
VirtualTrees, createdatabase, tbl_properties, TntDBGrids, TntClasses;
|
||||
|
||||
type
|
||||
TOrderCol = class(TObject)
|
||||
ColumnName: String;
|
||||
SortDirection: Byte;
|
||||
end;
|
||||
TOrderColArray = Array of TOrderCol;
|
||||
|
||||
type
|
||||
TMDIChild = class(TForm)
|
||||
@ -113,9 +119,9 @@ type
|
||||
Copy3: TMenuItem;
|
||||
Paste2: TMenuItem;
|
||||
N4: TMenuItem;
|
||||
gridData: TSMDBGrid;
|
||||
gridData: TTntDBGrid;
|
||||
DataSource1: TDataSource;
|
||||
gridQuery: TSMDBGrid;
|
||||
gridQuery: TTntDBGrid;
|
||||
DataSource2: TDataSource;
|
||||
Copytableas1: TMenuItem;
|
||||
Filter1: TMenuItem;
|
||||
@ -443,8 +449,8 @@ type
|
||||
procedure btnQueryStopOnErrorsClick(Sender: TObject);
|
||||
procedure DBGridDblClick(Sender: TObject);
|
||||
procedure SaveDialogExportDataTypeChange(Sender: TObject);
|
||||
procedure DBGridGetCellParams(Sender: TObject; Field: TField;
|
||||
AFont: TFont; var Background: TColor; Highlight: Boolean);
|
||||
procedure GridDrawDataCell(Sender: TObject; const Rect: TRect; Field:
|
||||
TField; State: TGridDrawState);
|
||||
procedure popupDataGridPopup(Sender: TObject);
|
||||
procedure InsertDate(Sender: TObject);
|
||||
procedure btnBlobCopyClick(Sender: TObject);
|
||||
@ -550,7 +556,7 @@ type
|
||||
procedure SetQueryRunning(running: Boolean);
|
||||
procedure GridHighlightChanged(Sender: TObject);
|
||||
procedure SaveBlob;
|
||||
function GetActiveGrid: TSMDBGrid;
|
||||
function GetActiveGrid: TTntDBGrid;
|
||||
procedure WaitForQueryCompletion(WaitForm: TfrmQueryProgress; query: TMySqlQuery);
|
||||
function RunThreadedQuery(AQuery : String) : TMysqlQuery;
|
||||
procedure DisplayRowCountStats(ds: TDataSet);
|
||||
@ -606,7 +612,7 @@ type
|
||||
procedure ExecUseQuery(db: string; HandleErrors: Boolean = false; DisplayErrors: Boolean = false);
|
||||
|
||||
property FQueryRunning: Boolean read GetQueryRunning write SetQueryRunning;
|
||||
property ActiveGrid: TSMDBGrid read GetActiveGrid;
|
||||
property ActiveGrid: TTntDBGrid read GetActiveGrid;
|
||||
property MysqlConn : TMysqlConn read FMysqlConn;
|
||||
property Conn : TOpenConnProf read FConn;
|
||||
|
||||
@ -625,6 +631,8 @@ type
|
||||
procedure ActivateFileLogging;
|
||||
procedure DeactivateFileLogging;
|
||||
procedure TrimSQLLog;
|
||||
function HandleOrderColumns( AddOrderCol: TOrderCol = nil ): TOrderColArray;
|
||||
function ComposeOrderClause( Cols: TOrderColArray ): String;
|
||||
end;
|
||||
|
||||
type
|
||||
@ -1542,16 +1550,13 @@ end;
|
||||
procedure TMDIChild.viewdata(Sender: TObject);
|
||||
var
|
||||
sorting : String;
|
||||
DropDown : TStringList;
|
||||
DropDown : TTntStringList;
|
||||
i : Integer;
|
||||
j : Integer;
|
||||
ValidColumns : TStringList;
|
||||
OrderColumns : TOrderColArray;
|
||||
PrimaryKeyColumns : TStringList;
|
||||
reg, reg2 : TRegistry;
|
||||
reg_value : String;
|
||||
orderclauses : TStringList;
|
||||
columnname : String;
|
||||
columnexists : Boolean;
|
||||
select_base : String;
|
||||
limit : Int64;
|
||||
ds : TDataSet;
|
||||
@ -1560,7 +1565,6 @@ var
|
||||
manualLimitEnd : integer;
|
||||
DisplayedColumnsList : TStringList;
|
||||
tmp : TDataSet;
|
||||
RewriteOrderClause : Boolean;
|
||||
begin
|
||||
viewingdata := true;
|
||||
reg := TRegistry.Create();
|
||||
@ -1629,63 +1633,16 @@ begin
|
||||
end;
|
||||
|
||||
// Read cached ORDER-clause and set Grid.Sortcolumns
|
||||
reg_value := 'ORDERCLAUSE_' + ActiveDatabase + '.' + SelectedTable;
|
||||
sorting := '';
|
||||
gridData.SortColumns.Clear();
|
||||
if ( reg.ValueExists( reg_value ) ) then
|
||||
OrderColumns := HandleOrderColumns;
|
||||
if Length(OrderColumns) > 0 then
|
||||
begin
|
||||
orderclauses := explode( ',', reg.ReadString( reg_value ) );
|
||||
RewriteOrderClause := False;
|
||||
ValidColumns := GetVTCaptions( ListColumns );
|
||||
for i := 0 to ( orderclauses.Count - 1 ) do
|
||||
begin
|
||||
columnname := Trim( Copy( orderclauses[i], 0, LastPos( ' ', orderclauses[i] ) ) );
|
||||
columnname := trimc( columnname, '`' );
|
||||
columnexists := ValidColumns.IndexOf(columnname) > -1;
|
||||
|
||||
if ( not columnexists ) then
|
||||
begin
|
||||
LogSQL( 'Notice: A stored ORDER-BY clause could not be applied, '+
|
||||
'because the column "' + columnname + '" does not exist!');
|
||||
RewriteOrderClause := True;
|
||||
Continue;
|
||||
end;
|
||||
|
||||
// Add column to order clause
|
||||
if sorting <> '' then
|
||||
sorting := sorting + ', ';
|
||||
sorting := sorting + orderclauses[i];
|
||||
|
||||
with ( gridData.SortColumns.Add() ) do
|
||||
begin
|
||||
Fieldname := columnname;
|
||||
if ( Copy( orderclauses[i], ( Length( orderclauses[i] ) - 3 ), 4 ) = 'DESC' ) then
|
||||
begin
|
||||
SortType := stAscending;
|
||||
end
|
||||
else
|
||||
begin
|
||||
SortType := stDescending;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
// Old orderclause contained a no longer existing column, so overwrite it
|
||||
if RewriteOrderClause then
|
||||
begin
|
||||
reg.WriteString( reg_value, sorting );
|
||||
end;
|
||||
end;
|
||||
|
||||
if ( sorting <> '' ) then
|
||||
begin
|
||||
sorting := 'ORDER BY ' + sorting;
|
||||
sorting := 'ORDER BY ' + ComposeOrderClause(OrderColumns);
|
||||
// Signal for the user that we applied an ORDER-clause
|
||||
btnDataSorting.Font.Color := clRed;
|
||||
end
|
||||
else
|
||||
begin
|
||||
btnDataSorting.Font.Color := clWindowText;
|
||||
end;
|
||||
|
||||
MenuLimit.Checked := Mainform.CheckBoxLimit.Checked;
|
||||
PrimaryKeyColumns := TStringList.Create();
|
||||
@ -1806,37 +1763,29 @@ begin
|
||||
for i := 0 to Length(VTRowDataListColumns) - 1 do
|
||||
begin
|
||||
// give all enum-fields a PickList with its Items
|
||||
if ( StrCmpBegin( 'enum', VTRowDataListColumns[i].Captions[1]) ) then
|
||||
if StrCmpBegin( 'enum', VTRowDataListColumns[i].Captions[1]) then
|
||||
begin
|
||||
DropDown := explode( ''',''', getEnumValues( VTRowDataListColumns[i].Captions[1] ) );
|
||||
for j := 0 to ( DropDown.Count - 1 ) do
|
||||
begin
|
||||
DropDown[j] := trimc( DropDown[j], '''' );
|
||||
end;
|
||||
DropDown := TTntStringList.Create;
|
||||
DropDown.QuoteChar := '''';
|
||||
DropDown.DelimitedText := getEnumValues( VTRowDataListColumns[i].Captions[1] );
|
||||
|
||||
for j := 0 to ( gridData.Columns.Count - 1 ) do
|
||||
for j := 0 to gridData.Columns.Count - 1 do
|
||||
begin
|
||||
if ( gridData.Columns[j].FieldName = VTRowDataListColumns[i].Captions[0] ) then
|
||||
begin
|
||||
gridData.Columns[j].PickList := DropDown;
|
||||
end;
|
||||
if gridData.Columns[j].FieldName = VTRowDataListColumns[i].Captions[0] then
|
||||
gridData.Columns[j].WidePickList := DropDown;
|
||||
end;
|
||||
end;
|
||||
|
||||
// make PK-columns = fsBold
|
||||
for j := 0 to ( gridData.Columns.Count - 1 ) do
|
||||
begin
|
||||
if (
|
||||
( gridData.Columns[j].FieldName = VTRowDataListColumns[i].Captions[0] ) and
|
||||
( VTRowDataListColumns[i].ImageIndex = 26 )
|
||||
) then
|
||||
for j := 0 to gridData.Columns.Count - 1 do
|
||||
begin
|
||||
if ( gridData.Columns[j].FieldName = VTRowDataListColumns[i].Captions[0] ) and
|
||||
( VTRowDataListColumns[i].ImageIndex = 26 ) then
|
||||
PrimaryKeyColumns.Add( VTRowDataListColumns[i].Captions[0] );
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
for j := 0 to ( gridData.Columns.Count - 1 ) do
|
||||
for j := 0 to gridData.Columns.Count - 1 do
|
||||
begin
|
||||
// for letting NULLs being inserted into "NOT NULL" fields
|
||||
// in mysql5+, the server rejects inserts with NULLs in NOT NULL-fields,
|
||||
@ -3777,90 +3726,17 @@ begin
|
||||
end;
|
||||
|
||||
|
||||
{**
|
||||
Column-title clicked -> generate "ORDER BY"
|
||||
}
|
||||
procedure TMDIChild.gridDataTitleClick(Column: TColumn);
|
||||
var
|
||||
Grid : TSMDBGrid;
|
||||
i : Integer;
|
||||
existed : Boolean;
|
||||
sortcol : TSMSortColumn;
|
||||
sorting, reg_value : String;
|
||||
reg : TRegistry;
|
||||
c : TOrderCol;
|
||||
begin
|
||||
// column-title clicked -> generate "ORDER BY"
|
||||
|
||||
Grid := Column.Grid as TSMDBGrid;
|
||||
Grid.DataSource.DataSet.DisableControls;
|
||||
existed := false;
|
||||
|
||||
for i:=Grid.SortColumns.Count-1 downto 0 do
|
||||
begin
|
||||
sortcol := Grid.SortColumns[i];
|
||||
if sortcol.FieldName <> Column.FieldName then
|
||||
continue;
|
||||
existed := true;
|
||||
case sortcol.SortType of
|
||||
stDescending : sortcol.SortType := stAscending;
|
||||
stAscending : Grid.SortColumns.Delete(i);
|
||||
stNone : sortcol.SortType := stDescending;
|
||||
end;
|
||||
end;
|
||||
|
||||
{add a new sorted column in list - ascending order}
|
||||
if not existed then
|
||||
begin
|
||||
sortcol := Grid.SortColumns.Add;
|
||||
sortcol.FieldName := column.FieldName;
|
||||
sortcol.SortType := stDescending;
|
||||
end;
|
||||
|
||||
Grid.DataSource.DataSet.EnableControls;
|
||||
|
||||
// Concat orderclause
|
||||
sorting := '';
|
||||
for i := 0 to ( gridData.SortColumns.Count - 1 ) do
|
||||
begin
|
||||
sortcol := gridData.SortColumns[i];
|
||||
|
||||
if ( sortcol.SortType <> stNone ) then
|
||||
begin
|
||||
if ( sorting <> '' ) then
|
||||
begin
|
||||
sorting := sorting + ', ';
|
||||
end;
|
||||
sorting := sorting + mask( sortcol.FieldName );
|
||||
end;
|
||||
|
||||
case sortcol.SortType of
|
||||
// stNone: ;
|
||||
stAscending :
|
||||
begin
|
||||
sorting := sorting + ' DESC';
|
||||
end;
|
||||
stDescending:
|
||||
begin
|
||||
sorting := sorting + ' ASC';
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
// Write orderclause to registry
|
||||
reg := TRegistry.Create();
|
||||
reg.OpenKey( REGPATH + '\Servers\' + FConn.Description, true );
|
||||
reg_value := 'ORDERCLAUSE_' + ActiveDatabase + '.' + SelectedTable;
|
||||
if ( sorting <> '' ) then
|
||||
begin
|
||||
reg.WriteString( reg_value, sorting );
|
||||
end
|
||||
else
|
||||
begin
|
||||
if ( reg.ValueExists( reg_value ) ) then
|
||||
reg.DeleteValue( reg_value );
|
||||
end;
|
||||
reg.CloseKey;
|
||||
FreeAndNil(reg);
|
||||
|
||||
c := TOrderCol.Create;
|
||||
c.ColumnName := Column.FieldName;
|
||||
HandleOrderColumns(c);
|
||||
ViewData(self);
|
||||
|
||||
end;
|
||||
|
||||
|
||||
@ -4101,7 +3977,7 @@ end;
|
||||
procedure TMDIChild.btnBlobSaveClick(Sender: TObject);
|
||||
var
|
||||
bf: Textfile;
|
||||
grid: TSMDBGrid;
|
||||
grid: TTntDBGrid;
|
||||
begin
|
||||
// Todo: Weird fix, we probably shouldn't even be showing the button in the first place.
|
||||
if Length(DBMemo1.DataField) = 0 then
|
||||
@ -4621,10 +4497,10 @@ begin
|
||||
keyword := SynMemoFilter.WordAtCursor
|
||||
// Data-Tab
|
||||
else if (PageControlMain.ActivePage = tabData)
|
||||
and (-1 < gridData.Col)
|
||||
and (gridData.Col <= Length(VTRowDataListColumns)) then
|
||||
and (-1 < gridData.SelectedField.Index)
|
||||
and (gridData.SelectedField.Index <= Length(VTRowDataListColumns)) then
|
||||
begin
|
||||
keyword := VTRowDataListColumns[gridData.Col-1].Captions[1];
|
||||
keyword := VTRowDataListColumns[gridData.SelectedField.Index].Captions[1];
|
||||
end
|
||||
// Table-Tab
|
||||
else if ListColumns.Focused and Assigned(ListColumns.FocusedNode) then
|
||||
@ -4979,9 +4855,9 @@ end;
|
||||
procedure TMDIChild.DBGridDblClick(Sender: TObject);
|
||||
begin
|
||||
// If grid is not empty...
|
||||
if (Sender as TDBGrid).SelectedField <> nil then begin
|
||||
if (Sender as TTntDBGrid).SelectedField <> nil then begin
|
||||
// Set focus on DBMemo when user doubleclicks a (MEMO)-cell
|
||||
if (sender as TSMDBGrid).SelectedField.IsBlob and (PageControlBlobEditors.ActivePage = tabBlobEditorText) then begin
|
||||
if (sender as TTntDBGrid).SelectedField.IsBlob and (PageControlBlobEditors.ActivePage = tabBlobEditorText) then begin
|
||||
PageControlBottom.ActivePage := tabBlobEditor;
|
||||
DBMemo1.SetFocus;
|
||||
end;
|
||||
@ -5009,16 +4885,22 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TMDIChild.DBGridGetCellParams(Sender: TObject; Field: TField;
|
||||
AFont: TFont; var Background: TColor; Highlight: Boolean);
|
||||
|
||||
{**
|
||||
A cell in a DBGrid is painted. Sets custom background color NULL fields.
|
||||
}
|
||||
procedure TMDIChild.GridDrawDataCell(Sender: TObject; const Rect: TRect;
|
||||
Field: TField; State: TGridDrawState);
|
||||
var
|
||||
Grid : TTntDBGrid;
|
||||
begin
|
||||
if (Sender as TDBGrid).SelectedRows.CurrentRowSelected then begin
|
||||
background := clInfoBK;
|
||||
afont.Color := clInfoText;
|
||||
end;
|
||||
if (field <> nil) and field.IsNull then background := prefDataNullBackground;
|
||||
Grid := Sender as TTntDBGrid;
|
||||
if (Field <> nil) and Field.IsNull then
|
||||
Grid.Canvas.Brush.Color := prefDataNullBackground;
|
||||
Grid.DefaultDrawDataCell(Rect, Field, State);
|
||||
end;
|
||||
|
||||
|
||||
procedure TMDIChild.DBMemo1Exit(Sender: TObject);
|
||||
var
|
||||
ds: TDataSource;
|
||||
@ -5462,7 +5344,7 @@ end;
|
||||
|
||||
procedure TMDIChild.GridHighlightChanged(Sender: TObject);
|
||||
var
|
||||
grid: TSMDBGrid;
|
||||
grid: TTntDBGrid;
|
||||
ds: TDataSource;
|
||||
hasNull: Boolean;
|
||||
hasOddNewlines: Boolean;
|
||||
@ -5636,7 +5518,7 @@ end;
|
||||
|
||||
|
||||
|
||||
function TMDIChild.GetActiveGrid: TSMDBGrid;
|
||||
function TMDIChild.GetActiveGrid: TTntDBGrid;
|
||||
begin
|
||||
Result := nil;
|
||||
if PageControlMain.ActivePage = tabData then Result := gridData;
|
||||
@ -6786,5 +6668,117 @@ begin
|
||||
end;
|
||||
|
||||
|
||||
function TMDIChild.HandleOrderColumns( AddOrderCol: TOrderCol = nil ): TOrderColArray;
|
||||
var
|
||||
i, j : Integer;
|
||||
reg : TRegistry;
|
||||
reg_name : String;
|
||||
old_orderclause, new_orderclause, columnname : String;
|
||||
order_parts, ValidColumns : TStringList;
|
||||
columnexists : Boolean;
|
||||
begin
|
||||
SetLength( Result, 0 );
|
||||
|
||||
// Read ORDER clause from registry
|
||||
reg := TRegistry.Create();
|
||||
reg.OpenKey( REGPATH + '\Servers\' + FConn.Description, true );
|
||||
reg_name := REGPREFIX_ORDERCLAUSE + ActiveDatabase + '.' + SelectedTable;
|
||||
|
||||
if reg.ValueExists(reg_name) then
|
||||
begin
|
||||
old_orderclause := reg.ReadString(reg_name);
|
||||
// Parse ORDER clause
|
||||
order_parts := explode( ',', old_orderclause );
|
||||
ValidColumns := GetVTCaptions( ListColumns );
|
||||
for i := 0 to order_parts.Count - 1 do
|
||||
begin
|
||||
columnname := Trim( Copy( order_parts[i], 0, LastPos( ' ', order_parts[i] ) ) );
|
||||
columnname := trimc( columnname, '`' );
|
||||
columnexists := ValidColumns.IndexOf(columnname) > -1;
|
||||
|
||||
if not columnexists then
|
||||
begin
|
||||
LogSQL( 'Notice: A stored ORDER-BY clause could not be applied, '+
|
||||
'because the column "' + columnname + '" does not exist!');
|
||||
Continue;
|
||||
end;
|
||||
|
||||
// Add part of order clause to result array
|
||||
SetLength(Result, Length(Result)+1);
|
||||
Result[Length(Result)-1] := TOrderCol.Create;
|
||||
Result[Length(Result)-1].ColumnName := columnname;
|
||||
Result[Length(Result)-1].SortDirection := Integer( Copy( order_parts[i], ( Length( order_parts[i] ) - 3 ), 4 ) = 'DESC' );
|
||||
|
||||
end;
|
||||
end;
|
||||
|
||||
// Add a new order column after a columns title has been clicked
|
||||
if AddOrderCol <> nil then
|
||||
begin
|
||||
// Check if order column is already existant
|
||||
columnexists := False;
|
||||
for i := Low(Result) to High(Result) do
|
||||
begin
|
||||
if Result[i].ColumnName = AddOrderCol.ColumnName then
|
||||
begin
|
||||
// AddOrderCol is already in the list. Switch its direction:
|
||||
// ASC > DESC > [delete col]
|
||||
columnexists := True;
|
||||
if Result[i].SortDirection = ORDER_ASC then
|
||||
Result[i].SortDirection := ORDER_DESC
|
||||
else
|
||||
begin
|
||||
// Delete order col
|
||||
for j := i to High(Result) - 1 do
|
||||
Result[j] := Result[j+1];
|
||||
SetLength(Result, Length(Result)-1);
|
||||
end;
|
||||
// We found the matching column, no need to loop further
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
|
||||
if not columnexists then
|
||||
begin
|
||||
SetLength(Result, Length(Result)+1);
|
||||
Result[Length(Result)-1] := AddOrderCol;
|
||||
end;
|
||||
end;
|
||||
|
||||
// Update registry
|
||||
new_orderclause := ComposeOrderClause(Result);
|
||||
if new_orderclause <> old_orderclause then
|
||||
begin
|
||||
if new_orderclause <> '' then
|
||||
reg.WriteString(reg_name , new_orderclause)
|
||||
else
|
||||
reg.DeleteValue(reg_name);
|
||||
end;
|
||||
|
||||
reg.Free;
|
||||
end;
|
||||
|
||||
|
||||
{**
|
||||
Concat all sort options to a ORDER clause
|
||||
}
|
||||
function TMDIChild.ComposeOrderClause(Cols: TOrderColArray): String;
|
||||
var
|
||||
i : Integer;
|
||||
sort : String;
|
||||
begin
|
||||
result := '';
|
||||
for i := 0 to Length(Cols) - 1 do
|
||||
begin
|
||||
if result <> '' then
|
||||
result := result + ', ';
|
||||
if Cols[i].SortDirection = ORDER_ASC then
|
||||
sort := TXT_ASC
|
||||
else
|
||||
sort := TXT_DESC;
|
||||
result := result + Mainform.Mask( Cols[i].ColumnName ) + ' ' + sort;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
end.
|
||||
|
@ -4,13 +4,7 @@ interface
|
||||
|
||||
uses
|
||||
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
|
||||
Dialogs, StdCtrls, ExtCtrls, ComCtrls, Buttons, Registry, smdbgrid;
|
||||
|
||||
type
|
||||
TOrderCol = record
|
||||
ColumnName: String;
|
||||
SortDirection: Byte;
|
||||
end;
|
||||
Dialogs, StdCtrls, ExtCtrls, ComCtrls, Buttons, Registry, TntDBgrids, childwin;
|
||||
|
||||
|
||||
type
|
||||
@ -25,24 +19,19 @@ type
|
||||
private
|
||||
{ Private declarations }
|
||||
ColumnNames : TStringList;
|
||||
OrderColumns : Array of TOrderCol;
|
||||
OrderColumns : TOrderColArray;
|
||||
reg_name, OldOrderClause : String;
|
||||
procedure DisplaySortingControls;
|
||||
procedure dropdownColsChange( Sender: TObject );
|
||||
procedure buttonOrderClick( Sender: TObject );
|
||||
procedure buttonDeleteClick( Sender: TObject );
|
||||
procedure Modified;
|
||||
function ComposeOrderClause: String;
|
||||
public
|
||||
{ Public declarations }
|
||||
end;
|
||||
|
||||
|
||||
const
|
||||
ORDER_ASC = 0; // Used for tag-value of "Direction"-button
|
||||
ORDER_DESC = 1; // dito
|
||||
TXT_ASC = 'ASC'; // Used for caption of "Direction"-button
|
||||
TXT_DESC = 'DESC'; // dito
|
||||
LINE_HEIGHT = 20; // Height of automatically created controls
|
||||
MARGIN = 2; // Space between controls
|
||||
MARGIN_BIG = 3 * MARGIN; // Space above the very first and last controls, used to separate stuff
|
||||
@ -59,8 +48,6 @@ uses main, helpers;
|
||||
}
|
||||
procedure TDataSortingForm.FormShow(Sender: TObject);
|
||||
var
|
||||
i : Cardinal;
|
||||
grid: TSMDBGrid;
|
||||
reg : TRegistry;
|
||||
begin
|
||||
// Take column names from listColumns and add here
|
||||
@ -69,25 +56,12 @@ begin
|
||||
// Read original ORDER clause from registry
|
||||
reg := TRegistry.Create();
|
||||
reg.OpenKey( REGPATH + '\Servers\' + Mainform.Childwin.Description, true );
|
||||
reg_name := 'ORDERCLAUSE_' + Mainform.Childwin.ActiveDatabase + '.' + Mainform.Childwin.SelectedTable;
|
||||
reg_name := REGPREFIX_ORDERCLAUSE + Mainform.Childwin.ActiveDatabase + '.' + Mainform.Childwin.SelectedTable;
|
||||
OldOrderClause := reg.ReadString(reg_name);
|
||||
reg.CloseKey;
|
||||
FreeAndNil(reg);
|
||||
|
||||
// Create one OrderColumns record for each grid.SortColumn
|
||||
grid := Mainform.Childwin.gridData;
|
||||
if grid.SortColumns.Count > 0 then // Avoids AV when accessing SortColumn[0] ... ??
|
||||
begin
|
||||
for i := 0 to grid.SortColumns.Count - 1 do
|
||||
begin
|
||||
SetLength( OrderColumns, i+1 );
|
||||
OrderColumns[i].ColumnName := grid.SortColumns[i].FieldName;
|
||||
if grid.SortColumns[i].SortType = stDescending then
|
||||
OrderColumns[i].SortDirection := ORDER_ASC
|
||||
else
|
||||
OrderColumns[i].SortDirection := ORDER_DESC; // Also applies for SortType = stNone
|
||||
end;
|
||||
end;
|
||||
OrderColumns := Mainform.Childwin.HandleOrderColumns;
|
||||
|
||||
// First creation of controls
|
||||
DisplaySortingControls;
|
||||
@ -284,6 +258,7 @@ var
|
||||
begin
|
||||
SetLength( OrderColumns, Length(OrderColumns)+1 );
|
||||
new := Length(OrderColumns)-1;
|
||||
OrderColumns[new] := TOrderCol.Create;
|
||||
|
||||
// Take first unused column as default for new sort column
|
||||
UnusedColumns := TStringList.Create;
|
||||
@ -317,29 +292,7 @@ end;
|
||||
}
|
||||
procedure TDataSortingForm.Modified;
|
||||
begin
|
||||
btnOk.Enabled := ComposeOrderClause <> OldOrderClause;
|
||||
end;
|
||||
|
||||
|
||||
{**
|
||||
Concat all sort options to a ORDER clause
|
||||
}
|
||||
function TDataSortingForm.ComposeOrderClause: String;
|
||||
var
|
||||
i : Integer;
|
||||
sort : String;
|
||||
begin
|
||||
result := '';
|
||||
for i := 0 to Length(OrderColumns) - 1 do
|
||||
begin
|
||||
if result <> '' then
|
||||
result := result + ', ';
|
||||
if OrderColumns[i].SortDirection = ORDER_ASC then
|
||||
sort := TXT_ASC
|
||||
else
|
||||
sort := TXT_DESC;
|
||||
result := result + Mainform.Mask( OrderColumns[i].ColumnName ) + ' ' + sort;
|
||||
end;
|
||||
btnOk.Enabled := Mainform.Childwin.ComposeOrderClause(OrderColumns) <> OldOrderClause;
|
||||
end;
|
||||
|
||||
|
||||
@ -352,7 +305,7 @@ var
|
||||
begin
|
||||
reg := TRegistry.Create();
|
||||
reg.OpenKey( REGPATH + '\Servers\' + Mainform.Childwin.Description, true );
|
||||
reg.WriteString( reg_name, ComposeOrderClause );
|
||||
reg.WriteString( reg_name, Mainform.Childwin.ComposeOrderClause(OrderColumns) );
|
||||
reg.CloseKey;
|
||||
FreeAndNil(reg);
|
||||
end;
|
||||
|
@ -32,7 +32,7 @@ type
|
||||
function implodestr(seperator: String; a: TStringList) :String;
|
||||
function explode(separator, a: String) :TStringList;
|
||||
procedure ensureValidIdentifier(name: String);
|
||||
function getEnumValues(str: String):String;
|
||||
function getEnumValues(str: WideString): WideString;
|
||||
function IsValidDelimiter(var s: string): string;
|
||||
type TParseSQLProcessCommand = procedure(command: String; parameter: String) of object;
|
||||
function parsesql(sql: String; delimiter: String; processcommand: TParseSQLProcessCommand = nil) : TStringList;
|
||||
@ -284,7 +284,7 @@ end;
|
||||
@param string Type definition, fx: enum('Y','N')
|
||||
@return string Content of brackets
|
||||
}
|
||||
function getEnumValues(str: String):String;
|
||||
function getEnumValues(str: WideString): WideString;
|
||||
var
|
||||
p1,p2 : Integer;
|
||||
begin
|
||||
@ -293,7 +293,7 @@ begin
|
||||
// Only return something if opening bracket was found, otherwise empty string
|
||||
if p1 > 0 then
|
||||
begin
|
||||
for p2:=strlen(pchar(str)) downto 0 do
|
||||
for p2:=Length(str) downto 0 do
|
||||
if str[p2] = ')' then break;
|
||||
result := copy (str, p1+1, p2-p1-1);
|
||||
end;
|
||||
|
@ -15,8 +15,8 @@ uses
|
||||
Windows, SysUtils, Classes, Graphics, Forms, Controls, Menus,
|
||||
StdCtrls, Dialogs, Buttons, Messages, ExtCtrls, ComCtrls, StdActns,
|
||||
ActnList, ImgList, Registry, ShellApi, ToolWin, Clipbrd, db, DBCtrls,
|
||||
SynMemo, synedit, SynEditTypes, smdbgrid, ZDataSet, ZSqlProcessor,
|
||||
HeidiComp, sqlhelp, MysqlQueryThread, Childwin, VirtualTrees;
|
||||
SynMemo, synedit, SynEditTypes, ZDataSet, ZSqlProcessor,
|
||||
HeidiComp, sqlhelp, MysqlQueryThread, Childwin, VirtualTrees, TntDBGrids;
|
||||
|
||||
type
|
||||
TMainForm = class(TForm)
|
||||
@ -898,7 +898,7 @@ end;
|
||||
// view HTML
|
||||
procedure TMainForm.HTMLviewExecute(Sender: TObject);
|
||||
var
|
||||
g : TSMDBGrid;
|
||||
g : TTntDBGrid;
|
||||
filename,extension : String;
|
||||
f : Textfile;
|
||||
buffer : array[0..MAX_PATH] of char;
|
||||
|
Reference in New Issue
Block a user