我偶尔会遇到以下错误“名为dlgPrinterSettings的组件已经存在。”不是每次都需要“dlgprintersettings”,但我仍然想知道下面一段代码中可能导致此错误的原因:
procedure TfrmApplicationMain.actPrinterExecute(Sender: TObject);
begin
with TdlgPrinterSettings.Create(self) do
try
ChkEncodeMag.IsChecked := GetUserDataBoolean('MAGNETIC_ENCODING');
ChkEncodeFromDatabase.IsChecked := GetUserDataBoolean('MAGNETIC_DATABASE');
ShowModal;
finally
SetUserData('MAGNETIC_ENCODING',BoolToStr(ChkEncodeMag.IsChecked));
SetUserData('MAGNETIC_DATABASE',BoolToStr(ChkEncodeFromDatabase.IsChecked));
free;
end;
end;
我应该在创作中使用“nil”而不是“self”吗?
答案 0 :(得分:2)
只是一个观察,
如果其中一个SetUserData
方法抛出异常,则不会释放TdlgPrinterSettings实例。下次您致电actPrinterExecute
时,会提到您提及的错误。
PS。不要使用with
。声明一个局部变量并使用它。您可以使用&搜索德尔福找到一些关于它的使用的激烈争论。我自己在这里没有内疚感,但我不会在这个案例中使用它。
答案 1 :(得分:-1)
我想:
您的表单上有一个名为“dlgPrinterSettings”的组件,它的类名称将为“TdlgPrinterSettings” 当您通过以下行创建组件时:
使用TdlgPrinterSettings.Create(self)执行
组件将创建派生自“TdlgPrinterSettings”的组件,并且它的名称等于您放在表单上的默认组件,因此您将收到错误!
为什么要创建它?
如果“TdlgPrinterSettings”是“TPrinterSetupDialog”,你会喜欢这样:
procedure TfrmApplicationMain.actPrinterExecute(Sender: TObject);
begin
with TPrinterSetupDialog.Create(self) do
try
ChkEncodeMag.IsChecked := GetUserDataBoolean('MAGNETIC_ENCODING');
ChkEncodeFromDatabase.IsChecked := GetUserDataBoolean('MAGNETIC_DATABASE');
ShowModal;
finally
SetUserData('MAGNETIC_ENCODING',BoolToStr(ChkEncodeMag.IsChecked));
SetUserData('MAGNETIC_DATABASE',BoolToStr(ChkEncodeFromDatabase.IsChecked));
free;
end;
end;
我不确定,但也许是!!
祝你好运......