marcoborn
Goto Top

Aufrufe von Klassen untereinander

Hallo Forum,
in meinem Projekt habe ich folgendes Konstrukt:

Eine Klasse "Import" besitzt eine Funktion "StatusfensterNeu", die ein Formular aus einer Klasse "Statusfenster" anzeigt. Jetzt habe ich eine neue Klasse "Vergleich" angelegt, die ebenfalls das Formular anlegt. Der Code dazu sieht verkürzt wie folgt aus:


Public Class Import
Dim mbo_StatusFenster As StatusFenster
Dim m_Status as String
...

Public Sub WordImport()
mbo_StatusFenster = New StatusFenster
m_status = MboStatusfensterNeu("Alte Daten löschen", "1/15: ", 100)
...
End Sub

Public Function MboStatusfensterNeu(q As String, switch As String, fortschritt As Double) As String
...
If mbo_StatusFenster.Visible = False Then mbo_StatusFenster.Show
...
End Sub

End Class


Jetzt habe ich eine neue Klasse "Vergleich", die ebenfalls dieses Statusfenster anzeigen soll. Mein Code sieht wie folgt aus:

Public Partial Class Vergleich
Dim mbo_StatusFenster As StatusFenster
Dim m_Status as String
Dim mbo_Import As New Import
...

Sub Tabellen_vergleichen
mbo_StatusFenster = New StatusFenster
m_status = mbo_Import.MboStatusfensterNeu("Alte Daten löschen", "1/15: ", 100)
...
End Sub

End Class


Ich bekomme jedoch immer eine Fehlermeldung, dass der Verweis nicht auf eine Objektinstanz gelegt wurde. Die Funktion MboStatusfensterNeu wird jedoch aufgerufen, da ich dort noch eine temporäre MsgBox anzeigen lassen kann. Will ich jedoch das Formular anzeigen, bricht das Makro ab. Irgendwie wird die Klasse StatusFenster nicht korrekt erkannt. Wie muss ich meinen Code umstellen, damit das Ganze funktioniert?

Vielen Dank,
M. Born

Content-ID: 239921

Url: https://administrator.de/forum/aufrufe-von-klassen-untereinander-239921.html

Ausgedruckt am: 22.12.2024 um 13:12 Uhr

MarcoBorn
MarcoBorn 04.06.2014 um 14:58:04 Uhr
Goto Top
Gibt es hier keinen, der mir einen Tipp geben kann, wie ich den Code umbauen muss, damit es läuft?
colinardo
Lösung colinardo 04.06.2014 aktualisiert um 15:29:19 Uhr
Goto Top
Moin Marco,
Zitat von @MarcoBorn:
Gibt es hier keinen, der mir einen Tipp geben kann, wie ich den Code umbauen muss, damit es läuft?
Gibt es schon, wenn du deinen Beitrag entsprechend überarbeitest das ihn jemand verstehen kann, die Klassen sind nicht alle ersichtlich (z.B. fehlt die Definition der Klasse StatusFenster, etc). Hier fehlt dem helfenden absolut der Zusammenhang und wichtige Bestandteile deiner Klassen und das was du vorhast !

Und bitte benutze Code-Tags zum Posten deiner Codes.

Merci.

Grüße Uwe
MarcoBorn
MarcoBorn 04.06.2014 um 15:29:13 Uhr
Goto Top
Hallo Uwe,
das mit den Code-Tags war mir nicht bekannt. Die Einrückungen hatte ich manuell gemacht. Daher baue ich sie jetzt noch mal mit den Tags neu. Erstmal der Code der ersten Klasse:

Public Class Import
  Dim mbo_StatusFenster As StatusFenster
  Dim m_Status as String
  ...

  Public Sub WordImport()
    mbo_StatusFenster = New StatusFenster
    m_status = MboStatusfensterNeu("Alte Daten löschen", "1/15: ", 100)  
    ...
  End Sub

  Public Function MboStatusfensterNeu(q As String, switch As String, fortschritt As Double) As String
    ...
    If mbo_StatusFenster.Visible = False Then mbo_StatusFenster.Show
    ...
  End Sub
End Class 

Die Sub WordImport ruft die Funktion MBoStatusfensterNeu auf, die wiederum ein Formular startet, das sich in der Klasse StatusFenster befindet. Die Klasse mit dem Status-Fenster ist ein Standard-Formular.
Public Partial Class StatusFenster
  Public Sub New()
    Me.InitializeComponent()
  End Sub
  ...
End Class

Jetzt möchte ich in einer neuen Klasse (Code folgt im Anschluss) ebenfalls die Funktion MBoStatusfensterNeu aus der oben genannten Klasse Import aufrufen und somit das Formular starten.

Public Partial Class Vergleich
  Dim mbo_StatusFenster As StatusFenster
  Dim m_Status as String
  Dim mbo_Import As New Import
  ...

  Sub Tabellen_vergleichen
    mbo_StatusFenster = New StatusFenster
    m_status = mbo_Import.MboStatusfensterNeu("Alte Daten löschen", "1/15: ", 100)  
    ...
  End Sub
End Class

Dabe erhalte ich jedoch die Fehlermeldung, dass der Verweis nicht auf eine Objektinstanz gelegt wurde. Irgendwie wird die Klasse StatusFenster nicht korrekt erkannt, obwohl der Code ja identisch zur ersten Klasse ist. Was mache ich falsch?


Vielen Dank,
M. Born
colinardo
colinardo 04.06.2014 um 15:35:22 Uhr
Goto Top
setze mal einen Breakpoint und checke an welcher Stelle der Debugger stehen bleibt.
MarcoBorn
MarcoBorn 04.06.2014 um 15:46:22 Uhr
Goto Top
Das Problem tritt auf, wenn im StatusFenster die übergebenen Parameter zugewiesen werden sollen. Hier erhalte ich folgende Fehlermeldung:
Der Objektverweis wurde nicht auch eine Objektinstanz festgelegt. 
bei FKGenDNA.Importer.MboStatusfensterNeu(String q, String switch, Double fortschritt).

Der Fehler tritt in der Klasse Import in folgender Zeile auf:
mbo_StatusFenster.label1.Text = "Schritt " & switch & q  

Wenn ich in der Zeile davor mir per MsgBox die Werte von switsch und q ausgeben lasse, dann geht das ohne Probleme und sie enthalten auch Strings. Ich übergebe sie ja auch in genau denselben Format wie wenn ich die Funktion aus der Klasse Import heraus aufrufe. Kann es sein, dass der Aufruf des Formulars anders erfolgen muss? Ist ggf. die Initialisierung der Formular-Klasse aus der Klasse Vergleich heraus unterschiedlich?
colinardo
Lösung colinardo 04.06.2014 aktualisiert um 16:08:22 Uhr
Goto Top
Alles klar, du erzeugst das Fenster-Objekt nur in der Prozedur WordImport() die du natürlich vor oder im Aufruf von MboStatusfensterNeu() aufrufen musst damit der Dialog überhaupt erzeugt wird, denn ansonsten ist mbo_StatusFenster leer, und somit trifft die Fehlermeldung den Nagel auf den Kopf !

Alternativ musst du das Fenster schon beim initialisieren der Klasse Import erzeugen damit es in allen Prozeduren in der Klasse zur Verfügung steht.
MarcoBorn
MarcoBorn 04.06.2014 um 16:08:11 Uhr
Goto Top
Das war es, wonach ich gesucht habe. Ich habe den Code wie folgt geändert und jetzt läuft es:
Public Partial Class Vergleich 
  Dim mbo_StatusFenster As New StatusFenster
 ...

Manchmal braucht man einfach nur einen kleinen Hinweis und es geht. Vielen Dank für Deine Hilfe...