Fix more potential theme related EAccessViolation's, due to Action:=caFree in OnClose event of modal forms. Their caller now frees these modal forms. In non-modal forms, keep caFree in OnClose but remove existing OnDestroy events, moving code to OnClose instead.

https://www.heidisql.com/forum.php?t=38043
https://stackoverflow.com/questions/2075405/how-to-close-non-modal-form-in-delphi
This commit is contained in:
Ansgar Becker
2021-06-22 20:37:34 +02:00
parent 963085463d
commit cb1024b048
23 changed files with 56 additions and 134 deletions

View File

@ -16,7 +16,6 @@ object frmColumnSelection: TfrmColumnSelection
OldCreateOrder = False
OnClose = FormClose
OnCreate = FormCreate
OnDestroy = FormDestroy
OnDeactivate = FormDeactivate
OnShow = FormShow
DesignSize = (

View File

@ -23,7 +23,6 @@ type
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormDeactivate(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure editFilterLeftButtonClick(Sender: TObject);
private
{ Private declarations }
@ -52,14 +51,6 @@ begin
end;
procedure TfrmColumnSelection.FormDestroy(Sender: TObject);
begin
AppSettings.WriteInt(asColumnSelectorWidth, Width);
AppSettings.WriteInt(asColumnSelectorHeight, Height);
FCheckedColumns.Free;
end;
{**
FormShow
}
@ -234,7 +225,10 @@ end;
procedure TfrmColumnSelection.FormClose(Sender: TObject; var Action:
TCloseAction);
begin
AppSettings.WriteInt(asColumnSelectorWidth, Width);
AppSettings.WriteInt(asColumnSelectorHeight, Height);
Action := caFree;
FCheckedColumns.Free;
end;

View File

@ -18,7 +18,6 @@ object connform: Tconnform
OnClose = FormClose
OnCloseQuery = FormCloseQuery
OnCreate = FormCreate
OnDestroy = FormDestroy
OnResize = FormResize
OnShow = FormShow
DesignSize = (

View File

@ -156,7 +156,6 @@ type
NewNode: PVirtualNode; OldColumn, NewColumn: TColumnIndex;
var Allowed: Boolean);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormDestroy(Sender: TObject);
procedure TimerStatisticsTimer(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ListSessionsCreateEditor(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex;
@ -340,18 +339,6 @@ begin
end;
procedure Tconnform.FormDestroy(Sender: TObject);
begin
// Save GUI stuff
AppSettings.WriteInt(asSessionManagerListWidth, pnlLeft.Width);
AppSettings.WriteInt(asSessionManagerWindowWidth, Width);
AppSettings.WriteInt(asSessionManagerWindowHeight, Height);
AppSettings.WriteInt(asSessionManagerWindowLeft, Left);
AppSettings.WriteInt(asSessionManagerWindowTop, Top);
MainForm.SaveListSetup(ListSessions);
end;
procedure Tconnform.FormResize(Sender: TObject);
begin
splitterMainMoved(splitterMain);
@ -368,7 +355,13 @@ procedure Tconnform.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// Suspend calculating statistics as long as they're not visible
TimerStatistics.Enabled := False;
Action := caFree;
// Save GUI stuff
AppSettings.WriteInt(asSessionManagerListWidth, pnlLeft.Width);
AppSettings.WriteInt(asSessionManagerWindowWidth, Width);
AppSettings.WriteInt(asSessionManagerWindowHeight, Height);
AppSettings.WriteInt(asSessionManagerWindowLeft, Left);
AppSettings.WriteInt(asSessionManagerWindowTop, Top);
MainForm.SaveListSetup(ListSessions);
end;

View File

@ -16,7 +16,6 @@ object CopyTableForm: TCopyTableForm
Position = poMainFormCenter
OnClose = FormClose
OnCreate = FormCreate
OnDestroy = FormDestroy
OnResize = FormResize
OnShow = FormShow
DesignSize = (

View File

@ -32,7 +32,6 @@ type
Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: TImageIndex);
procedure TreeElementsInitChildren(Sender: TBaseVirtualTree; Node: PVirtualNode;
var ChildCount: Cardinal);
procedure FormDestroy(Sender: TObject);
procedure TreeElementsChecked(Sender: TBaseVirtualTree; Node: PVirtualNode);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure btnRecentFiltersClick(Sender: TObject);
@ -75,14 +74,6 @@ begin
end;
procedure TCopyTableForm.FormDestroy(Sender: TObject);
begin
// Save GUI stuff
AppSettings.WriteInt(asCopyTableWindowWidth, Width);
AppSettings.WriteInt(asCopyTableWindowHeight, Height);
end;
procedure TCopyTableForm.FormResize(Sender: TObject);
var
HalfWidth: Integer;
@ -193,7 +184,9 @@ begin
AppSettings.WriteString(asCopyTableRecentFilter, NewValues[i], IntToStr(i));
end;
end;
Action := caFree;
// Store GUI setup
AppSettings.WriteInt(asCopyTableWindowWidth, Width);
AppSettings.WriteInt(asCopyTableWindowHeight, Height);
end;

View File

@ -12,7 +12,6 @@ object frmCsvDetector: TfrmCsvDetector
Font.Style = []
OldCreateOrder = False
Position = poOwnerFormCenter
OnClose = FormClose
OnCreate = FormCreate
OnShow = FormShow
DesignSize = (

View File

@ -15,7 +15,6 @@ type
btnSave: TButton;
TimerStartScan: TTimer;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure btnScanClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure btnSaveClick(Sender: TObject);
@ -53,12 +52,6 @@ begin
TimerStartScan.Enabled := True;
end;
procedure TfrmCsvDetector.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
procedure TfrmCsvDetector.btnScanClick(Sender: TObject);
var
Stream: TFileStream;

View File

@ -15,7 +15,6 @@ object frmInsertFiles: TfrmInsertFiles
Font.Style = []
OldCreateOrder = False
Position = poOwnerFormCenter
OnClose = FormClose
OnCreate = FormCreate
OnDestroy = FormDestroy
OnShow = FormShow

View File

@ -52,7 +52,6 @@ type
procedure FormCreate(Sender: TObject);
procedure btnInsertClick(Sender: TObject);
procedure AddFile(Filename: String);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ListFilesGetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer);
procedure ListFilesGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex;
TextType: TVSTTextType; var CellText: string);
@ -151,12 +150,6 @@ begin
end;
procedure TfrmInsertFiles.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
procedure TfrmInsertFiles.ListColumnsFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
ColInfo: PColInfo;

View File

@ -16,7 +16,6 @@ object loaddataform: Tloaddataform
Position = poMainFormCenter
OnClose = FormClose
OnCreate = FormCreate
OnDestroy = FormDestroy
OnResize = FormResize
OnShow = FormShow
DesignSize = (

View File

@ -55,7 +55,6 @@ type
btnCheckAll: TToolButton;
const ProgressBarSteps=100;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure editFilenameChange(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure comboDatabaseChange(Sender: TObject);
@ -114,25 +113,6 @@ begin
end;
procedure Tloaddataform.FormDestroy(Sender: TObject);
begin
// Save settings
AppSettings.WriteInt(asCSVImportWindowWidth, Width);
AppSettings.WriteInt(asCSVImportWindowHeight, Height);
AppSettings.WriteString(asCSVImportFilename, editFilename.Text);
AppSettings.WriteString(asCSVImportSeparator, editFieldTerminator.Text);
AppSettings.WriteString(asCSVImportEncloser, editFieldEncloser.Text);
AppSettings.WriteString(asCSVImportTerminator, editLineTerminator.Text);
AppSettings.WriteBool(asCSVImportFieldsEnclosedOptionally, chkFieldsEnclosedOptionally.Checked);
AppSettings.WriteString(asCSVImportFieldEscaper, editFieldEscaper.Text);
AppSettings.WriteInt(asCSVImportIgnoreLines, updownIgnoreLines.Position);
AppSettings.WriteBool(asCSVImportLowPriority, chkLowPriority.Checked);
AppSettings.WriteBool(asCSVImportLocalNumbers, chkLocalNumbers.Checked);
AppSettings.WriteInt(asCSVImportDuplicateHandling, grpDuplicates.ItemIndex);
AppSettings.WriteInt(asCSVImportParseMethod, grpParseMethod.ItemIndex);
end;
procedure Tloaddataform.FormResize(Sender: TObject);
var
HalfWidth, RightBoxX: Integer;
@ -179,7 +159,20 @@ end;
procedure Tloaddataform.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
// Save settings
AppSettings.WriteInt(asCSVImportWindowWidth, Width);
AppSettings.WriteInt(asCSVImportWindowHeight, Height);
AppSettings.WriteString(asCSVImportFilename, editFilename.Text);
AppSettings.WriteString(asCSVImportSeparator, editFieldTerminator.Text);
AppSettings.WriteString(asCSVImportEncloser, editFieldEncloser.Text);
AppSettings.WriteString(asCSVImportTerminator, editLineTerminator.Text);
AppSettings.WriteBool(asCSVImportFieldsEnclosedOptionally, chkFieldsEnclosedOptionally.Checked);
AppSettings.WriteString(asCSVImportFieldEscaper, editFieldEscaper.Text);
AppSettings.WriteInt(asCSVImportIgnoreLines, updownIgnoreLines.Position);
AppSettings.WriteBool(asCSVImportLowPriority, chkLowPriority.Checked);
AppSettings.WriteBool(asCSVImportLocalNumbers, chkLocalNumbers.Checked);
AppSettings.WriteInt(asCSVImportDuplicateHandling, grpDuplicates.ItemIndex);
AppSettings.WriteInt(asCSVImportParseMethod, grpParseMethod.ItemIndex);
end;
@ -274,6 +267,7 @@ begin
comboTable.ItemIndex := 0;
end;
end;
frmCsvDetector.Free;
frmCsvDetector := nil; // check for Assigned() must be false in SetupSynEditors
end;

View File

@ -2213,7 +2213,7 @@ begin
on E:Exception do
LogSQL(f_('Error when checking for updates: %s', [E.Message]));
end;
frm.Free;
frm.Free; // FormClose has no caFree, as it may not have been called
end;
end;
@ -2554,6 +2554,7 @@ var
begin
Dialog := TConnForm.Create(Self);
Dialog.ShowModal;
Dialog.Free;
end;
@ -2575,6 +2576,7 @@ begin
if FConnections.Count = 0 then begin
Dialog := TConnForm.Create(Self);
DlgResult := Dialog.ShowModal;
Dialog.Free;
if DlgResult = mrCancel then
actExitApplication.Execute;
end;
@ -2673,6 +2675,7 @@ begin
// Import Textfile
Dialog := Tloaddataform.Create(Self);
Dialog.ShowModal;
Dialog.Free;
end;
procedure TMainForm.actPreferencesExecute(Sender: TObject);
@ -2804,6 +2807,7 @@ var
begin
Dialog := TUserManagerForm.Create(Self);
Dialog.ShowModal;
Dialog.Free;
end;
procedure TMainForm.actAboutBoxExecute(Sender: TObject);
@ -2949,6 +2953,7 @@ begin
// copy table
Dialog := TCopyTableForm.Create(Self);
Dialog.ShowModal;
Dialog.Free;
end;
@ -3734,6 +3739,7 @@ var
begin
Dialog := TfrmInsertFiles.Create(Self);
Dialog.ShowModal;
Dialog.Free;
end;
// Drop Table(s)
@ -4413,7 +4419,7 @@ var
begin
frm := TfrmUpdateCheck.Create(Self);
frm.ShowModal;
FreeAndNil(frm);
frm.Free; // FormClose has no caFree, as it may not have been called
end;
@ -4741,6 +4747,7 @@ var
begin
SyncForm := TfrmSyncDB.Create(Self);
SyncForm.ShowModal;
SyncForm.Free;
end;
@ -4763,6 +4770,7 @@ end;
procedure TMainform.CallSQLHelpWithKeyword( keyword: String );
begin
if FActiveDbObj.Connection.ServerVersionInt >= 40100 then begin
if not Assigned(SqlHelpDialog) then
SqlHelpDialog := TfrmSQLhelp.Create(Self);
SqlHelpDialog.Show;
SqlHelpDialog.Keyword := keyword;

View File

@ -14,7 +14,6 @@ object frmSQLhelp: TfrmSQLhelp
OldCreateOrder = False
OnClose = FormClose
OnCreate = FormCreate
OnDestroy = FormDestroy
OnShow = FormShow
PixelsPerInch = 96
TextHeight = 13

View File

@ -29,7 +29,6 @@ type
MemoExample: TSynMemo;
timerSearch: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure memosKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure ButtonOnlinehelpClick(Sender: TObject);
@ -108,7 +107,14 @@ end;
procedure TfrmSQLhelp.FormClose(Sender: TObject; var Action: TCloseAction);
begin
AppSettings.WriteInt(asSQLHelpWindowLeft, Left );
AppSettings.WriteInt(asSQLHelpWindowTop, Top );
AppSettings.WriteInt(asSQLHelpWindowWidth, Width);
AppSettings.WriteInt(asSQLHelpWindowHeight, Height);
AppSettings.WriteInt(asSQLHelpPnlLeftWidth, pnlLeft.Width);
AppSettings.WriteInt(asSQLHelpPnlRightTopHeight, memoDescription.Height);
Action := caFree;
SqlHelpDialog := nil;
end;
@ -264,18 +270,6 @@ begin
end;
procedure TfrmSQLhelp.FormDestroy(Sender: TObject);
begin
AppSettings.WriteInt(asSQLHelpWindowLeft, Left );
AppSettings.WriteInt(asSQLHelpWindowTop, Top );
AppSettings.WriteInt(asSQLHelpWindowWidth, Width);
AppSettings.WriteInt(asSQLHelpWindowHeight, Height);
AppSettings.WriteInt(asSQLHelpPnlLeftWidth, pnlLeft.Width);
AppSettings.WriteInt(asSQLHelpPnlRightTopHeight, memoDescription.Height);
SqlHelpDialog := nil;
end;
procedure TfrmSQLhelp.FormShow(Sender: TObject);
begin
// Apply themed colors in OnShow, not OnCreate, as a check with <> nil returns false otherwise

View File

@ -14,7 +14,6 @@ object frmSyncDB: TfrmSyncDB
Font.Style = []
OldCreateOrder = False
Position = poMainFormCenter
OnClose = FormClose
OnCreate = FormCreate
DesignSize = (
534

View File

@ -27,7 +27,6 @@ type
treeDifferences: TVirtualStringTree;
lblDifferences: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure treeSourceChange(Sender: TBaseVirtualTree; Node: PVirtualNode);
procedure treeSourceChecked(Sender: TBaseVirtualTree; Node: PVirtualNode);
procedure treeSourceChecking(Sender: TBaseVirtualTree; Node: PVirtualNode; var NewState: TCheckState; var Allowed: Boolean);
@ -95,12 +94,6 @@ end;
{ TfrmSyncDB }
procedure TfrmSyncDB.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
procedure TfrmSyncDB.FormCreate(Sender: TObject);
var
SessNode: PVirtualNode;

View File

@ -15,7 +15,6 @@ object frmTableTools: TfrmTableTools
Position = poMainFormCenter
OnClose = FormClose
OnCreate = FormCreate
OnDestroy = FormDestroy
OnShow = FormShow
DesignSize = (
764
@ -334,8 +333,6 @@ object frmTableTools: TfrmTableTools
ScrollBars = ssVertical
TabOrder = 0
OnChange = ValidateControls
ExplicitLeft = -8
ExplicitTop = -20
end
end
object tabSQL: TTabSheet

View File

@ -88,7 +88,6 @@ type
tabSQL: TTabSheet;
memoFindText: TMemo;
SynMemoFindText: TSynMemo;
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure btnHelpMaintenanceClick(Sender: TObject);
@ -309,15 +308,6 @@ begin
end;
procedure TfrmTableTools.FormDestroy(Sender: TObject);
begin
// Save GUI setup
AppSettings.WriteInt(asTableToolsWindowWidth, Width);
AppSettings.WriteInt(asTableToolsWindowHeight, Height);
AppSettings.WriteInt(asTableToolsTreeWidth, TreeObjects.Width);
end;
procedure TfrmTableTools.FormShow(Sender: TObject);
var
Node, FirstChecked: PVirtualNode;
@ -392,7 +382,10 @@ begin
// Auto close temorary connection
if Assigned(FTargetConnection) then
FreeAndNil(FTargetConnection);
Action := caFree;
// Save GUI setup
AppSettings.WriteInt(asTableToolsWindowWidth, Width);
AppSettings.WriteInt(asTableToolsWindowHeight, Height);
AppSettings.WriteInt(asTableToolsTreeWidth, TreeObjects.Width);
end;

View File

@ -16,7 +16,6 @@ object frmUpdateCheck: TfrmUpdateCheck
Position = poOwnerFormCenter
OnClose = FormClose
OnCreate = FormCreate
OnDestroy = FormDestroy
OnShow = FormShow
DesignSize = (
374

View File

@ -27,7 +27,6 @@ type
LinkType: TSysLinkType);
procedure FormShow(Sender: TObject);
procedure btnChangelogClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure CopydownloadURL1Click(Sender: TObject);
const
@ -70,17 +69,12 @@ begin
Height := AppSettings.ReadInt(asUpdateCheckWindowHeight);
end;
procedure TfrmUpdateCheck.FormDestroy(Sender: TObject);
procedure TfrmUpdateCheck.FormClose(Sender: TObject; var Action: TCloseAction);
begin
AppSettings.WriteInt(asUpdateCheckWindowWidth, Width);
AppSettings.WriteInt(asUpdateCheckWindowHeight, Height);
end;
procedure TfrmUpdateCheck.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
{**
Update status text
}

View File

@ -18,7 +18,6 @@ object UserManagerForm: TUserManagerForm
OnClose = FormClose
OnCloseQuery = FormCloseQuery
OnCreate = FormCreate
OnDestroy = FormDestroy
OnResize = FormResize
OnShow = FormShow
DesignSize = (

View File

@ -108,7 +108,6 @@ type
comboSSL: TComboBox;
lblSSL: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure btnAddUserClick(Sender: TObject);
procedure btnDeleteUserClick(Sender: TObject);
@ -224,16 +223,6 @@ begin
end;
procedure TUserManagerForm.FormDestroy(Sender: TObject);
begin
// FormDestroy: Save GUI setup
AppSettings.WriteInt(asUsermanagerWindowWidth, Width);
AppSettings.WriteInt(asUsermanagerWindowHeight, Height);
AppSettings.WriteInt(asUsermanagerListWidth, pnlLeft.Width);
Mainform.SaveListSetup(listUsers);
end;
procedure TUserManagerForm.FormResize(Sender: TObject);
begin
// Manually right align "Add object" button
@ -413,7 +402,11 @@ begin
FreeAndNil(FPrivsTable);
FreeAndNil(FPrivsRoutine);
FreeAndNil(FPrivsColumn);
Action := caFree;
// Save GUI setup
AppSettings.WriteInt(asUsermanagerWindowWidth, Width);
AppSettings.WriteInt(asUsermanagerWindowHeight, Height);
AppSettings.WriteInt(asUsermanagerListWidth, pnlLeft.Width);
Mainform.SaveListSetup(listUsers);
end;