“名为dlgPrinterSettings的组件已经存在。”

时间:2010-11-24 09:28:54

标签: delphi

我偶尔会遇到以下错误“名为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”吗?

2 个答案:

答案 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;

我不确定,但也许是!!

祝你好运......