Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  Inventor VBA
  Wie GoTo vermeiden?

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:  Wie GoTo vermeiden? (345 mal gelesen)
chense
Mitglied
Konstrukteur


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

Beiträge: 46
Registriert: 14.04.2020

Inventor 2019 auf Windows 10
Intel Xeon E5-1630, 3,7Ghz
Nvidia Quadro P4000
32GB Ram

erstellt am: 15. Jul. 2022 09:58    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 zusammen,

wir stellen in Zukunft auf ein neues Schriftkopf- und Freigabesystem um, das quasi alles aus IProperties zieht die im Laufe eines Bauteillebens so mehr oder weniger automatisch befüllt werden.

Das ganze ist inzwischen zu einem Code von insgesamt rund 4000 Zeilen angewachsen der sich in der Testphase funktionell sehr gut bewährt hat. Allerdings habe ich im Laufe der Programmierung natürlich auch viel dazugelernt und will den Code vor der endgültigen Freigabe noch einmal richtig "sauber" machen.

Dazu gehört auch, dass ich weil ich es nicht besser weiss viel viel GoTo im Code habe - Nun sagt man ja Goto ist ein ziemliches No-Go also raus damit. Nur wie?

Im Anschluss habe ich einige Beispiele aus dem Code mit Erklärungen zu dem was der Code tut. Villeicht kann man ja da und dort ein GoTo einsparen?

1. Holen von benutzerdefinierten IProperties aus Excel (siehe anderer Faden): mit dem Goto wird immer wieder zurück zur Suche nach dem nächsten Property gesprungen

'Benutzerdefinierte Iproperties erstellen
Dim Propertyliste As String
Dim i As Integer
Dim Anzahl As Integer
oCustompropertyset = ThisDoc.Document.PropertySets.Item("Inventor User Defined Properties")
i = 2
Suchproperty :
If Not GoExcel.CellValue("H:\[...].xlsx", "Propertyliste_Auto", "A" & i) = ""
Try
Propertyliste = GoExcel.CellValue("H:\[...].xlsx", "Propertyliste_Auto", "A" & i)
oCustompropertyset.Add("", Propertyliste)
i = i + 1
GoTo Suchproperty
Catch
i = i + 1
GoTo Suchproperty
End Try
End If

2. Es wird abgeprüft ob es sich um ein Dokument mit der Klasse "Ohne Zeichnung handelt" - Sonst wird versucht die Zeichnung zu öffnen - Schlägt dies fehl wird der weitere Prozess abgebrochen und der User kommt am Ende des Codes heraus - Das ist auch die grundlegende Vorgehensweise bei allen Möglichkeiten von Userfehlern die der Prozess nicht selbst auffangen kann (z.B. ein altes Dokument wird auf den neuen Schriftkopf aktualisiert wurde aber schon im alten System falsch freigegeben)

'Schriftkopfname prüfen - Falls OZ folgende Schritte überspringen
If Not iProperties.Value(modelName, "Custom", "Klasse") = "OZ" Then
Dim oActiveSheet As Sheet

'Zeichnung öffnen
Try
ThisDoc.Launch(strname & ".dwg")
[...]
Catch
MessageBox.Show("Es wurde keine zugehörige Zeichnung gefunden" & vbCrLf & "Bitte prüfen Sie den Zeichnungsnamen!" & vbCrLf & _
"Informationen zum weiteren Vorgehen finden sie im Konstruktionshandbuch Schriftkopf!", "Keine Zeichnung vorhanden!", MessageBoxButtons.OK, MessageBoxIcon.Error)
GoTo Nichts
End Try

3. Es wird eine Inputlistbox erstellt aus der alle nötigen IProperties bearbeitet werden können. Nach dem Bearbeiten wird wieder zurück zur Liste gesprungen um das nächste Property wählen zu können oder das ganze zu Beenden. Innerhalb des einzelnen Properties wird jeweils über Suchqualität zurückgesprungen und die nächste Auswahlmöglichkeit aus Excel geholt bis kein Eintrag mehr vorhanden ist

Liste:
Propertyeinfügen = InputListBox("IProperties setzen", Propertyliste, xEnd, Title := "iProperty Übersicht", ListName := "Übersicht der IProperties")

Case xCostCenter
Dim Qualität As New ArrayList
i = 2
Suchqualität:
If Not GoExcel.CellValue("H:\[...].xlsx", "Arrayliste", "B" & i) = ""
Qualität.Add(GoExcel.CellValue("H:\[...].xlsx", "Arrayliste", "B" & i))
i = i + 1
GoTo Suchqualität
End If
iProperties.Value("Project", "Cost Center") = InputListBox("Aktuelle Auswahl: " & iProperties.Value("Project", "Cost Center"), _
Qualität, "", Title := "Qualitätseinstufung", ListName := "Wählen sie die Qualitätseinstufung")
GoTo Liste

4. Es wird nach dem Ausfüllen der Properties ob alle nötigen ausgefüllt wurden, sonst wird der User wieder zur Liste aus Punkt 3 zurückgeschickt
'Prüfung der IProperties auf Vollständigkeit
For Each Prüfstring In Propertyprüfen
If Prüfstring = ""
MessageBox.Show("Das Property " & Propertyfehlt(i) & " muss ausgefüllt werden! Sie werden zur Eingabemaske weitergeleitet! ", "Fehlendes IProperty", MessageBoxButtons.OK, MessageBoxIcon.Error)
Zurück = "J"
End If
i = i + 1
Next
If Zurück = "J" Then
GoTo Liste
End If

Ich hoffe ich konnte euch anhand der Beispiele etwas näher bringen wo und wieso ich GoTo bisher eingesetzt habe und villeicht hat ja jemand ein paar Vorschläge wie ich das reduziere 

------------------
Für jede Fehlermeldung gibt es eine Lösung

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

KraBBy
Mitglied
Maschinenbau-Ingenieur


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

Beiträge: 601
Registriert: 19.09.2007

Inventor Professional 2020
WinX

erstellt am: 15. Jul. 2022 13:21    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 Nur für chense 10 Unities + Antwort hilfreich

Ein Beispiel habe ich mir raus gepickt:

Zitat:
'Benutzerdefinierte Iproperties erstellen
Dim Propertyliste As String
Dim i As Integer
Dim Anzahl As Integer
oCustompropertyset = ThisDoc.Document.PropertySets.Item("Inventor User Defined Properties")
i = 2
Suchproperty :
If Not GoExcel.CellValue("H:\[...].xlsx", "Propertyliste_Auto", "A" & i) = ""
Try
Propertyliste = GoExcel.CellValue("H:\[...].xlsx", "Propertyliste_Auto", "A" & i)
oCustompropertyset.Add("", Propertyliste)
i = i + 1
GoTo Suchproperty
Catch
i = i + 1
GoTo Suchproperty
End Try
End If

Das ist der Job für eine Schleife, vereinfacht etwa so:
Code:
Dim i As Integer
    i = 2
    Do
        Propertyliste = GoExcel.CellValue("H:\[...].xlsx", "Propertyliste_Auto", "A" & i)
        If "" = Propertyliste Then Exit Do
        oCustompropertyset.Add("", Propertyliste)
        i = i + 1
    Loop

Das ist vielleicht auch kein allzu guter Stil (mir gefällt nicht, dass es eine potentielle Endlosschleife ist. Evtl. noch ein Notanker mit Loop While i<1000). Sollte aber das gleiche liefern. Aus Excel lesen, Wenn leer wird die Schleife verlassen (es geht mit der Zeile nach dem Loop weiter), ansonsten wird das iProp erstellt, Zähler erhöhen, Bei Loop "springt" die Ausführung wieder hoch zum Do. 

Bin aber etwas verwirrt: Du hast 4000 Zeilen Code gebastelt und kennst keine Schleife? Mindestens etwas Programmiererfahrung scheint aber vorhanden. Kommst Du von einer anderen Programmiersprache?

------------------
Gruß KraBBy

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

KraBBy
Mitglied
Maschinenbau-Ingenieur


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

Beiträge: 601
Registriert: 19.09.2007

Inventor Professional 2020
WinX

erstellt am: 15. Jul. 2022 13: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 Nur für chense 10 Unities + Antwort hilfreich

noch ein paar doofe Fragen:
Das ist ja kein VBA-Code. Also iLogic? externe Regel?
Gibt es keine Aufteilung des Codes in mehrere Subs oder Functions?

Zu 2. passt vielleicht "Exit Sub" (bzw. "Exit Function") das beendet die jeweilige Prozedur. Jenachdem geht es dann mit dem Aufrufenden Code weiter.

------------------
Gruß KraBBy

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

chense
Mitglied
Konstrukteur


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

Beiträge: 46
Registriert: 14.04.2020

Inventor 2019 auf Windows 10
Intel Xeon E5-1630, 3,7Ghz
Nvidia Quadro P4000
32GB Ram

erstellt am: 16. Jul. 2022 09:22    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

Erst einmal herzlichen Dank für die Antwort. Um auf deine Fragen zurückzukommen.

Genau es handelt sich bei all dem um Ilogic-Code. Insgesamt sind es 9 verschiedene Regeln wobei der Grobe Aufbau so ist:

1) Freigabeschritt wählen

- wenn Schriftkopf auf alter Version dann wird automatisch eine Regel ausgeführt die eben die neuen Properties holt, den neuen Schriftkopf in die Zeichnung bringt etc

- sonst hat der User mehrere Varianten, wobei es immer darauf hinausläuft hilfestellung beim ausfüllen der properties zu geben, zu prüfen welche Properties beim aktuellen Projektstand nötig sind, entsprechende Skizzensymbole (z.b. vorabzug) einzufügen, die revision entsprechend anzupassen, stücklisten zu exportieren und das ganze am ende über pdf zu dokumentieren

Zur Programmiererfahrung ... es ist schlussendlich halt alles gewachsen. angefangen hat es damit, dass wir bei zertifizierungen pdfs mit einer inhaltsnummer vorne dran brauchen und ich bei einer freigabe mit knapp 300 zeichnungen keine lust mehr auf das immer gleiche zeichnung öffnen, pdf machen, pdf umbenennen hatte ... das tool wurde dann recht beliebt. Dann kam der wunsch auf bei solchen freigaben auch gleich das geprüft durch und geprüft am auszufüllen und nun sind wir halt am ende bei diesem vielen code gelandet bei dem ich viel z.b. hier gelernt habe und mir auch ein kleines "handbuch" dazu geschrieben, aber oft noch nicht sicher bin was wo die richtige Wahl ist. Jetzt steht das Gesamtpaket funktionell in den Startlöchern aber vor der endgültigen Freigabe will ich "sauberen" Code haben den am Ende auch mal jemand anders mit dem Handbuch warten kann.

Die Do-Schleife z.b. kenne ich grundsätzlich schon aber habe eben wenig Anwendungserfahrung damit und immer Respekt vor potentiellen Endlosschleifen. Daher habe ich eben immer viel mit If Not "" oder For-Schleifen gearbeitet.

------------------
Für jede Fehlermeldung gibt es eine Lösung

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