Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de
  AutoCAD VBA
  Schleifenabbruch mit ESC-Taste

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
  
PNY präsentiert die PRO Elite™ High Endurance microSD-Flash-Speicherkarten für Videoüberwachung und kontinuierliche Aufzeichnung, eine Pressemitteilung
Autor Thema:  Schleifenabbruch mit ESC-Taste (4767 mal gelesen)
Huebi
Mitglied
Vermessungsing.


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

Beiträge: 107
Registriert: 08.01.2004

Intel Core Duo E6750@2.66GHz
NVIDIA GeForce 8600 GT
AutoCAD 2004, 2007, 2008
AcadMAP 2004 und 2007
Civil 3D 2008
ADT 2009

erstellt am: 23. Jun. 2008 11: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

Hallo an Alle!

Ich hab ein Problem mit dem Abbruch einer Schleife.
Also: Ich hab ein Progrämmchen gebastelt, das zwei Linien miteinander verschneidet, die nicht in einer Ebene liegen (nicht koplanar). Das hat soweit schon ganz gut funktioniert und ich wende es ständig an. Jetzt kommt ein Komfort-Problem dazu. Da ich ein sehr schusseliger CAD-Bearbeiter bin, klicke ich öfter schon mal daneben (Nein, ich gehe noch nicht bald in Rente!). Wenn ich mir Standard-AutoCAD-Befehle wie "Ausrunden" ansehe, fängt dieser befehl dieses ab, indem man in einer Schleife hängt, bis ein gültiges AutoCAD-Element ausfewählt wurde. Und genau so eine Schleife würde ich auch gerne basteln.
Also dachte ich mir, ich mach eine Schleife, die ich erst verlasse, wenn ich ein gültiges AutoCAD-Element gewählt habe (Also hier eine Linie) oder aber die ESC-Taste gedrückt wird.
Als Abbruch-Index wollte ich die Variable Err.Number nutzen, doch dummerweise ist diese identisch - ob man ESC drückt, oder ob man in's Leere klickt...

Anbei mal der Rumpf des Progrämmchens mit der Bitte um weise Ratschläge!

Code:

Sub Problem_Schleifen_Abbruch()
Dim Ent1 As AcadEntity
Dim Ent2 As AcadEntity
Dim Lin1 As AcadLine
Dim Lin2 As AcadLine
Dim Pick1 As Variant
Dim Pick2 As Variant

' Erste Linie auswählen
On Local Error Resume Next 'Falls Ent1 noch nicht definiert
While Ent1.ObjectName <> "AcDbLine"
  On Local Error Resume Next
  ThisDrawing.Utility.GetEntity Ent1, Pick1, "Erste Linie angeben: "
  If Err.Number = "-2147352567" Then GoTo ENDE  'hier sollte das Abbruchkriterium für die ESC-Taste rein
  If Ent1.ObjectName <> "AcDbLine" Then
    ThisDrawing.Utility.Prompt "Dies ist keine Linie sondern: " & Ent1.ObjectName & "!!  "
  Else
    Set Lin1 = Ent1
    Lin1.Highlight True
  End If
Wend

' Zweite Linie auswählen
On Local Error Resume Next 'Falls Ent2 noch nicht definiert
While Ent2.ObjectName <> "AcDbLine"
  On Local Error Resume Next
  ThisDrawing.Utility.GetEntity Ent2, Pick2, "Zweite Linie angeben: "
  If Err.Number = "-2147352567" Then GoTo ENDE  'hier sollte das Abbruchkriterium für die ESC-Taste rein
  If Ent2.ObjectName <> "AcDbLine" Then
    ThisDrawing.Utility.Prompt "Dies ist keine Linie sondern: " & Ent2.ObjectName & "!!  "
  Else
    Set Lin2 = Ent2
    Lin2.Highlight True
  End If
Wend

ENDE:

End Sub


Vorab einen herzlichen Dank an alle, die sich an der Lösung des Problemchens beteiligen wollen :-)

Gruß, Hübi

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

KlaK
Ehrenmitglied V.I.P. h.c.
Dipl. Ing. Vermessung, CAD- und Netz-Admin



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

Beiträge: 2855
Registriert: 02.05.2006

AutoCAD LandDesktop R2 bis 2004
Civil 3D 2005 - 2025
Plateia, Canalis
Visual Basic

erstellt am: 23. Jun. 2008 23:42    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 Huebi 10 Unities + Antwort hilfreich

Hallo Hübi,

ich mach das immer so wie im getentity Beispiel.
Damit kannst Du Deine Elemente prima abfragen, aber auch die Funktion abbrechen lassen.
Wenn die goto - Sprünge nicht zu groß sind und der Code übersichlich spricht doch nichts dagegen !?

Grüße,
Klaus

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

Huebi
Mitglied
Vermessungsing.


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

Beiträge: 107
Registriert: 08.01.2004

Intel Core Duo E6750@2.66GHz
NVIDIA GeForce 8600 GT
AutoCAD 2004, 2007, 2008
AcadMAP 2004 und 2007
Civil 3D 2008
ADT 2009

erstellt am: 24. Jun. 2008 07:18    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 Klaus!

Danke für Deinen Beitrag!
Leider ist's in dem Beispiel von "GetEntity" auch nicht anders - es bricht bei einem Fehler komplett ab.

Code:
Sub Example_GetEntity()
    ' This example creates several objects in model space. It then
    ' prompts the user to select an object. The example continues to
    ' have the user select objects until the user selects in empty space.
    '.............(Beitrag gekürzt *g*)   
   
    ' Begin the selection
    Dim returnObj As AcadObject
    Dim basePnt As Variant
   
    On Error Resume Next
   
    ' The following example waits for a selection from the user
RETRY:
    ThisDrawing.Utility.GetEntity returnObj, basePnt, "Select an object"
   
    If Err <> 0 Then
        Err.Clear
        MsgBox "Program ended.", , "GetEntity Example"
        Exit Sub

    Else
        returnObj.Update
        MsgBox "The object type is: " & returnObj.EntityName, , "GetEntity Example"
        returnObj.Update
    End If
   
    GoTo RETRY
End Sub


Dummerweise erzeugt man auch einen Fehler (noch dazu mit der gleichen Fehlernummer), wenn man in's Leere klickt (also beim Klicken kein Element erwischt).

Als Vorbild dient mir die AutoCAD-Funktion "Abrunden". Wenn man da eine Linie nicht erwischt, dann macht das nichts, weil man in einer Schleife aufgefordert wird, das Element nochmals anzuklicken. Und das würde ich in VBA gerne nachbilden.

Vielleicht fällt Dir (oder jemand anderem) doch noch eine elegante Lösung ein.

Liebe Grüße, Hübi

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

KlaK
Ehrenmitglied V.I.P. h.c.
Dipl. Ing. Vermessung, CAD- und Netz-Admin



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

Beiträge: 2855
Registriert: 02.05.2006

AutoCAD LandDesktop R2 bis 2004
Civil 3D 2005 - 2025
Plateia, Canalis
Visual Basic

erstellt am: 24. Jun. 2008 08:48    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 Huebi 10 Unities + Antwort hilfreich

Hallo,

Nur mal so auf die Schnelle (bin in der Arbeit und hab leider keine Zeit).

Da gab's doch mal die Abfrage nach keypressed oder so ähnlich, mit der der Tastencode abgefragt werden konnte. Falls Du es nicht findest, kann ich abends mal nachsehen.

Grüße,
Klaus

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

Huebi
Mitglied
Vermessungsing.


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

Beiträge: 107
Registriert: 08.01.2004

Intel Core Duo E6750@2.66GHz
NVIDIA GeForce 8600 GT
AutoCAD 2004, 2007, 2008
AcadMAP 2004 und 2007
Civil 3D 2008
ADT 2009

erstellt am: 24. Jun. 2008 18:01    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 Klaus,

jaaaa keypressed, das kenn ich auch - leider aber nur von TurboPascal *g* (waren das noch Zeiten *g*).
In VBA hab ich's (noch?) nicht gefunden.
Ich bin aber für jede Hilfe dankbar ;o)

Gruß, Hübi

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

Stechi
Mitglied
Informatiker


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

Beiträge: 75
Registriert: 17.01.2008

erstellt am: 26. Jun. 2008 15: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 Huebi 10 Unities + Antwort hilfreich

Hallo Huebi,

in VBA sieht der Code für das "keypressed"-Ereignis so aus:

Code:
Private Sub <Textfeld-Name>_KeyPress(KeyAscii As Integer)

Dim pos As Long
Dim textString As String

    If KeyAscii = KEY_RETURN Then
      KeyAscii = 0
    ElseIf KeyAscii >= KEY_SPACE Then
      ' aktuelle Cursorposition ermitteln
      pos = <Textfeld-Name>.SelStart
      ' Eingabestring (mit neu eingegebenem Zeichen)
      textString = Mid$(<Textfeld-Name>.text, 1, pos) & Chr$(KeyAscii)
      ' Zeichen selektiert - Cursorposition für Ende ermitteln
      If Len(<Textfeld-Name>.SelText) Then pos = pos + Len(<Textfeld-Name>.SelText)
      ' restliche Zeichen (ohne eventuell selektierte Zeichen) anhängen
      textString = textString & Mid$(<Textfeld-Name>.text, pos + 1)
      ' Eingabestring auf Gültigkeit überprüfen
      If ChkStrOnTyp(textString, CHK_FLOAT) = False Then
          KeyAscii = 0
          Beep
      End If
    End If

End Sub


Für den Code brauchst Du im Verzeichnis "c:\windows\system32\" die Datei "Ekktools32.dll" und im entsprechenden VB-Programm bzw. VBA-Programm folgende Programmzeile:

Code:
Declare Function ChkStrOnTyp Lib "ekktools32.dll" (ByVal strText As String, ByVal chkTyp As Integer) As Long

Ich hoffe, ich konnte Dir damit bzgl. des "key_pressed"-Ereignisses weiterhelfen!

Gruß

Markus

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

fuchsi
Mitglied
Programmierer c#.net Datawarehouse


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

Beiträge: 1201
Registriert: 14.10.2003

AutoCad Version 2012 deu/enu
<P>Windows 7 64bit

erstellt am: 14. Jul. 2008 12:01    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 Huebi 10 Unities + Antwort hilfreich

Code:

Declare Function GetAsyncKeyState Lib "user32" ( _
                ByVal vKey As Long) As Integer

Sub test()
    Dim iEntity As AcadEntity
    Dim iPoint As Variant
    Dim iKeyCode

    On Local Error Resume Next
   
    ThisDrawing.Utility.GetEntity iEntity, iPoint, "Objekt wählen: "
    iKeyCode = GetAsyncKeyState(&H1B)  ' gleich mal abfragen, ob ESC noch gedrückt ist !

    If Err.Number <> 0 then
        Err.Clear
        If (iKeyCode And &H1B) = 1 Then
            MsgBox "ESC"
        Else
            MsgBox "ins Leere geclickt"
        End If
    Else
        MsgBox "Eigentlich müsste was gewähllt worden sein"
    End If

End Sub



[Diese Nachricht wurde von fuchsi am 14. Jul. 2008 editiert.]

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

Huebi
Mitglied
Vermessungsing.


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

Beiträge: 107
Registriert: 08.01.2004

Intel Core Duo E6750@2.66GHz
NVIDIA GeForce 8600 GT
AutoCAD 2004, 2007, 2008
AcadMAP 2004 und 2007
Civil 3D 2008
ADT 2009

erstellt am: 16. Jul. 2008 10:43    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 Anton!!!!!

Herzlichen Dank für Deine Antwort. Das war genau das, was ich gesucht hab!
Und jetzt funktioniert das Ganze genau so, wie ich's mir vorgestellt hab!

Sonnige Grüße aus München
Hübi

[Diese Nachricht wurde von Huebi am 17. Jul. 2008 editiert.]

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

fuchsi
Mitglied
Programmierer c#.net Datawarehouse


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

Beiträge: 1201
Registriert: 14.10.2003

AutoCad Version 2012 deu/enu
<P>Windows 7 64bit

erstellt am: 17. Jul. 2008 09:25    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 Huebi 10 Unities + Antwort hilfreich

 
Zitat:
Original erstellt von Huebi:
Hallo Wilfried!

Herzlichen Dank für Deine Antwort. Das war genau das, was ich gesucht hab!
Und jetzt funktioniert das Ganze genau so, wie ich's mir vorgestellt hab!

Sonnige Grüße aus München
Hübi


Hm. Wen meinst denn mit Wilfried?
Geantwortet haben Dir Klaus, Markus und ich (Anton)

------------------
   
Ing. Anton Fuchs
WWW.FFZELL.AT.TC

[Diese Nachricht wurde von fuchsi am 17. Jul. 2008 editiert.]

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

Huebi
Mitglied
Vermessungsing.


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

Beiträge: 107
Registriert: 08.01.2004

Intel Core Duo E6750@2.66GHz
NVIDIA GeForce 8600 GT
AutoCAD 2004, 2007, 2008
AcadMAP 2004 und 2007
Civil 3D 2008
ADT 2009

erstellt am: 17. Jul. 2008 12:39    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

Oha, was für ein Fauxpas *lach* Da hab ich doch glatt wen verwechselt!
Entschuldige bitte, lieber Anton! Natürlich meinte ich Dich!

Gruß, Hübi

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)2025 CAD.de | Impressum | Datenschutz