Skip to content

Commit fe64c56

Browse files
committed
Issue #2607: make error dialog due to wrong WHERE clause show up asynchronously
1 parent a834721 commit fe64c56

1 file changed

Lines changed: 21 additions & 2 deletions

File tree

‎source/main.pas‎

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1326,6 +1326,7 @@ TMainForm = class(TExtForm)
13261326
FProposalItems: TProposalItemList;
13271327
FProposalLeftWidth: Integer;
13281328
FProposalTriggeredByDot: Boolean;
1329+
FPendingErrorMsg: String;
13291330

13301331
procedure SetDelimiter(Value: String);
13311332
procedure DisplayRowCountStats(Sender: TBaseVirtualTree);
@@ -1364,6 +1365,7 @@ TMainForm = class(TExtForm)
13641365
procedure SetHintFontByControl(Control: TWinControl=nil);
13651366
procedure GlobalSynEditStatusChange(Sender: TObject; Changes: TSynStatusChanges);
13661367
procedure ColorSchemeMenuClick(Sender: TObject);
1368+
procedure AsyncErrorDialog(Data: PtrInt);
13671369
public
13681370
QueryTabs: TQueryTabList;
13691371
ActiveObjectEditor: TDBObjectEditor;
@@ -2170,6 +2172,7 @@ procedure TMainForm.FormCreate(Sender: TObject);
21702172
FFormatSettings.ThousandSeparator := ' ';;
21712173
FDefaultHintFontName := Screen.HintFont.Name;
21722174
SetHintFontByControl(SynMemoQuery);
2175+
FPendingErrorMsg := '';
21732176

21742177
// Now we are free to use certain methods, which are otherwise fired too early
21752178
MainFormCreated := True;
@@ -6308,8 +6311,13 @@ procedure TMainForm.DataGridBeforePaint(Sender: TBaseVirtualTree; TargetCanvas:
63086311

63096312
except
63106313
// Wrong WHERE clause in most cases
6311-
on E:EDbError do
6312-
ErrorDialog(E.Message);
6314+
on E:EDbError do begin
6315+
// Caution on macOS: This runs inside the grid's paint cycle, i.e. within -[NSView drawRect:].
6316+
// A modal dialog opened here either deadlocks AppKit's display
6317+
// transaction or faults inside MessageDlg. Defer it to the next message.
6318+
FPendingErrorMsg := E.Message;
6319+
Application.QueueAsyncCall(AsyncErrorDialog, 0);
6320+
end;
63136321
end;
63146322

63156323
vt.EndUpdate;
@@ -15480,6 +15488,17 @@ procedure TMainForm.ColorSchemeMenuClick(Sender: TObject);
1548015488
end;
1548115489

1548215490

15491+
procedure TMainForm.AsyncErrorDialog(Data: PtrInt);
15492+
begin
15493+
if FPendingErrorMsg.IsEmpty then
15494+
Exit;
15495+
try
15496+
ErrorDialog(FPendingErrorMsg);
15497+
finally
15498+
FPendingErrorMsg := '';
15499+
end;
15500+
end;
15501+
1548315502
{ TQueryTab }
1548415503

1548515504

0 commit comments

Comments
 (0)