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:
Ansgar Becker
2007-11-26 20:58:08 +00:00
parent 24b5bd23a7
commit f6d4e637e3
6 changed files with 190 additions and 269 deletions

View File

@ -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/'

View File

@ -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

View File

@ -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.

View File

@ -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;

View File

@ -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;

View File

@ -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;