@@ -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);
1548015488end;
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