Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  Klasse verwenden ohne neue Instanz

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  Klasse verwenden ohne neue Instanz (2562 mal gelesen)
Theo37
Mitglied
Techniker


Sehen Sie sich das Profil von Theo37 an!   Senden Sie eine Private Message an Theo37  Schreiben Sie einen Gästebucheintrag für Theo37

Beiträge: 423
Registriert: 08.10.2008

erstellt am: 17. Sep. 2010 09:00    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo an Alle,

ich habe mal wieder ein Problemchen mit VB.
Ich schildere mal meine Vorgehensweise und was passiert und hoffe daß dann jemand einen Ausweg weiß.
Ich habe eine Klasse und eine Form erstellt.
In der Klasse ist die CommandMethod die ich in ACAD starte. In dieser wiederum starte ich die Form. Jetzt kommt das Problem. Damit ich in den Buttons der Form wieder Prozeduren der Klasse verwenden kann schreibe ich am Anfang der Form:
Dim MyKlasse As Klasse = New Klasse
Damit wird eine neue Instanz der Klasse erstellt und alle Variablen sind wieder auf Null. Gibt es eine Möglichkeit von der Form aus auf die alte Instanz der klasse zu zugreifen?

Danke, Theo

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP


Ex-Mitglied

erstellt am: 17. Sep. 2010 09:25    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

ich vermute einen Workflowfehler. Wenn Du von irgendwo auf eine bestimmte Instanz einer Klasse zugreifen willst, dann musst Du diese Instanz eben über Parametern in Funktionsaufrufen oder über Eigenschaften diese Instanz einfach übergeben.

Andere Variante, Du deklarierst in Deiner AutoCAD-Funktionsklasse die Funktionen/Sub/Properties als Shared, das setzt vorraus, dass Du nur EIN EINZIGES AutoCAD-Modul am Laufen ist.

  Ich hab jetzt wieder alles gelöscht, was ich geschrieben habe, da einzelne Codezeilen hier zu zeigen und immer dazuzuschreiben, das gehört hier und das gehört da und dann rufst Du dieses von da aus und initialisiert damit dort ....
Sorry, das ist zu krank und wird auch noch mächtig unverständlich.

Hast Du die Chance, Deinen Code (oder zumindest die wesentlichen Eigenschaften daraus, jedenfalls aber Name) hier herzustellen, denn hab ich mal Deine Namen (Klassendef, ev. ein paar wesentliche AutoCAD-Funktionen), dann kann ich zumindest ein wenig verständlicher formulieren.

Sorry, - alfred -

------------------
www.hollaus.at

Theo37
Mitglied
Techniker


Sehen Sie sich das Profil von Theo37 an!   Senden Sie eine Private Message an Theo37  Schreiben Sie einen Gästebucheintrag für Theo37

Beiträge: 423
Registriert: 08.10.2008

erstellt am: 17. Sep. 2010 10:55    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Alfred,

das ist der Anfang der Klasse:

'Contains the AutoCAD Type Library
Imports Autodesk.AutoCAD.Interop
'Contains the AutoCAD/ObjectDBX Type Library
Imports Autodesk.AutoCAD.Interop.Common

Public Class Schemakopf
    Public ReadOnly Property ThisDrawing() As  _
      AcadDocument
        Get
            Return Autodesk.AutoCAD. _
            ApplicationServices.Application. _
            DocumentManager.MdiActiveDocument. _
            AcadDocument
        End Get
    End Property
    Public Shared myForm As Schemenkopfwindow = Nothing
    Public Shared myFormDruck As Druckdatum = Nothing
    Public Structure SK
        Public Datum As String
        Public Bearbeiter As String
        Public Druckdatum As String
        Public projekt1 As String
        Public projekt2 As String
        Public Blatt As String
        Public Blätter As String
        Public Projektnummer As String
        Public planinhalt1 As String
        Public Planinhalt2 As String
        Public ISPNummer As String
        Public Datumsart As String
    End Structure

    Public Structure Schemensatz
        Public Name As String
        Public Anzahl As Integer
    End Structure
    Dim Namen() As Object
    ' Bis hier neu
    Dim AusDatei As SK
    Dim AusDwg As SK
    Dim InDwg As SK
    Dim InDatei As SK
    Dim Name As String
    Dim Datum As String
    Dim Blattdatei As String
    Dim Pronum As String
    Dim Flag As Boolean
    Dim Attrib As Object
    <Autodesk.AutoCAD.Runtime.CommandMethod("SL")> _
    Public Sub Schemenlayout()
        Dim PCdatum As Date
        myForm = New Schemenkopfwindow
        Flag = True
        Name = ThisDrawing.FullName
        On Error Resume Next
        Name = Left(Name, Len(Name) - 7) & "Kopf.hwd"
        If Err.Number <> 0 Then
            MsgBox("Die Datei muß erst an die richtige Stelle gespeichert werden!")
            GoTo Ende
        End If
        PCdatum = Today
        Datum = Format(PCdatum, "dd/MM/yy")
        Blattdatei = ThisDrawing.Name
        Blattdatei = Mid(Blattdatei, Len(Blattdatei) - 5, 2)
        Pronum = ThisDrawing.Path
        Pronum = Mid(Pronum, 11, 5) & Left(ThisDrawing.Name, 3)
        lesenausdateivorfensterchen()
        einlesenausdwg()
        If Flag = False Then GoTo Ende
        einlesendwgfensterchen()
        InDatei.Datumsart = "A"
        myForm.Show()
        ThisDrawing.Regen(Common.AcRegenType.acAllViewports)
Ende:
    End Sub
    Public Sub lesenausdateivorfensterchen()
        Dim f As System.IO.StreamReader
        Dim zeile As String
        If Dir(Name) <> "" Then
            f = My.Computer.FileSystem.OpenTextFileReader(Name)
            zeile = f.ReadLine
            zeile = f.ReadLine
            If zeile = "ISP" Then
                AusDatei.ISPNummer = f.ReadLine
                zeile = f.ReadLine
                zeile = f.ReadLine
            Else : AusDatei.ISPNummer = "Alt"
            End If
            AusDatei.Planinhalt2 = f.ReadLine
            zeile = f.ReadLine
            zeile = f.ReadLine
            AusDatei.planinhalt1 = f.ReadLine
            zeile = f.ReadLine
            zeile = f.ReadLine
            AusDatei.Projektnummer = f.ReadLine
            zeile = f.ReadLine
            zeile = f.ReadLine
            AusDatei.Blatt = f.ReadLine
            zeile = f.ReadLine
            zeile = f.ReadLine
            AusDatei.Blätter = f.ReadLine
            zeile = f.ReadLine
            zeile = f.ReadLine
            AusDatei.projekt2 = f.ReadLine
            zeile = f.ReadLine
            zeile = f.ReadLine
            AusDatei.projekt1 = f.ReadLine
            AusDatei.Datumsart = f.ReadLine
            zeile = f.ReadLine
            AusDatei.Druckdatum = f.ReadLine
            zeile = f.ReadLine
            zeile = f.ReadLine
            AusDatei.Bearbeiter = f.ReadLine
            zeile = f.ReadLine
            zeile = f.ReadLine
            AusDatei.Datum = f.ReadLine
            f.Close()

        End If
    End Sub

    Public Sub einlesenausdwg()
        Dim Kopf As AcadBlockReference
        Dim Entini As AcadEntity
        For Each Entini In ThisDrawing.ActiveLayout.Block
            If Entini.ObjectName = "AcDbBlockReference" Then
                Kopf = Entini
                If Kopf.Name = "A3" Then GoTo Kopfgefunden
            End If
        Next Entini
        MsgBox("Sorry kein A3-Block vorhanden")
        GoTo Ende
Kopfgefunden:
        Attrib = Kopf.GetAttributes
        With AusDwg
            .Datum = Attrib(0).textString
            .Bearbeiter = Attrib(1).textString
            .Druckdatum = Attrib(2).textString
            .projekt1 = Attrib(3).textString
            .projekt2 = Attrib(4).textString
            .planinhalt1 = Attrib(5).textString
            .Planinhalt2 = Attrib(6).textString
            .Blatt = Attrib(7).textString
            .Blätter = Attrib(8).textString
            .Projektnummer = Attrib(9).textString
            If UBound(Attrib) > 9 Then
                .ISPNummer = Attrib(10).textString
            Else : .ISPNummer = "Alt"
            End If
        End With
Ende:
    End Sub
    Public Sub einlesendwgfensterchen()
        With myForm
            If Dir(Name) = "" Then
                .BlätterButton.Enabled = False
                .Dateibutton.Enabled = False
            End If
            .Erstelldatumtext.Text = AusDwg.Datum
            .Bearbeitertext.Text = AusDwg.Bearbeiter
            .Druckdatumtext.Text = Datum
            .DruckdatumÄndertext.Text = "Aktuell"
            If AusDatei.Datumsart = "F" Then
                .Druckdatumtext.Text = AusDatei.Druckdatum
                .DruckdatumÄndertext.Text = "Aus Datei"
            End If
            If AusDatei.Datumsart = "A" Then
                .Druckdatumtext.Text = Datum
                .DruckdatumÄndertext.Text = "Aktuell"
            End If
            If AusDatei.Datumsart = "V" Then
                .Druckdatumtext.Text = AusDwg.Druckdatum
                .DruckdatumÄndertext.Text = "Unverändert"
            End If
            .Projekt1text.Text = AusDwg.projekt1
            .Projekt2Text.Text = AusDwg.projekt2
            .Blatttext.Text = AusDwg.Blatt
            .BlätterText.Text = AusDwg.Blätter
            .ProjektnummerText.Text = AusDwg.Projektnummer
            .Planinhalt1Text.Text = AusDwg.planinhalt1
            .Planinhalt2Text.Text = AusDwg.Planinhalt2
            If UBound(Attrib) > 9 Then
                .ISPNummerText.Text = AusDwg.ISPNummer
            Else : .ISPNummerButton.Enabled = False
                .ISPNummerText.BackColor = SystemColors.InactiveCaption
                .Label11.ForeColor = SystemColors.InactiveCaptionText
                .ISPNummerButton.Enabled = False
            End If

        End With
    End Sub

Und das ist der Anfang der Form:

Public Class Schemenkopfwindow

    Dim MySchemakopf As Schemakopf = New Schemakopf

    Private Sub Schriftkopfbutton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Schriftkopfbutton.Click
        MySchemakopf.einlesendwgfensterchen()
    End Sub

    Private Sub Dateibutton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Dateibutton.Click
        MySchemakopf.einlesendateifensterchen()
    End Sub

    Private Sub ErstelldatumButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ErstelldatumButton.Click
        MySchemakopf.erstellakt()
    End Sub

    Private Sub Bearbeiterbutton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Bearbeiterbutton.Click
        MySchemakopf.ich()
    End Sub

    Private Sub Druckdatumbutton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Druckdatumbutton.Click
        MySchemakopf.druä()
        MySchemakopf.druändern()
    End Sub

    Private Sub Projekt1Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Projekt1Button.Click
        Me.Projekt1text.Text = ""
        Me.Projekt1text.Focus()
    End Sub

Das ist Alles von VBA übernommen.
Schau's Dir mal an.
Danke, Theo

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP


Ex-Mitglied

erstellt am: 17. Sep. 2010 11:24    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

und wenn ich das jetzt an Deinem Beispiel interpretiere, dann

- startest Du den Befehl CL
-  in dieser Sub Schemenlayout startest bzw. aktivierst Du Deine Form
      (da ist schon mal ein Problem, denn startest Du den Befehl mehrmals, bekommst Du
        immer eine neue Form (und die alte wird nicht sauber eliminiert), hat aber jetzt
        nix damit zu tun)
-  in der Form-Instanz, die dann angezeigt wird startest Du eine neue AutoCAD-Funktionsinstanz (Typ Schemakopf)
        und da liegt der Fehler, die brauchst Du nicht neu starten, denn die läuft ja schon
        Du brauchst nur dem Formular beibringen, wo diese zu finden ist.


Damit folgende Änderungen:

die Zeile
Dim MySchemakopf As Schemakopf = New Schemakopf

löscht bwz. ersetzt Du durch
Friend MySchemakopf As Schemakopf = Nothing  'nur mal die Deklaration


Dann baust Du im Befehl CL nach  'myForm = New Schemenkopfwindow'  ein:
myForm.MySchemakopf = Me


Und fertig, das wäre Variante 1 gewesen.
===============================================================================================

Version 2 würde noch einfacher werden, wenn ich davon ausgehe, dass die Klasse 'Schemakopf' Deine grundlegende Basisklasse ist, die Du mit Befehl NETLOAD ins AutoCAD lädst. Denn da kannst Du alle Functions/Subs/Properties mit 'Shared' definieren (in VB6 hat das STATIC geheissen). Damit stehen diese Funktionen/Subs/Properties ohne Instanzierung der Klasse zur Verfügung.

Z.B. wenn Du diese Zeile änderst:
Public Sub einlesenausdwg()

gegen:
Public Shared Sub einlesenausdwg()


Dann kannst Du auch von Deinem Form dieses Sub aufrufen durch
Schemakopf.einlesenausdwg


HTH, - alfred -

------------------
www.hollaus.at

Theo37
Mitglied
Techniker


Sehen Sie sich das Profil von Theo37 an!   Senden Sie eine Private Message an Theo37  Schreiben Sie einen Gästebucheintrag für Theo37

Beiträge: 423
Registriert: 08.10.2008

erstellt am: 17. Sep. 2010 13:33    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Danke Alfred,

das war die Lösung. Variante 1 funktioniert sofort.
So werd ichs auch machen.
Trotzdem zu Variante 2:
Wenn ich das shared mache bei einlesenausdwg dann bekomme ich sofort ein paar Fehlermedlungen:

Auf einen Instanzmember einer Klasse kann nicht ohne explizite Instanz einer Klasse von einer/m freigegebenen Methode/Member aus verwiesen werden.

Die erste Fehlermeldung ist bei Thisdrawing und dann bei allen Variablen die vorher in der Klasse deklariert wurden. Woran liegt das? Was könnte ich da machen?
Danke Theo

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP


Ex-Mitglied

erstellt am: 17. Sep. 2010 13:46    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

wenn Du eine Function/Sub/Property mit  Shared  deklarierst, dann ist das gleichbedeutend mit einem Modul. Die Variable, auf die Du darin zurückgreifst, sind auch mittels Shared zu deklarieren oder Du musst diesen Funktionen die Instanz als Parameter mitübergeben.

Ich versuchs mit zwei halb-verbalen Beispielen (fett hervorgehoben die Differenzen):


Beispiel 1:

Code:
Public Class TUERE
  public pTuerTyp as Integer  'darf 0 sein für Schiebetüre, 1 für normale Türe

  public Sub OEFFNEN()
      Select Case pTuerTyp      'da die Funktion in der Instanz läuft, kennt sie auch den Typ für DIESE Türe (diese Instanz)
          case 0: schiebe die Türe auf
          case 1: drehe die Türe auf
      End Select
  end sub
End Class


Beispiel 2:

Code:
Public Class TUERE
  public pTuerTyp as Integer  'darf 0 sein für Schiebetüre, 1 für normale Türe

  public Shared Sub OEFFNEN(ByRef WelcheTuere as TUERE)
      Select Case WelcheTuere.pTuerTyp    'da die Funktion ausserhalb der Instanz läuft, muss man Ihr mitgeben,
                                          'von welcher Türe eigentlich die Rede ist (von welcher Instanz)
                                          'darum ist die Instanz als Parameter mitgegeben worden
          case 0: schiebe die Türe auf
          case 1: drehe die Türe auf
      End Select
  end sub
End Class



Ich hoffe, das ist verständlich erklärt und Du kannst das in Deinem Code richtig umsetzen!
(...weil Shared nicht immer die Lösung ist   )

- alfred -

------------------
www.hollaus.at

Theo37
Mitglied
Techniker


Sehen Sie sich das Profil von Theo37 an!   Senden Sie eine Private Message an Theo37  Schreiben Sie einen Gästebucheintrag für Theo37

Beiträge: 423
Registriert: 08.10.2008

erstellt am: 17. Sep. 2010 14:31    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Alfred,
das mit "Shared vor Allem" funktioniert, das hab ich probiert. Das Andere mit dem Übergeben der Variablen würde sicher auch funktionieren ist aber etwas aufwendiger zum Umsetzen.
Am Montag kämpf ich weiter.
Danke und Gruß,
Theo

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz