Create OnChange event for TQueryTab.Memo in TMainForm, replacing OnStatusChange and TQueryTab.MemoOnChange events. OnStatusChange only fires when setting Memo.Modified, so the line/char status bar panel was not updated in many cases. Likely also affected the "run" button: issue #1319

This commit is contained in:
Ansgar Becker
2021-04-15 09:01:38 +02:00
parent 75492fc553
commit 38e5409dbe
2 changed files with 23 additions and 33 deletions

View File

@@ -1339,9 +1339,9 @@ object MainForm: TMainForm
RightEdge = 0
TabWidth = 3
WantTabs = True
OnChange = SynMemoQueryChange
OnDropFiles = SynMemoQueryDropFiles
OnReplaceText = SynMemoQueryReplaceText
OnStatusChange = SynMemoQueryStatusChange
OnPaintTransient = SynMemoQueryPaintTransient
OnScanForFoldRanges = SynMemoQueryScanForFoldRanges
FontSmoothing = fsmNone

View File

@@ -75,16 +75,13 @@ type
HelperNodeProfile = 5;
HelperNodeBinding = 6;
private
FMemo: TSynMemo;
FMemoFilename: String;
FQueryRunning: Boolean;
FLastChange: TDateTime;
procedure SetMemo(Value: TSynMemo);
procedure SetMemoFilename(Value: String);
procedure SetQueryRunning(Value: Boolean);
procedure TimerLastChangeOnTimer(Sender: TObject);
procedure TimerStatusUpdateOnTimer(Sender: TObject);
procedure MemoOnChange(Sender: TObject);
function GetBindParamsActivated: Boolean;
procedure SetBindParamsActivated(Value: Boolean);
public
@@ -93,6 +90,7 @@ type
ExecutionThread: TQueryThread;
CloseButton: TSpeedButton;
pnlMemo: TPanel;
Memo: TSynMemo;
pnlHelpers: TPanel;
filterHelpers: TButtonedEdit;
treeHelpers: TVirtualStringTree;
@@ -122,7 +120,6 @@ type
procedure SaveContents(Filename: String; OnlySelection: Boolean);
procedure BackupUnsavedContent;
property ActiveResultTab: TResultTab read GetActiveResultTab;
property Memo: TSynMemo read FMemo write SetMemo;
property MemoFilename: String read FMemoFilename write SetMemoFilename;
function MemoBackupFilename: String;
property QueryRunning: Boolean read FQueryRunning write SetQueryRunning;
@@ -822,7 +819,6 @@ type
TargetCanvas: TCanvas);
procedure LogSQL(Msg: String; Category: TDBLogCategory=lcInfo; Connection: TDBConnection=nil);
procedure KillProcess(Sender: TObject);
procedure SynMemoQueryStatusChange(Sender: TObject; Changes: TSynStatusChanges);
procedure TimerHostUptimeTimer(Sender: TObject);
procedure ListTablesNewText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; NewText: String);
@@ -1137,6 +1133,7 @@ type
procedure actConnectionPropertiesExecute(Sender: TObject);
procedure actRenameQueryTabExecute(Sender: TObject);
procedure menuRenameQueryTabClick(Sender: TObject);
procedure SynMemoQueryChange(Sender: TObject);
private
// Executable file details
FAppVerMajor: Integer;
@@ -1333,6 +1330,7 @@ var
SecondInstMsgId: UINT = 0;
SysLanguage: String;
MainFormCreated: Boolean = False;
MainFormAfterCreateDone: Boolean = False;
PostponedLogItems: TDBLogItems;
const
@@ -2284,6 +2282,8 @@ begin
SetMainTab(Tab.TabSheet);
end;
end;
MainFormAfterCreateDone := True;
end;
@@ -5993,7 +5993,7 @@ begin
end else if IsQueryTab(tab.PageIndex, True) then begin
ActiveQueryMemo.SetFocus;
ActiveQueryMemo.WordWrap := actQueryWordWrap.Checked;
SynMemoQueryStatusChange(ActiveQueryMemo, []);
SynMemoQueryChange(ActiveQueryMemo);
end;
end;
@@ -6696,27 +6696,36 @@ begin
end;
procedure TMainForm.SynMemoQueryStatusChange(Sender: TObject; Changes:
TSynStatusChanges);
procedure TMainForm.SynMemoQueryChange(Sender: TObject);
var
Edit: TSynMemo;
Tab: TQueryTab;
begin
// Crashed with scTopLine and an non-set ActiveQueryTab while resizing main window, so limit to modifications
if not (scModified in Changes) then
if not MainFormAfterCreateDone then
Exit;
// Don't ask for saving empty contents. See issue #614
Edit := Sender as TSynMemo;
Tab := ActiveQueryTab;
// Check if bind param detection is enabled for text size <1M
// Uncheck checkbox if it's bigger
// Code moved back from TQueryTab.MemoOnChange here
Tab.TimerLastChange.Enabled := False;
Tab.FLastChange := Now;
Tab.TimerLastChange.Enabled := True;
// Don't ask for saving empty contents. See issue #614
if Edit.GetTextLen = 0 then begin
ActiveQueryTab.MemoFilename := '';
ActiveQueryTab.Memo.Modified := False;
end;
// Update various controls
ValidateQueryControls(Sender);
UpdateLineCharPanel;
end;
procedure TMainForm.TimerHostUptimeTimer(Sender: TObject);
var
Conn: TDBConnection;
@@ -11392,13 +11401,13 @@ begin
QueryTab.Memo.Gutter.Assign(SynMemoQuery.Gutter);
QueryTab.Memo.Font.Assign(SynMemoQuery.Font);
QueryTab.Memo.ActiveLineColor := SynMemoQuery.ActiveLineColor;
QueryTab.Memo.OnChange := SynMemoQuery.OnChange;
QueryTab.Memo.OnDragDrop := SynMemoQuery.OnDragDrop;
QueryTab.Memo.OnDragOver := SynMemoQuery.OnDragOver;
QueryTab.Memo.OnDropFiles := SynMemoQuery.OnDropFiles;
QueryTab.Memo.OnKeyPress := SynMemoQuery.OnKeyPress;
QueryTab.Memo.OnMouseWheel := SynMemoQuery.OnMouseWheel;
QueryTab.Memo.OnReplaceText := SynMemoQuery.OnReplaceText;
QueryTab.Memo.OnStatusChange := SynMemoQuery.OnStatusChange;
QueryTab.Memo.OnPaintTransient := SynMemoQuery.OnPaintTransient;
SynCompletionProposal.AddEditor(QueryTab.Memo);
@@ -13919,15 +13928,6 @@ begin
end;
procedure TQueryTab.SetMemo(Value: TSynMemo);
begin
// Apply existing SynMemo and its events (only OnChange yet).
// TODO: Move more Memo events from TMainForm.actNewQueryTabExecute here, and keep there procedures in TQueryTab.
FMemo := Value;
FMemo.OnChange := MemoOnChange;
end;
procedure TQueryTab.MemofileModifiedTimerNotify(Sender: TObject);
var
OldTopLine: Integer;
@@ -14130,16 +14130,6 @@ begin
end;
procedure TQueryTab.MemoOnChange(Sender: TObject);
begin
// Check if bind param detection is enabled for text size <1M
// Uncheck checkbox if it's bigger
TimerLastChange.Enabled := False;
FLastChange := Now;
TimerLastChange.Enabled := True;
end;
procedure TQueryTab.TimerLastChangeOnTimer(Sender: TObject);
var
rx: TRegExpr;