* Scroll result display to the end

This commit is contained in:
Michaël Van Canneyt 2023-08-09 21:20:29 +02:00
parent 57fe53bd0d
commit 2a1a2a68a5
2 changed files with 551 additions and 30 deletions

View File

@ -112,14 +112,506 @@ object QueryFrame: TQueryFrame
Caption = 'Result'
ClientHeight = 214
ClientWidth = 630
object MResult: TMemo
inline MResult: TSynEdit
Left = 0
Height = 214
Top = 0
Width = 630
Align = alClient
ScrollBars = ssAutoBoth
Font.Height = 13
Font.Name = 'DejaVu Sans Mono'
Font.Pitch = fpFixed
Font.Quality = fqNonAntialiased
ParentColor = False
ParentFont = False
TabOrder = 0
Gutter.Visible = False
Gutter.Width = 57
Gutter.MouseActions = <>
RightGutter.Width = 0
RightGutter.MouseActions = <>
Keystrokes = <
item
Command = ecUp
ShortCut = 38
end
item
Command = ecSelUp
ShortCut = 8230
end
item
Command = ecScrollUp
ShortCut = 16422
end
item
Command = ecDown
ShortCut = 40
end
item
Command = ecSelDown
ShortCut = 8232
end
item
Command = ecScrollDown
ShortCut = 16424
end
item
Command = ecLeft
ShortCut = 37
end
item
Command = ecSelLeft
ShortCut = 8229
end
item
Command = ecWordLeft
ShortCut = 16421
end
item
Command = ecSelWordLeft
ShortCut = 24613
end
item
Command = ecRight
ShortCut = 39
end
item
Command = ecSelRight
ShortCut = 8231
end
item
Command = ecWordRight
ShortCut = 16423
end
item
Command = ecSelWordRight
ShortCut = 24615
end
item
Command = ecPageDown
ShortCut = 34
end
item
Command = ecSelPageDown
ShortCut = 8226
end
item
Command = ecPageBottom
ShortCut = 16418
end
item
Command = ecSelPageBottom
ShortCut = 24610
end
item
Command = ecPageUp
ShortCut = 33
end
item
Command = ecSelPageUp
ShortCut = 8225
end
item
Command = ecPageTop
ShortCut = 16417
end
item
Command = ecSelPageTop
ShortCut = 24609
end
item
Command = ecLineStart
ShortCut = 36
end
item
Command = ecSelLineStart
ShortCut = 8228
end
item
Command = ecEditorTop
ShortCut = 16420
end
item
Command = ecSelEditorTop
ShortCut = 24612
end
item
Command = ecLineEnd
ShortCut = 35
end
item
Command = ecSelLineEnd
ShortCut = 8227
end
item
Command = ecEditorBottom
ShortCut = 16419
end
item
Command = ecSelEditorBottom
ShortCut = 24611
end
item
Command = ecToggleMode
ShortCut = 45
end
item
Command = ecCopy
ShortCut = 16429
end
item
Command = ecPaste
ShortCut = 8237
end
item
Command = ecDeleteChar
ShortCut = 46
end
item
Command = ecCut
ShortCut = 8238
end
item
Command = ecDeleteLastChar
ShortCut = 8
end
item
Command = ecDeleteLastChar
ShortCut = 8200
end
item
Command = ecDeleteLastWord
ShortCut = 16392
end
item
Command = ecUndo
ShortCut = 32776
end
item
Command = ecRedo
ShortCut = 40968
end
item
Command = ecLineBreak
ShortCut = 13
end
item
Command = ecSelectAll
ShortCut = 16449
end
item
Command = ecCopy
ShortCut = 16451
end
item
Command = ecBlockIndent
ShortCut = 24649
end
item
Command = ecLineBreak
ShortCut = 16461
end
item
Command = ecInsertLine
ShortCut = 16462
end
item
Command = ecDeleteWord
ShortCut = 16468
end
item
Command = ecBlockUnindent
ShortCut = 24661
end
item
Command = ecPaste
ShortCut = 16470
end
item
Command = ecCut
ShortCut = 16472
end
item
Command = ecDeleteLine
ShortCut = 16473
end
item
Command = ecDeleteEOL
ShortCut = 24665
end
item
Command = ecUndo
ShortCut = 16474
end
item
Command = ecRedo
ShortCut = 24666
end
item
Command = ecGotoMarker0
ShortCut = 16432
end
item
Command = ecGotoMarker1
ShortCut = 16433
end
item
Command = ecGotoMarker2
ShortCut = 16434
end
item
Command = ecGotoMarker3
ShortCut = 16435
end
item
Command = ecGotoMarker4
ShortCut = 16436
end
item
Command = ecGotoMarker5
ShortCut = 16437
end
item
Command = ecGotoMarker6
ShortCut = 16438
end
item
Command = ecGotoMarker7
ShortCut = 16439
end
item
Command = ecGotoMarker8
ShortCut = 16440
end
item
Command = ecGotoMarker9
ShortCut = 16441
end
item
Command = ecSetMarker0
ShortCut = 24624
end
item
Command = ecSetMarker1
ShortCut = 24625
end
item
Command = ecSetMarker2
ShortCut = 24626
end
item
Command = ecSetMarker3
ShortCut = 24627
end
item
Command = ecSetMarker4
ShortCut = 24628
end
item
Command = ecSetMarker5
ShortCut = 24629
end
item
Command = ecSetMarker6
ShortCut = 24630
end
item
Command = ecSetMarker7
ShortCut = 24631
end
item
Command = ecSetMarker8
ShortCut = 24632
end
item
Command = ecSetMarker9
ShortCut = 24633
end
item
Command = EcFoldLevel1
ShortCut = 41009
end
item
Command = EcFoldLevel2
ShortCut = 41010
end
item
Command = EcFoldLevel3
ShortCut = 41011
end
item
Command = EcFoldLevel4
ShortCut = 41012
end
item
Command = EcFoldLevel5
ShortCut = 41013
end
item
Command = EcFoldLevel6
ShortCut = 41014
end
item
Command = EcFoldLevel7
ShortCut = 41015
end
item
Command = EcFoldLevel8
ShortCut = 41016
end
item
Command = EcFoldLevel9
ShortCut = 41017
end
item
Command = EcFoldLevel0
ShortCut = 41008
end
item
Command = EcFoldCurrent
ShortCut = 41005
end
item
Command = EcUnFoldCurrent
ShortCut = 41003
end
item
Command = EcToggleMarkupWord
ShortCut = 32845
end
item
Command = ecNormalSelect
ShortCut = 24654
end
item
Command = ecColumnSelect
ShortCut = 24643
end
item
Command = ecLineSelect
ShortCut = 24652
end
item
Command = ecTab
ShortCut = 9
end
item
Command = ecShiftTab
ShortCut = 8201
end
item
Command = ecMatchBracket
ShortCut = 24642
end
item
Command = ecColSelUp
ShortCut = 40998
end
item
Command = ecColSelDown
ShortCut = 41000
end
item
Command = ecColSelLeft
ShortCut = 40997
end
item
Command = ecColSelRight
ShortCut = 40999
end
item
Command = ecColSelPageDown
ShortCut = 40994
end
item
Command = ecColSelPageBottom
ShortCut = 57378
end
item
Command = ecColSelPageUp
ShortCut = 40993
end
item
Command = ecColSelPageTop
ShortCut = 57377
end
item
Command = ecColSelLineStart
ShortCut = 40996
end
item
Command = ecColSelLineEnd
ShortCut = 40995
end
item
Command = ecColSelEditorTop
ShortCut = 57380
end
item
Command = ecColSelEditorBottom
ShortCut = 57379
end>
MouseActions = <>
MouseTextActions = <>
MouseSelActions = <>
Lines.Strings = (
'MResult'
)
VisibleSpecialChars = [vscSpace, vscTabAtLast]
ReadOnly = True
SelectedColor.BackPriority = 50
SelectedColor.ForePriority = 50
SelectedColor.FramePriority = 50
SelectedColor.BoldPriority = 50
SelectedColor.ItalicPriority = 50
SelectedColor.UnderlinePriority = 50
SelectedColor.StrikeOutPriority = 50
BracketHighlightStyle = sbhsBoth
BracketMatchColor.Background = clNone
BracketMatchColor.Foreground = clNone
BracketMatchColor.Style = [fsBold]
FoldedCodeColor.Background = clNone
FoldedCodeColor.Foreground = clGray
FoldedCodeColor.FrameColor = clGray
MouseLinkColor.Background = clNone
MouseLinkColor.Foreground = clBlue
LineHighlightColor.Background = clNone
LineHighlightColor.Foreground = clNone
inline SynLeftGutterPartList1: TSynGutterPartList
object SynGutterMarks1: TSynGutterMarks
Width = 24
MouseActions = <>
end
object SynGutterLineNumber1: TSynGutterLineNumber
Width = 17
MouseActions = <>
MarkupInfo.Background = clBtnFace
MarkupInfo.Foreground = clNone
DigitCount = 2
ShowOnlyLineNumbersMultiplesOf = 1
ZeroStart = False
LeadingZeros = False
end
object SynGutterChanges1: TSynGutterChanges
Width = 4
MouseActions = <>
ModifiedColor = 59900
SavedColor = clGreen
end
object SynGutterSeparator1: TSynGutterSeparator
Width = 2
MouseActions = <>
MarkupInfo.Background = clWhite
MarkupInfo.Foreground = clGray
end
object SynGutterCodeFolding1: TSynGutterCodeFolding
MouseActions = <>
MarkupInfo.Background = clNone
MarkupInfo.Foreground = clGray
MouseActionsExpanded = <>
MouseActionsCollapsed = <>
end
end
end
end
object TSData: TTabSheet

View File

@ -56,7 +56,6 @@ type
MIExecuteScript: TMenuItem;
MIExecuteSelection: TMenuItem;
MIExecuteSingle: TMenuItem;
MResult: TMemo;
ODSQL: TOpenDialog;
PCResult: TPageControl;
FMSQL: TSynEdit;
@ -65,6 +64,7 @@ type
SDSQL: TSaveDialog;
SQuery: TSplitter;
SQLSyn: TSynSQLSyn;
MResult: TSynEdit;
TBExecute: TToolButton;
TBSep1: TToolButton;
TBPrevious: TToolButton;
@ -121,6 +121,7 @@ type
FSQLConstName: String;
FSQLQuoteOptions: TQuoteOptions;
FAbortScript : Boolean;
procedure AddToResult(const Msg: String; SetCursorPos : Boolean = false);
procedure ClearResults;
function CountStatements(const S: String): Integer;
function DetermineExecuteMode: TExecuteMode;
@ -129,7 +130,7 @@ type
procedure DoDirective(Sender: TObject; Directive, Argument: AnsiString; var StopExecution: Boolean);
procedure DoSQLStatement(Sender: TObject; Statement: TStrings; var StopExecution: Boolean);
// Execute SQL
procedure DoExecuteQuery(Const Qry: String; ACount : Integer = 0);
procedure DoExecuteQuery(const Qry: TStrings; ACount: Integer);
function GetTransaction: TSQLTransaction;
procedure LocalizeFrame;
function SelectionHint: Boolean;
@ -145,7 +146,7 @@ type
Public
Constructor Create(AOwner : TComponent); override;
Destructor Destroy; override;
Function ExecuteQuery(Const Qry: String; ACount : Integer = 0) : Boolean;
function ExecuteQuery(const Qry: TStrings; ACount: Integer = 0): Boolean;
procedure ExecuteScript(AScript: String);
procedure SaveQuery(AFileName: String);
procedure LoadQuery(AFileName: String);
@ -393,7 +394,7 @@ begin
RetryStatement:=False;
Inc(FStatementCount);
Repeat
If not ExecuteQuery(Statement.Text,FStatementCount) then
If not ExecuteQuery(Statement,FStatementCount) then
begin
If not RetryStatement then
Inc(FErrorCount);
@ -419,7 +420,10 @@ end;
procedure TQueryFrame.DoCommit(Sender: TObject);
begin
MResult.Append(SErrCommitNotSupported);
if not HaveTransaction then
AddToResult(SErrCommitNotSupported)
else
Transaction.Commit;
end;
procedure TQueryFrame.DoDirective(Sender: TObject; Directive, Argument: AnsiString; var StopExecution: Boolean);
@ -465,7 +469,6 @@ begin
FMSQL.Lines:=Dest
else
FMSQL.SelText:=Dest.Text
finally
Dest.Free;
Src.Free;
@ -530,9 +533,19 @@ begin
end;
procedure TQueryFrame.AExecuteSelectionExecute(Sender: TObject);
Var
SQL : TStrings;
begin
ClearResults;
ExecuteQuery(Trim(FMSQL.SelText));
SQL:=TStringList.Create;
try
SQL.Text:=FMSQL.SelText;
ExecuteQuery(SQL);
finally
SQL.Free;
end;
end;
procedure TQueryFrame.AExecuteSelectionScriptExecute(Sender: TObject);
@ -544,7 +557,7 @@ end;
procedure TQueryFrame.AExecuteSingleExecute(Sender: TObject);
begin
ClearResults;
ExecuteQuery(Trim(FMSQL.Lines.Text));
ExecuteQuery(FMSQL.Lines);
end;
procedure TQueryFrame.aRollBackExecute(Sender: TObject);
@ -694,11 +707,11 @@ begin
FMSQL.Lines.SaveToFile(AFileName);
end;
procedure TQueryFrame.DoExecuteQuery(const Qry: String; ACount: Integer);
procedure TQueryFrame.DoExecuteQuery(const Qry: TStrings; ACount: Integer);
Var
DS : TDataset;
S,RowsAff : String;
SQL,S,RowsAff : String;
N : Integer;
TS,TE : TDateTime;
@ -706,16 +719,18 @@ begin
RowsAff:='';
TS:=Now;
if ACount<>0 then
MResult.Append(Format(SExecutingSQLStatementCount,[DateTimeToStr(TS),ACount]))
AddToResult(Format(SExecutingSQLStatementCount,[DateTimeToStr(TS),ACount]))
else
MResult.Append(Format(SExecutingSQLStatement,[DateTimeToStr(TS)]));
MResult.Append(Qry);
AddToResult(Format(SExecutingSQLStatement,[DateTimeToStr(TS)]));
For S in Qry do
AddToResult(S,False);
If Not assigned(FEngine) then
Raise Exception.Create(SErrNoEngine);
S:=ExtractDelimited(1,Trim(Qry),[' ',#9,#13,#10]);
SQL:=Qry.Text;
S:=ExtractDelimited(1,Trim(SQL),[' ',#9,#13,#10]);
If (IndexText(S,['With','SELECT'])=-1) then
begin
N:=FEngine.RunQuery(Qry);
N:=FEngine.RunQuery(SQL);
TE:=Now;
If ecRowsAffected in FEngine.EngineCapabilities then
RowsAff:=Format(SRowsAffected,[N]);
@ -726,10 +741,10 @@ begin
begin
DS:=Dataset;
If Assigned(DS) then
FEngine.SetQueryStatement(Qry,DS)
FEngine.SetQueryStatement(SQL,DS)
else
begin
DS:=FEngine.CreateQuery(Qry,Self);
DS:=FEngine.CreateQuery(SQL,Self);
FData.Dataset:=DS;
end;
TSData.TabVisible:=true;
@ -739,15 +754,11 @@ begin
TE:=Now;
RowsAff:=Format(SRecordsFetched,[DS.RecordCount]);
end;
MResult.Append(Format(SSQLExecutedOK,[DateTimeToStr(TE)]));
{$IFDEF VER2_6}
MResult.Append(Format(SExecutionTime,[FormatDateTime('hh:nn:ss.zzz',TE-TS)]));
{$ELSE}
MResult.Append(Format(SExecutionTime,[FormatDateTime('hh:nn:ss.zzz',TE-TS,[fdoInterval])]));
{$ENDIF}
AddToResult(Format(SSQLExecutedOK,[DateTimeToStr(TE)]));
AddToResult(Format(SExecutionTime,[FormatDateTime('hh:nn:ss.zzz',TE-TS,[fdoInterval])]),RowsAff='');
if (RowsAff<>'') then
MResult.Append(RowsAff);
AddToHistory(Qry);
AddToResult(RowsAff,True);
AddToHistory(SQL);
ACloseQuery.Update;
end;
@ -761,8 +772,27 @@ begin
Result:=TSQLDBDDEngine(FEngine).Transaction;
end;
Procedure TQueryFrame.AddToResult(const Msg : String; SetCursorPos : Boolean = false);
function TQueryFrame.ExecuteQuery(const Qry: String; ACount: Integer): Boolean;
var
MsgLines : TStringList;
begin
MsgLines:=TStringList.Create;
try
MsgLines.Text:=Msg;
MResult.Lines.AddStrings(MsgLines);
if SetCursorPos then
begin
MResult.SelStart:=Length(MResult.Text);
MResult.EnsureCursorPosVisible;
end;
finally
MsgLines.Free;
end;
end;
function TQueryFrame.ExecuteQuery(const Qry: TStrings; ACount: Integer): Boolean;
Var
Msg : String;
@ -796,8 +826,7 @@ begin
if (Msg<>'') then
begin
PCResult.ActivePage:=TSResult;
MResult.Append(SErrorExecutingSQL);
MResult.Append(Msg);
AddToResult(Msg,True);
end;
Finally
if ACount<=0 then