2010-11-24 6 views
0

Hin und wieder bekomme ich manchmal den folgenden Fehler "Eine Komponente namens dlgPrinterSettings ist bereits vorhanden." necesarry das „dlgprintersettings“ jedes Mal nicht, aber immer noch, würde Ich mag wissen, was in dem folgenden Code die Ursache dieses Fehlers sein könnte:"Eine Komponente namens dlgPrinterSettings ist bereits vorhanden."

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; 

sollte ich „Null“ anstelle von „Selbst“ verwende in das schaffen?

+2

Hat gesetzt TdlgPrinterSettings seinen Namen zu 'dlgPrinterSettings' in seiner contructor? –

+0

macht 'Create (nil)' anstelle von 'Create (Self)' einen Unterschied? – mjn

+0

Ich lese über die Null die Minute, bevor ich diese Frage posten, so werde ich versuchen, diese – Plastkort

Antwort

2

Nur eine Beobachtung,

, wenn eine der SetUserData Methoden eine Ausnahme auslöst, wird nicht Ihre TdlgPrinterSettings Instanz frei bekommen. Das nächste Mal, wenn Sie actPrinterExecute anrufen, erhalten Sie den Fehler, den Sie erwähnen.


ps. Verwenden Sie nicht with. Deklarieren Sie eine lokale Variable und verwenden Sie diese. Sie können auf mit & Delphi suchen, um einige hitzige Debatten über seine Verwendung zu finden. Ich bin selbst nicht schuldfrei, aber ich würde es nicht in dieser Fall verwenden.

+0

vielleicht sollte ich graben in die setuserdata, aber schließlich in den Versuch schließlich es immer die Form befreit sogar tho dort wurde eine Ausnahme innerhalb .. – Plastkort

+0

gefeuert meist verwende ich nur, wenn ich 100% sicher bin wird nicht mit anderen Objekten kollidieren oder verwechseln. Meistens mache ich es aus Gründen der Lesbarkeit, da imo große Teile des Codes mit d. H. Label1.caption: = 'blbalba'; label1.left: = 100; label1.top: = 100; etc etc, aber Sie wissen, was ich meine :) – Plastkort

+0

Wenn Sie dies noch nicht getan haben, empfehle ich madExcept oder Eurekalog und versuchen, von dort aus arbeiten. –

-1

Ich nehme an, dass:

Dort ist eine Komponente auf dem Formular „dlgPrinterSettings“ genannt ist, es `s Klassenname wird„TdlgPrinterSettings“sein Wenn Sie durch diese Linie eine Komponente erstellen:

mit TdlgPrinterSettings.Create (self) do

Eine Komponente erstellt, dass abgeleitet von "TdlgPrinterSettings", und es ist Name gleich Ihre Standardkomponente, die Sie auf das Formular setzen, So erhalten Sie einen Fehler!

Warum möchten Sie es erstellen?

Wenn "TdlgPrinterSettings" ist ein "TPrinterSetupDialog" Sie tun, wie folgt:

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 nicht sicher, aber vielleicht ist es !!

Good Luck ...

+1

-1 Wenn eine Komponente zur Laufzeit erstellt wird, ist ihr Name leer. Es wird also keinen Namenskonflikt geben. Ich denke, Ulrich Gerhardt ist auf dem richtigen Weg. –

Verwandte Themen