2010-11-24 4 views
0

毎度、次のエラーが表示されることがあります。「dlgPrinterSettingsという名前のコンポーネントが既に存在します。」 「dlgprintersettings」毎回necesarry、それでも、私は以下のコードでは、このエラーの原因が何であるか知っていると思いません:"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; 

は私がに「ゼロ」ではなく「自己」を使用する必要があります作成する?

+2

はTdlgPrinterSettingsは、そのコンストラクタで 'dlgPrinterSettings' にその名を設定していますか? –

+0

'Create(Self)'の代わりに 'Create(nil)'を実行すると違いがありますか? – mjn

+0

私はこの質問を投稿する前に何も分からなかったので、この1つを試してみよう。 – Plastkort

答えて

2

ただ、観察、

SetUserData方法の1つが例外をスローした場合、あなたのTdlgPrinterSettingsインスタンスが解放されません。次回にactPrinterExecuteに電話すると、あなたが言及しているエラーが発生します。


ps。 withは使用しないでください。ローカル変数を宣言し、それを使用します。 を& Delphiで検索すると、その使用に関する熱い議論が見つかります。私はここで自分で罪がないわけではありませんが、私はでこれを使用しません。ケース。

+0

おそらく私はsetuserdataを掘る必要がありますが、最終的に試して最終的にはそれもフォーム内の例外を解雇されています。 – Plastkort

+0

私は100%他のオブジェクトと競合したり混同したりすることはありません。私はほとんどの場合、読みやすくするために、label1.caption:= 'blbalba'というコードを大量に使用しています。 label1.left:= 100; label1.top:= 100;私が何を意味するのか知っているでしょう:) – Plastkort

+0

もしあなたがまだそれをしていないのであれば、madExceptかEurekalogを使ってそこから作業することをお勧めします。 –

-1

私があるとします。あなたはこの行部品を作成する場合、クラス名は「TdlgPrinterSettings」 だろう、それは `s、「dlgPrinterSettings」という名前のフォーム上のコンポーネントが

あり:

で012d9gfrintersettings.create(self)do

コンポーネントは、 "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; 

I`mわからないが、多分それはです!

幸運が...

+1

-1実行時にコンポーネントを作成するとき、Nameは空です。したがって、名前の衝突はありません。私はUlrich Gerhardtが正しい道にあると思う。 –

関連する問題