Fix bug #1841478 "Access violation when add indexes" by keeping the instance of TFieldEditForm in memory after using it instead of recreating it each time the window is shown. The AV seems to be caused by FreeAndNil(f) but that's not reproducable when you start the exe within Delphi. However, the AV is gone now.

Related changes:
+ Use modal result values on buttons instead of explicitely setting them via code
+ Move some safe code out of a try .. except because only THandledSQLError's are catched.
This commit is contained in:
Ansgar Becker
2008-01-17 23:26:19 +00:00
parent 0c10b77794
commit c51ea356a1
2 changed files with 73 additions and 84 deletions

View File

@@ -394,8 +394,8 @@ object FieldEditForm: TFieldEditForm
Height = 25
Cancel = True
Caption = 'Cancel'
ModalResult = 2
TabOrder = 2
OnClick = ButtonCancelClick
end
object ButtonOK: TButton
Left = 111
@@ -404,6 +404,7 @@ object FieldEditForm: TFieldEditForm
Height = 25
Caption = 'OK'
Default = True
ModalResult = 1
TabOrder = 1
OnClick = OKClick
end

View File

@@ -59,7 +59,6 @@ type
procedure FormShow(Sender: TObject);
procedure ComboBoxTypeChange(Sender: TObject);
procedure AddUpdateField(Sender: TObject);
procedure ButtonCancelClick(Sender: TObject);
procedure pcChange(Sender: TObject);
procedure OKClick(Sender: TObject);
procedure UpdateKeys(Sender: TObject);
@@ -101,6 +100,7 @@ uses
var
klist : Array of TMysqlIndex;
FieldEditForm : TFieldEditForm;
{$R *.DFM}
@@ -110,19 +110,17 @@ var
Create form
}
function FieldEditorWindow (AOwner : TComponent; AMode : TFieldEditorMode; AFieldName : String = '') : Boolean;
var
f : TFieldEditForm;
begin
f := TFieldEditForm.Create(AOwner);
f.FMode := AMode;
if FieldEditForm = nil then
FieldEditForm := TFieldEditForm.Create(AOwner);
FieldEditForm.FMode := AMode;
// Also remember original mode for restoring when switching pagecontrol tabs
f.FModeWhenCalled := AMode;
f.FFieldName := AFieldName;
FieldEditForm.FModeWhenCalled := AMode;
FieldEditForm.FFieldName := AFieldName;
// Init both editors
f.InitFieldEditor (nil);
f.InitIndexEditor (nil);
Result := (f.ShowModal = mrOK);
FreeAndNil (f);
FieldEditForm.InitFieldEditor (nil);
FieldEditForm.InitIndexEditor (nil);
Result := (FieldEditForm.ShowModal = mrOK);
end;
@@ -387,67 +385,67 @@ begin
end;
Screen.Cursor := crSQLWait;
strAttributes := ''; // none of the 3 attributes binary, unsigned, zerofill
strNull := '';
strDefault := '';
strAutoIncrement := '';
if CheckBoxBinary.Checked = true then
strAttributes := strAttributes + ' BINARY';
if CheckBoxUnsigned.Checked = true then
strAttributes := strAttributes + ' UNSIGNED';
if CheckBoxZerofill.Checked = true then
strAttributes := strAttributes + ' ZEROFILL';
if (length(EditDefault.Text) > 0) and EditDefault.Enabled then
begin
strDefault := ' DEFAULT ';
// Don't escape certain default values
if (UpperCase(EditDefault.Text) = 'CURRENT_TIMESTAMP')
or (UpperCase(EditDefault.Text) = 'NULL') then
strDefault := strDefault + EditDefault.Text
else
strDefault := strDefault + esc(EditDefault.Text)
end;
if CheckBoxNotNull.Enabled then
begin
if CheckBoxNotNull.Checked then
strNull := ' NOT';
strNull := strNull + ' NULL';
end;
if CheckBoxAutoIncrement.Checked = True then
strAutoIncrement := ' AUTO_INCREMENT';
if (EditLength.text <> '') and EditLength.Enabled then
strLengthSet := '(' + EditLength.text + ') '
else
strLengthSet := '';
if EditComment.Enabled and (length(EditComment.Text) > 0) then
strComment := ' COMMENT ' + esc(EditComment.Text);
strPosition := '';
case ComboBoxPosition.ItemIndex of
0 : ;
1 : strPosition := ' FIRST';
else
strPosition := ' ' + ComboBoxPosition.Text;
end;
fielddef :=
ComboBoxType.Text + // Type
strLengthSet + // Length/Set
strAttributes + // Attribute
strDefault + // Default
strNull + // [NOT] Null
strAutoIncrement + // Auto_increment
strComment; // Comment
try
strAttributes := ''; // none of the 3 attributes binary, unsigned, zerofill
strNull := '';
strDefault := '';
strAutoIncrement := '';
if CheckBoxBinary.Checked = true then
strAttributes := strAttributes + ' BINARY';
if CheckBoxUnsigned.Checked = true then
strAttributes := strAttributes + ' UNSIGNED';
if CheckBoxZerofill.Checked = true then
strAttributes := strAttributes + ' ZEROFILL';
if (length(EditDefault.Text) > 0) and EditDefault.Enabled then
begin
strDefault := ' DEFAULT ';
// Don't escape certain default values
if (UpperCase(EditDefault.Text) = 'CURRENT_TIMESTAMP')
or (UpperCase(EditDefault.Text) = 'NULL') then
strDefault := strDefault + EditDefault.Text
else
strDefault := strDefault + esc(EditDefault.Text)
end;
if CheckBoxNotNull.Enabled then
begin
if CheckBoxNotNull.Checked then
strNull := ' NOT';
strNull := strNull + ' NULL';
end;
if CheckBoxAutoIncrement.Checked = True then
strAutoIncrement := ' AUTO_INCREMENT';
if (EditLength.text <> '') and EditLength.Enabled then
strLengthSet := '(' + EditLength.text + ') '
else
strLengthSet := '';
if EditComment.Enabled and (length(EditComment.Text) > 0) then
strComment := ' COMMENT ' + esc(EditComment.Text);
strPosition := '';
case ComboBoxPosition.ItemIndex of
0 : ;
1 : strPosition := ' FIRST';
else
strPosition := ' ' + ComboBoxPosition.Text;
end;
fielddef :=
ComboBoxType.Text + // Type
strLengthSet + // Length/Set
strAttributes + // Attribute
strDefault + // Default
strNull + // [NOT] Null
strAutoIncrement + // Auto_increment
strComment; // Comment
if (FMode = femFieldAdd) then begin
cwin.ExecUpdateQuery(
'ALTER TABLE ' + mainform.mask(cwin.SelectedTable) + ' ' + // table
@@ -495,7 +493,6 @@ begin
end;
end;
cwin.ShowTableProperties(cwin.SelectedTable);
ModalResult := mrOK;
except
on E: THandledSQLError do
begin
@@ -508,16 +505,6 @@ end;
{***
Cancel Form
}
procedure TFieldEditForm.ButtonCancelClick(Sender: TObject);
begin
ModalResult := mrCancel;
end;
{***
User selected another tab in the main-pagecontrol
}
@@ -860,7 +847,6 @@ begin
Mainform.ChildWin.ExecUpdateQuery(query);
// Refresh listColumns to display correct field-icons
Mainform.ChildWin.MenuRefreshClick(Self);
ModalResult := mrOK;
except
On E : Exception do
begin
@@ -870,6 +856,8 @@ begin
klist[i].Ready := False;
for i := 0 to Length(modifiedKeys) - 1 do
klist[modifiedKeys[i]].Modified := True;
// Keep form open
ModalResult := mrNone;
end;
end;
end;