Delphi &引用;名为dlgPrinterSettings的组件已存在。”;

Delphi &引用;名为dlgPrinterSettings的组件已存在。”;,delphi,Delphi,有时我会收到以下错误“名为dlgPrinterSettings的组件已存在”。不必每次都检查“dlgPrinterSettings”,但我仍然想知道以下代码中此错误的原因: procedure TfrmApplicationMain.actPrinterExecute(Sender: TObject); begin with TdlgPrinterSettings.Create(self) do try ChkEncodeMag.IsChecked := GetUserDataB

有时我会收到以下错误“名为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;
我应该在create中使用“nil”而不是“self”吗?

只是一个观察

如果其中一个
SetUserData
方法引发异常,则不会释放TdlgPrinterSettings实例。下次调用
actPrinterExecute
时,将显示您提到的错误


注意:不要将
一起使用。声明一个局部变量并使用它。您可以使用&Delphi搜索,以查找有关其使用的一些激烈争论。我自己在这里并没有负罪感,但我不会在这种情况下使用它。

我想:

表单上有一个名为“dlgPrinterSettings”的组件,其类名为“TdlgPrinterSettings” 通过此行创建零部件时:

使用TdlgPrinterSettings。创建(自我)do

一个组件将创建一个派生自“TdlgPrinterSettings”的组件,它的名称等于您在表单上放置的默认组件,因此您将得到一个错误

为什么要创建它

如果“TdlgPrinterSettings”是一个“TPR对话框”,您可以这样做:

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;
我不确定,但也许是


祝你好运……

TdlgPrinterSettings在其构造函数中是否将其名称设置为“DLGPPrinterSettings”?是否
创建(nil)
而不是
创建(Self)
起作用?我在发布此问题前一分钟读到了关于nil的内容,因此我将尝试一下one@ulrich,这里面没有名字冲突,TDLGprintersetting的.name属性为空。当我以这种方式创建对话框时,我自己从未收到错误。。但是这是一个最终用户得到的,当最终用户经常有自己的方式点击东西时,有时很难重新创建步骤,并且使用gui的方式与ex.programmers testing不同:)-1在运行时创建组件时,其名称为空。所以不会有名字冲突。我认为Ulrich Gerhardt的思路是正确的。也许我应该深入研究setuserdata,但最终在try-finally中,它会释放表单,即使其中触发了异常。如果我100%确定它不会与其他对象冲突或混淆,我通常只使用with。我这样做主要是为了可读性,因为我用label1.caption:='blbalba';标签1.左:=100;标签1.顶部:=100;等等,但你知道我的意思:)如果你还没有这样做,我建议使用madExcept或Eurekalog,并尝试从那里开始工作。没有回答这个问题。请在评论中吹毛求疵,而不是回答。你指的是什么吹毛求疵?使用with?我不想争论你的说法,那不是一个答案,我知道你知道你的东西,但是你可以解释为什么这个观察是错误的,因为我一点也不知道。