Wenn wir ein VB-Projekt laden, ruft es das Ereignis Initialize
eines Benutzersteuerelements auf (falls im Projekt vorhanden). Mein Problem ist, dass ich einen Code in UserControl_Initialize
habe, der versuchen wird, Instanzen anderer COM-Objekte zu erstellen. Auf meinem Computer sind diese Steuerelemente nicht registriert. Eine Möglichkeit ist, den Code auf eine andere Methode als Initialize
zu verschieben, aber ich möchte wissen, ob es eine bessere Lösung gibt? Irgendwo habe ich gefunden, dass wir überprüfen können, ob die aufrufende Anwendung VB-Editor ist und dann den Initialisierungscode überspringt ...VB6.0: Initialisierungsmethode eines Benutzersteuerelements, das beim Laden eines VB-Projekts aufgerufen wird
Antwort
Dies geschieht nur, wenn Ihr Projekt mit dem geöffneten Formular-Designer gespeichert wurde: dies bedeutet, dass beim Start der Formular wird angezeigt (vielleicht im Hintergrund) und folglich müssen alle Steuerelemente darauf initialisiert werden. Daher wird Ihr Benutzersteuerungsinitialisierer aufgerufen, wenn dieses Steuerelement auf dem Formular verwendet wird.
Um dies zu verhindern, speichern Sie das Projekt einfach mit geschlossenem Formulardesigner.
Yup Sie haben Recht. Aber mein Problem ist, dass ich nicht sicherstellen kann, dass jeder meiner Entwickler prüft die Projektdatei mit dem Designer geschlossen :( – Paragon
Der offene Zustand des Formulars ist in der .vbw-Datei in Ihrem Arbeitsordner gespeichert. Stellen Sie sicher, dass dies nicht ist In der Quellcodeverwaltung, und machen Sie es leer und Readonly, um alles zu erzwingen, geschlossen, wenn Sie das Projekt laden. – Deanna
@KonradRudolph Es ruft auch '_Initialize' beim Kompilieren des Projekts. – Deanna
können Sie verwenden:
If Not Me.DesignMode Then
...
End If
Eine andere Lösung, die wir verwenden, um eine kleine Funktion war die weltweit verwendet werden kann:
Public Function IsRuntime() as Boolean
On Error Goto NotRuntime
Debug.Print(1/0)
IsRuntime = True
Exit Function
NotRuntime:
IsRuntime = False
End If
Weiß nicht, ob es syntaktisch gut ausgebildet, aber die Idee sollte klar sein: Nur in der IDE wird die Debug-Anweisung aufgerufen.
Danke H-Man2 :). Die zweite Lösung ist großartig. Wie für die erste Lösung Me.DesignMode ist keine Option in VB6, vielleicht wurde es in VB.NET eingeführt – Paragon
Die erste Lösung sollte If Not Ambient.UserMode für VB6 sein. Zum Beispiel http://msdn.microsoft.com/en-us/library/aa241637(VS.60).aspx – MarkJ
Beachten Sie, dass die beiden Lösungen etwas anderes Verhalten haben. Die erste Lösung schaltet den Code immer aus, wenn sich das Steuerelement im Entwurfsmodus befindet (macht nur einen Unterschied, wenn Sie Ihr Steuerelement in einem OCX erstellen). Die zweite Lösung schaltet den Code immer aus, wenn er von der IDE ausgeführt wird, entweder im Entwurfsmodus * oder im Ausführungsmodus *. Möglicherweise wird das Steuerelement beim Ausführen von der IDE zum Testen des Laufzeitverhaltens ordnungsgemäß beendet. – MarkJ
Haben Sie eine Code-Lösung gefunden? Es ruft auch Initialize während der Kompilierung auf, wodurch alle Arten von unerwünschtem Code ausgeführt werden. – Deanna