Index: CHANGES.txt ================================================================== --- CHANGES.txt +++ CHANGES.txt @@ -1,5 +1,11 @@ +Version [next] + +[Improved] Multi-threading is more standards-compliant now (thanks @Th69). + +------------------------------- + Version 0.13.1 2024-01-29 [Improved] Finding groff happens in a thread now. No more blocking on startup. [Removed] So we got rid of the loading window again. Index: src/groffstudio.lpi ================================================================== --- src/groffstudio.lpi +++ src/groffstudio.lpi @@ -21,12 +21,12 @@ - - + + Index: src/unit1.lfm ================================================================== --- src/unit1.lfm +++ src/unit1.lfm @@ -11,12 +11,12 @@ LCLVersion = '3.99.0.0' OnClose = FormClose OnCreate = FormCreate object MainStatusBar: TStatusBar Left = 0 - Height = 23 - Top = 669 + Height = 18 + Top = 674 Width = 847 Panels = < item Text = 'file name with save status' Width = 200 @@ -41,40 +41,40 @@ Style = tsFlatButtons TabIndex = 0 TabOrder = 1 object tsEdit: TTabSheet Caption = 'edit a groff document' - ClientHeight = 631 - ClientWidth = 819 + ClientHeight = 626 + ClientWidth = 821 ParentFont = False object GroupBox1: TGroupBox Left = 10 Height = 66 - Top = 560 - Width = 799 + Top = 555 + Width = 801 Align = alBottom BorderSpacing.Left = 10 BorderSpacing.Right = 10 BorderSpacing.Bottom = 5 Caption = 'build' - ClientHeight = 46 - ClientWidth = 795 + ClientHeight = 39 + ClientWidth = 791 TabOrder = 0 object Label1: TLabel Left = 184 - Height = 15 + Height = 16 Top = -4 - Width = 72 + Width = 83 Caption = 'macro to use:' ParentColor = False end object cmbMacro: TComboBox Left = 184 - Height = 23 + Height = 20 Top = 16 Width = 100 - ItemHeight = 15 + ItemHeight = 19 Items.Strings = ( 'man' 'me' 'mm' 'mom' @@ -82,50 +82,50 @@ ) TabOrder = 0 Text = '[ select ]' end object Label2: TLabel - Left = 672 - Height = 15 + Left = 659 + Height = 16 Top = -4 - Width = 78 + Width = 87 Anchors = [akTop, akRight] Caption = 'output format:' ParentColor = False end object rdPs: TRadioButton - Left = 673 - Height = 19 + Left = 655 + Height = 18 Top = 16 - Width = 71 + Width = 85 Anchors = [akTop, akRight] Caption = 'PostScript' TabOrder = 1 end object rdPdf: TRadioButton - Left = 753 - Height = 19 + Left = 738 + Height = 18 Top = 16 - Width = 39 + Width = 50 Anchors = [akTop, akRight] Caption = 'PDF' TabOrder = 2 end object Label3: TLabel - Left = 419 - Height = 15 + Left = 400 + Height = 16 Top = -4 - Width = 76 + Width = 91 Anchors = [akTop, akRight] Caption = 'preprocessors:' ParentColor = False end object Label4: TLabel - Left = 544 - Height = 15 + Left = 533 + Height = 16 Top = -4 - Width = 34 + Width = 41 Anchors = [akTop, akRight] Caption = 'extras:' ParentColor = False end object btnBuild: TButton @@ -141,21 +141,21 @@ TabOrder = 3 OnClick = btnBuildClick end object chkLogFile: TCheckBox Left = 80 - Height = 19 + Height = 18 Hint = 'If enabled, a log file containing the groff output will be placed alongside the source document.' Top = 16 - Width = 68 + Width = 79 Caption = 'log to file' Enabled = False TabOrder = 4 end object chkBoxPreprocessors: TCheckComboBox - Left = 419 - Height = 22 + Left = 415 + Height = 20 Top = 15 Width = 100 Anchors = [akTop, akRight] ItemHeight = 16 Items.Strings = ( @@ -165,66 +165,68 @@ 'pic' 'refer' 'tbl' ) TabOrder = 5 + Text = '0' end object chkBoxExtras: TCheckComboBox - Left = 544 - Height = 22 + Left = 540 + Height = 20 Top = 15 Width = 100 Anchors = [akTop, akRight] ItemHeight = 16 Items.Strings = ( 'hdtbl' 'Pdfmark' ) TabOrder = 6 + Text = '0' end end object btnSaveGroff: TButton - Left = 734 + Left = 736 Height = 28 - Top = 528 + Top = 523 Width = 75 Anchors = [akRight, akBottom] Caption = 'save' Font.Style = [fsBold] ParentFont = False TabOrder = 1 OnClick = btnSaveGroffClick end object btnLoadGroff: TButton - Left = 653 + Left = 655 Height = 28 - Top = 528 + Top = 523 Width = 75 Anchors = [akRight, akBottom] Caption = 'load' Font.Style = [fsBold] ParentFont = False TabOrder = 2 OnClick = btnLoadGroffClick end object Label5: TLabel - Left = 197 - Height = 15 - Top = 541 - Width = 438 + Left = 128 + Height = 16 + Top = 535 + Width = 509 Anchors = [akRight, akBottom] Caption = 'note that everything build-related will be stored in the document''s storage directory' Font.Color = clBlue Font.Style = [fsItalic] ParentColor = False ParentFont = False end inline SynEdit1: TSynEdit Left = 10 - Height = 523 + Height = 518 Top = 0 - Width = 799 + Width = 801 Anchors = [akTop, akLeft, akRight, akBottom] Font.CharSet = 4 Font.Height = -13 Font.Name = 'Andale Mono' Font.Pitch = fpFixed @@ -733,85 +735,85 @@ end end end object tsSettings: TTabSheet Caption = 'groffstudio settings' - ClientHeight = 631 - ClientWidth = 819 + ClientHeight = 626 + ClientWidth = 821 object chkAutoSaveBuildSettings: TCheckBox Left = 0 - Height = 19 + Height = 18 Top = 16 - Width = 309 + Width = 341 Caption = 'save and restore the chosen build settings for next time' TabOrder = 0 end object btnSaveSettings: TButton - Left = 730 + Left = 732 Height = 25 - Top = 600 + Top = 595 Width = 91 Anchors = [akRight, akBottom] Caption = 'save settings' TabOrder = 1 OnClick = btnSaveSettingsClick end object Label14: TLabel Left = 0 - Height = 15 + Height = 16 Top = 80 - Width = 129 + Width = 150 Caption = 'yes, that''s all for now. :-)' ParentColor = False end object chkUpdateCheckOnStart: TCheckBox Left = 0 - Height = 19 + Height = 18 Top = 40 - Width = 169 + Width = 190 Caption = 'check for updates on startup' TabOrder = 2 end end object tsGroff: TTabSheet Caption = 'groff version' - ClientHeight = 631 - ClientWidth = 819 + ClientHeight = 626 + ClientWidth = 821 object GroupBox2: TGroupBox Left = 20 Height = 57 - Top = 566 - Width = 779 + Top = 561 + Width = 781 Align = alBottom BorderSpacing.Left = 20 BorderSpacing.Right = 20 BorderSpacing.Bottom = 8 Caption = 'groff for Windows' - ClientHeight = 37 - ClientWidth = 775 + ClientHeight = 30 + ClientWidth = 771 TabOrder = 0 object Label6: TLabel Left = 8 - Height = 15 + Height = 16 Top = 8 - Width = 108 + Width = 125 Caption = 'latest version online:' ParentColor = False end object edtOnlineGroffVersionWindows: TEdit Left = 136 - Height = 15 + Height = 17 Top = 8 - Width = 542 + Width = 538 Anchors = [akTop, akLeft, akRight] BorderStyle = bsNone Enabled = False TabOrder = 0 Text = 'fetching ...' end object btnDownloadGroffWindows: TButton - Left = 686 + Left = 682 Height = 25 Top = 5 Width = 80 Anchors = [akTop, akRight] Caption = 'download it' @@ -819,42 +821,42 @@ OnClick = btnDownloadGroffWindowsClick end end object Label7: TLabel Left = 8 - Height = 30 + Height = 32 Top = 8 - Width = 807 + Width = 809 Anchors = [akTop, akLeft, akRight] Caption = 'as you might guess, groffstudio requires a working installation of groff. this page performs the basic checks for you. note that on windows, everything is harder than it should. :-)' Constraints.MaxHeight = 582 ParentColor = False WordWrap = True end object Label9: TLabel Left = 8 - Height = 15 + Height = 16 Top = 56 - Width = 70 + Width = 81 Caption = 'groff version:' ParentColor = False end object edtGroffInstalledVersion: TEdit Left = 144 - Height = 15 + Height = 17 Top = 56 - Width = 671 + Width = 673 Anchors = [akTop, akLeft, akRight] BorderStyle = bsNone Enabled = False TabOrder = 1 end object lblTroffCommandNotFound: TLabel Left = 8 - Height = 45 + Height = 48 Top = 112 - Width = 806 + Width = 808 Anchors = [akTop, akLeft, akRight] Caption = 'groff was not found. in order to use groffstudio, you absolutely need groff in your PATH variable. on unix and unix-like systems, you''ll need to edit the $PATH variable. on windows, i warmly recommend the Rapid Environment Editor for that.'#13#10'please exit groffstudio at your nearest convenience and adjust your PATH variables. then try again.' Font.Color = clRed ParentColor = False ParentFont = False @@ -861,95 +863,95 @@ Visible = False WordWrap = True end object edtGroffstudioInstalledVersion: TEdit Left = 144 - Height = 15 + Height = 17 Top = 77 - Width = 671 + Width = 673 Anchors = [akTop, akLeft, akRight] BorderStyle = bsNone Enabled = False TabOrder = 2 end object Label10: TLabel Left = 8 - Height = 15 + Height = 16 Top = 77 - Width = 103 + Width = 118 Caption = 'groffstudio version:' ParentColor = False end end object tsAbout: TTabSheet Caption = 'about groffstudio' - ClientHeight = 631 - ClientWidth = 819 + ClientHeight = 626 + ClientWidth = 821 object lblAboutProductName: TLabel Left = 0 - Height = 61 + Height = 53 Top = 16 - Width = 315 + Width = 297 Caption = 'groffstudio x.y.z' Font.Color = clBlue Font.Height = -45 ParentColor = False ParentFont = False end object Label8: TLabel Left = 20 - Height = 15 + Height = 16 Top = 80 - Width = 217 + Width = 246 Caption = 'brought to you by tux0r and contributors' ParentColor = False end object Label11: TLabel Left = 0 - Height = 15 + Height = 16 Top = 128 - Width = 45 + Width = 53 Caption = 'Website:' Font.Style = [fsItalic] ParentColor = False ParentFont = False end object Label12: TLabel Left = 0 - Height = 15 + Height = 16 Top = 152 - Width = 57 + Width = 69 Caption = 'Repository:' Font.Style = [fsItalic] ParentColor = False ParentFont = False end object Label13: TLabel Left = 0 - Height = 15 + Height = 16 Top = 176 - Width = 99 + Width = 119 Caption = 'Repository (mirror):' Font.Style = [fsItalic] ParentColor = False ParentFont = False end object mLicense: TMemo Left = 0 Height = 418 Top = 216 - Width = 826 + Width = 828 Anchors = [akTop, akLeft, akRight] ScrollBars = ssAutoBoth TabOrder = 0 end object lblWebsite: TLabel Cursor = crHandPoint Left = 120 - Height = 15 + Height = 16 Top = 128 - Width = 99 + Width = 113 Caption = 'groff.tuxproject.de' Font.Color = clBlue Font.Style = [fsUnderline] ParentColor = False ParentFont = False @@ -956,13 +958,13 @@ OnClick = lblWebsiteClick end object lblFossilRepo: TLabel Cursor = crHandPoint Left = 120 - Height = 15 + Height = 16 Top = 152 - Width = 121 + Width = 140 Caption = 'code.rosaelefanten.org' Font.Color = clBlue Font.Style = [fsUnderline] ParentColor = False ParentFont = False @@ -969,13 +971,13 @@ OnClick = lblFossilRepoClick end object lblGithubRepo: TLabel Cursor = crHandPoint Left = 120 - Height = 15 + Height = 16 Top = 176 - Width = 62 + Width = 68 Caption = 'github.com' Font.Color = clBlue Font.Style = [fsUnderline] ParentColor = False ParentFont = False Index: src/unit1.pas ================================================================== --- src/unit1.pas +++ src/unit1.pas @@ -94,75 +94,89 @@ procedure FormCreate(Sender: TObject); procedure lblFossilRepoClick(Sender: TObject); procedure lblGithubRepoClick(Sender: TObject); procedure lblWebsiteClick(Sender: TObject); procedure SynEdit1Change(Sender: TObject); -{$IFDEF DARWIN} + {$IFDEF DARWIN} procedure GetSocketHandler(Sender: TObject; const UseSSL: Boolean; out AHandler: TSocketHandler); -{$ENDIF} + {$ENDIF} private - var currentGroffFilePath: String; - var currentGroffFileName: String; - var unsavedChanges: Boolean; -{$IFDEF WINDOWS} - var latestGroffWindowsUrl: String; -{$ENDIF} - var storeBuildSettings: Boolean; - var updateCheck: Boolean; + var + currentGroffFilePath: string; + currentGroffFileName: string; + unsavedChanges: boolean; + {$IFDEF WINDOWS} + atestGroffWindowsUrl: String; + {$ENDIF} + storeBuildSettings: boolean; + updateCheck: boolean; public end; TDetectGroffThread = class(TThread) - procedure Execute; Override; + private + procedure UpdateUI; + protected + procedure Execute; override; end; var MainForm: TMainForm; BuildWindow: TBuildStatusWindow; - hasGroff: Boolean; + hasGroff: boolean; + GroffOutputVersion: string; implementation {$R *.lfm} + +procedure TDetectGroffThread.UpdateUI; +begin + MainForm.edtGroffInstalledVersion.Text := GroffOutputVersion; + if pos('GNU', GroffOutputVersion) = 0 then + begin + ShowMessage('groffstudio thinks that your installed version of troff is not GNU troff.' + + LineEnding + 'If this is correct, you are advised to fix this before continuing.' + + LineEnding + + 'If it is an error, please tell me so I can improve this detection.'); + hasGroff := True; + end + else + begin + MainForm.edtGroffInstalledVersion.Text := 'n/a'; + hasGroff := False; + MainForm.lblTroffCommandNotFound.Visible := True; + end; +end; procedure TDetectGroffThread.Execute; -var - GroffOutputVersion: String; begin FreeOnTerminate := True; {$IFDEF WINDOWS} if RunCommand('cmd', ['/c', 'troff --version'], GroffOutputVersion, [], swoHIDE) then {$ELSE} - if RunCommand('/bin/sh', ['-c', 'troff --version'], GroffOutputVersion, [], swoHIDE) then + if RunCommand('/bin/sh', ['-c', 'troff --version'], GroffOutputVersion, + [], swoHIDE) then {$ENDIF} begin - MainForm.edtGroffInstalledVersion.Text := GroffOutputVersion; - if pos('GNU', GroffOutputVersion) = 0 then - ShowMessage('groffstudio thinks that your installed version of troff is not GNU troff.' + LineEnding + - 'If this is correct, you are advised to fix this before continuing.' + LineEnding + - 'If it is an error, please tell me so I can improve this detection.'); - hasGroff := True; - end else begin - MainForm.edtGroffInstalledVersion.Text := 'n/a'; - hasGroff := False; - MainForm.lblTroffCommandNotFound.Visible := True; + Synchronize(@UpdateUI); end; end; { TMainForm } procedure TMainForm.FormCreate(Sender: TObject); var - OnlineVersionsFile: String; + OnlineVersionsFile: string; {$IFDEF WINDOWS} reGroffVersion: TRegExpr; {$ENDIF} reGroffStudioVersion: TRegExpr; FileVerInfo: TFileVersionInfo; - HasVersionUpdate: Integer; + HasVersionUpdate: integer; GroffHelpers: TGroffHelpers; ResStream: TResourceStream; {$IFDEF DARWIN} HTTPClient: TFPHttpClient; {$ENDIF} @@ -172,11 +186,11 @@ // Default file name currentGroffFileName := '[unsaved file]'; // Embed the license - ResStream:= TResourceStream.Create(HInstance, 'LICENSE', RT_RCDATA); + ResStream := TResourceStream.Create(HInstance, 'LICENSE', RT_RCDATA); try mLicense.Lines.LoadFromStream(ResStream); finally ResStream.Free; end; @@ -184,42 +198,45 @@ // Restore the settings iniStorage.Restore; storeBuildSettings := iniStorage.ReadBoolean('AutoSaveBuildSettings', False); chkAutoSaveBuildSettings.Checked := storeBuildSettings; -{$IF DEFINED(LINUX) OR DEFINED(BSD)} + {$IF DEFINED(LINUX) OR DEFINED(BSD)} // On platforms which probably use a package manager (currently, Linux and // BSDs), the "update check" checkbox is disabled. chkUpdateCheckOnStart.Enabled := False; -{$ELSE} + {$ELSE} updateCheck := iniStorage.ReadBoolean('UpdateCheckOnStart', False); chkUpdateCheckOnStart.Checked := updateCheck; -{$ENDIF} + {$ENDIF} if storeBuildSettings then begin - chkLogFile.Checked := iniStorage.ReadBoolean('BuildLogFile', False); - cmbMacro.Text := iniStorage.ReadString('BuildChosenMacro', '[ select ]'); - chkBoxPreprocessors.Checked[0] := iniStorage.ReadBoolean('BuildUseChem', False); - chkBoxPreprocessors.Checked[1] := iniStorage.ReadBoolean('BuildUseEqn', False); - chkBoxPreprocessors.Checked[2] := iniStorage.ReadBoolean('BuildUseGrn', False); - chkBoxPreprocessors.Checked[3] := iniStorage.ReadBoolean('BuildUsePic', False); - chkBoxPreprocessors.Checked[4] := iniStorage.ReadBoolean('BuildUseRefer', False); - chkBoxPreprocessors.Checked[5] := iniStorage.ReadBoolean('BuildUseTbl', False); - chkBoxExtras.Checked[0] := iniStorage.ReadBoolean('BuildUseHdtbl', False); - chkBoxExtras.Checked[1] := iniStorage.ReadBoolean('BuildUsePdfMark', False); - rdPs.Checked := iniStorage.ReadBoolean('BuildToPostscript', False); - rdPdf.Checked := iniStorage.ReadBoolean('BuildToPDF', False); + chkLogFile.Checked := iniStorage.ReadBoolean('BuildLogFile', False); + cmbMacro.Text := iniStorage.ReadString('BuildChosenMacro', '[ select ]'); + chkBoxPreprocessors.Checked[0] := iniStorage.ReadBoolean('BuildUseChem', False); + chkBoxPreprocessors.Checked[1] := iniStorage.ReadBoolean('BuildUseEqn', False); + chkBoxPreprocessors.Checked[2] := iniStorage.ReadBoolean('BuildUseGrn', False); + chkBoxPreprocessors.Checked[3] := iniStorage.ReadBoolean('BuildUsePic', False); + chkBoxPreprocessors.Checked[4] := iniStorage.ReadBoolean('BuildUseRefer', False); + chkBoxPreprocessors.Checked[5] := iniStorage.ReadBoolean('BuildUseTbl', False); + chkBoxExtras.Checked[0] := iniStorage.ReadBoolean('BuildUseHdtbl', False); + chkBoxExtras.Checked[1] := iniStorage.ReadBoolean('BuildUsePdfMark', False); + rdPs.Checked := iniStorage.ReadBoolean('BuildToPostscript', False); + rdPdf.Checked := iniStorage.ReadBoolean('BuildToPDF', False); end; // What's the latest available version? FileVerInfo := TFileVersionInfo.Create(nil); try FileVerInfo.ReadFileInfo; - edtGroffStudioInstalledVersion.Text := FileVerInfo.VersionStrings.Values['FileVersion']; - lblAboutProductName.Caption := FileVerInfo.VersionStrings.Values['ProductName'] + ' ' + FileVerInfo.VersionStrings.Values['FileVersion']; + edtGroffStudioInstalledVersion.Text := + FileVerInfo.VersionStrings.Values['FileVersion']; + lblAboutProductName.Caption := + FileVerInfo.VersionStrings.Values['ProductName'] + ' ' + + FileVerInfo.VersionStrings.Values['FileVersion']; MainStatusBar.Panels[2].Text := ''; {$IFDEF WINDOWS} if updateCheck then begin @@ -281,11 +298,11 @@ if updateCheck then HTTPClient.Free; end; {$ENDIF} edtOnlineGroffVersionWindows.Text := 'n/a'; btnDownloadGroffWindows.Enabled := False; - {$ENDIF} + {$ENDIF} finally FileVerInfo.Free; end; // Loaded file display @@ -317,22 +334,22 @@ unsavedChanges := True; end; procedure TMainForm.btnDownloadGroffWindowsClick(Sender: TObject); begin - {$IFDEF WINDOWS} + {$IFDEF WINDOWS} // On other systems, the button is disabled anyway. OpenURL(latestGroffWindowsUrl); - {$ENDIF} + {$ENDIF} end; procedure TMainForm.btnBuildClick(Sender: TObject); var - buildSuccess: Boolean; - buildOpts: String; - logFileName: String = ''; - outputFileName: String; + buildSuccess: boolean; + buildOpts: string; + logFileName: string = ''; + outputFileName: string; begin // Reset status display: MainStatusBar.Panels[1].Text := ''; BuildWindow := TBuildStatusWindow.Create(Application); @@ -346,26 +363,28 @@ // - Enforce UTF-8: buildOpts := buildOpts + ' -Kutf8'; // - Preprocessors: - if chkBoxPreprocessors.Checked[0] then buildOpts := buildOpts + ' -chem'; - if chkBoxPreprocessors.Checked[1] then buildOpts := buildOpts + ' -eqn'; - if chkBoxPreprocessors.Checked[2] then buildOpts := buildOpts + ' -grn'; - if chkBoxPreprocessors.Checked[3] then buildOpts := buildOpts + ' -pic'; - if chkBoxPreprocessors.Checked[4] then buildOpts := buildOpts + ' -refer'; - if chkBoxPreprocessors.Checked[5] then buildOpts := buildOpts + ' -tbl'; + if chkBoxPreprocessors.Checked[0] then buildOpts := buildOpts + ' -chem'; + if chkBoxPreprocessors.Checked[1] then buildOpts := buildOpts + ' -eqn'; + if chkBoxPreprocessors.Checked[2] then buildOpts := buildOpts + ' -grn'; + if chkBoxPreprocessors.Checked[3] then buildOpts := buildOpts + ' -pic'; + if chkBoxPreprocessors.Checked[4] then buildOpts := buildOpts + ' -refer'; + if chkBoxPreprocessors.Checked[5] then buildOpts := buildOpts + ' -tbl'; if chkBoxExtras.Checked[0] then buildOpts := buildOpts + ' -mhdtbl'; // - PDF-specifics: - if rdPdf.Checked then begin + if rdPdf.Checked then + begin buildOpts := buildOpts + ' -Tpdf'; if chkBoxExtras.Checked[1] then buildOpts := buildOpts + ' -mpdfmark'; outputFileName := currentGroffFilePath + '.pdf'; end - else outputFileName := currentGroffFilePath + '.ps'; + else + outputFileName := currentGroffFilePath + '.ps'; // - Input file: buildOpts := buildOpts + ' ' + currentGroffFilePath; buildOpts := buildOpts + ' > ' + outputFileName; @@ -382,19 +401,21 @@ FreeAndNil(BuildWindow); end; procedure TMainForm.btnLoadGroffClick(Sender: TObject); var - Reply, BoxStyle: Integer; + Reply, BoxStyle: integer; begin // If the current file has unsaved changes, ask first. - if unsavedChanges then with Application do begin - BoxStyle := MB_ICONQUESTION + MB_YESNO; - Reply := MessageBox('Do you want to save the document first?', 'UnsavedChanges', BoxStyle); - if Reply = IDYES then SynEdit1.Lines.SaveToFile(currentGroffFilePath); - unsavedChanges := False; - end; + if unsavedChanges then with Application do + begin + BoxStyle := MB_ICONQUESTION + MB_YESNO; + Reply := MessageBox('Do you want to save the document first?', + 'UnsavedChanges', BoxStyle); + if Reply = idYes then SynEdit1.Lines.SaveToFile(currentGroffFilePath); + unsavedChanges := False; + end; if odOpenGroffFile.Execute then begin if FileExists(odOpenGroffFile.FileName) then begin @@ -423,11 +444,12 @@ begin currentGroffFilePath := sdSaveGroffFile.FileName; currentGroffFileName := ExtractFileName(currentGroffFilePath); SynEdit1.Lines.SaveToFile(sdSaveGroffFile.FileName); - if hasGroff then begin + if hasGroff then + begin btnBuild.Enabled := True; chkLogFile.Enabled := True; end; end; @@ -459,19 +481,21 @@ iniStorage.Save; end; procedure TMainForm.FormClose(Sender: TObject; var CloseAction: TCloseAction); var - Reply, BoxStyle: Integer; + Reply, BoxStyle: integer; begin // If the current file has unsaved changes, ask first. if unsavedChanges then - with Application do begin - BoxStyle := MB_ICONQUESTION + MB_YESNO; - Reply := MessageBox('Do you want to save the document first?', 'UnsavedChanges', BoxStyle); - if Reply = IDYES then btnSaveGroffClick(Sender); - end; + with Application do + begin + BoxStyle := MB_ICONQUESTION + MB_YESNO; + Reply := MessageBox('Do you want to save the document first?', + 'UnsavedChanges', BoxStyle); + if Reply = idYes then btnSaveGroffClick(Sender); + end; end; {$IFDEF DARWIN} // Fix HTTPS on macOS: procedure TMainForm.GetSocketHandler(Sender: TObject; const UseSSL: Boolean; out AHandler: TSocketHandler); @@ -482,6 +506,5 @@ end else AHandler := TSocketHandler.Create; end; {$ENDIF} end. -