| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
 | PNY: der unverzichtbare Partner für umfassende KI-Lösungen von Workstations bis zu Edge Computing und KI-Cluster-Bereitstellung, eine Pressemitteilung
|
Autor
|
Thema: Attribute und UserForm (3050 mal gelesen)
|
Lappi Mitglied Datenträger :)

 Beiträge: 56 Registriert: 30.08.2006 Ich hoffe dieses kleine Feld reicht aus um alles hinein zu schrei
|
erstellt am: 30. Aug. 2006 19:47 <-- editieren / zitieren --> Unities abgeben:         
Hallo zusammen..bin der Neue  Ich stehe grade vor folgendem Problem und hätte gerne einen Gedankenastoß zur Lösung: In einer Zeichnung habe ich einen recht grossen Block mit jeder Menge nicht ausgefüllten Attributen. Der Block ist tabellarisch aufgebaut, die Attribute sind wie folgt: attA01 attA02 attA03 attA04 attB01 attB02 attB03 attB04 usw. das Ganze ist leider im 'normalen' Attributeditor (attedit) und auch in der Eigenschaften-Ansicht zu unübersichtlich. Daher wollte ich gerne eine UserForm erstellen, sämtliche Attribute in Textfelder übergeben, dort modifizieren und hinterher wieder in den Block schreiben. Wie ich den Block auslese weiss ich...aber irgendwie fehlt mir die richtige Idee die Werte gezielt in die Textfelder der Form zu übergeben. Besonders schöne wäre es sogar, wenn sich diese Form dynamisch aufbauen würde...als Beispiel: Im Block sind 100 Attribute, immer 5 nebeneinander stehend, und ich erhalte ein Formular welches genau diese Tabelle wiederspiegelt. Am liebsten täte ich ja die Werte an Excel oder Access/dBase übergeben ...aber das ist aus technischen Gründen dieses mal nicht möglich. Ich muss es irgendwie mit einer tabellarischen Darstellung in Acad hinbekommen :/ Hat vielleicht jemand eine Idee wie man da herangehen könnte? Grüsse ML Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Carsten1210 Mitglied staatl. geprüfter Holztechniker
   
 Beiträge: 1360 Registriert: 24.07.2002
|
erstellt am: 30. Aug. 2006 20:16 <-- editieren / zitieren --> Unities abgeben:          Nur für Lappi
Hallo Lappi, Erst ma Herzlich Wilkommen im Forum. Einem Textfeld in der Userform kannst du wie folgt den Wert eines Attributs zuweisen: Userform1.TextBox3.Text = (LTrim(Attrib(2).textString)) Du kannst ja die Anzahl der Attribute über einen Selectionset ausfiltern. Danach kannst du die Anzahl der Textfelder in deiner Form bestimmen und erstellen. Gruß, Carsten [Diese Nachricht wurde von Carsten1210 am 30. Aug. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 31. Aug. 2006 12:26 <-- editieren / zitieren --> Unities abgeben:          Nur für Lappi
Hallo, wie wärs mit einem Excelersatz ? Lies doch die Attribute in ein Grid ein. Hierzu erzeugst du ein Recordset im Speicher (ohne Datenbank dahinter). Diese Datenquelle läßt sich z.B. für ein Datagrid verwenden. Verweis auf "Microsoft ActiveX Data Objects Recordset 2.x Library" (ADOR) einstellen und als Komponente "Microsoft DataGrid Corntrol"
Code: Option ExplicitDim rs As ADOR.Recordset Private Sub UserForm_Initialize() ' Temporäres Recordset definieren Set rs = New ADOR.Recordset rs.Fields.Append "AttrName", adBSTR, 30 rs.Fields.Append "AttrValue", adBSTR, 30 rs.Open ' Werte füllen rs.AddNew rs.Fields(0).Value = "Attr1" rs.Fields(1).Value = "1234ABCD" rs.Update rs.AddNew rs.Fields(0).Value = "Attr2" rs.Fields(1).Value = "xyz" rs.Update ' Die Daten im Grid anzeigen Set Me.DataGrid1.DataSource = rs ' Einstellungen im Grid Me.DataGrid1.AllowAddNew = False Me.DataGrid1.AllowDelete = False Me.DataGrid1.AllowUpdate = True Me.DataGrid1.Caption = "Meine Attribute" Debug.Print Me.DataGrid1.ColumnHeaders Me.DataGrid1.Columns(0).Caption = "Name" Me.DataGrid1.Columns(1).Caption = "Wert" Me.DataGrid1.RowHeight = 15 End Sub
Stelli------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lappi Mitglied Datenträger :)

 Beiträge: 56 Registriert: 30.08.2006 Ich hoffe dieses kleine Feld reicht aus um alles hinein zu schrei
|
erstellt am: 04. Sep. 2006 20:49 <-- editieren / zitieren --> Unities abgeben:         
Hallo. Sorry, dass meine Antwort auf sich warten lies..ich musste diese Problemlösung leider ein wenig nach hinten verschieben. Erst einmal Danke für die Antworten. @Stelli Leider geht Dein Lösungsansatz nicht, da ich weder Excel noch einen Verweis auf eine andere Lib verwenden kann. Sicher wäre das die elegantere Lösung die Daten zu übergeben, aber leider muss ich es dieses mal mit MS-Forms und Acad hin bekommen @Carsten Userform1.TextBox3.Text = (LTrim(Attrib(2).textString)) war genau der Ansatz der meinen grauen Zellen fehlte! Ich gehe da nun wie folgt heran: - Selectionset erstellen - Zähler (i) durchlaufen lassen - TextBox(i) mit Att(i) befüllen - Inhalte der TextBoxen in der UserForm ändern - von TextBox(i) das Att(i) wieder beschreiben (der Code dazu folgt, sobald er 'fertig' incl. dynamischer UserForm-Erzeugung ist) Das klappt schon hervorragend. Ich sitze nun an dem Problem, dass ich mit LostFocus in der UserForm zu kämpfen habe und suche zur Zeit nach einer Möglichkeit, die zuletzt angeklickte TextBox in eine Variable zu übergeben, so dass ich sie bei 'Verlust' durch UserForm1.hide immer wieder ansprechen kann. Wenn das in meiner Schleife funktioniert, werde ich mich daran setzen dieses Formular 'dynamisch' zu erzeugen...also TextBox(n) = Anzahl der Attribute pro Block im Selectionset generieren und den TextBox.Name automatisch auf einen passenden Wert des Blockattributes zu setzen. Hat vielleicht noch jemand eine Idee parat, wie man den TextBox.Name bei Fokusverlust automatisch in eine varTextBox schreiben kann, so dass bei erneutem .show der UserForm die letzte Box fokussiert wird? Grüsse ML
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 04. Sep. 2006 21:16 <-- editieren / zitieren --> Unities abgeben:          Nur für Lappi
Hallo, das hast du wahrscheinlich falsch verstanden mit Excel. Bei der Lösung ist kein Verweis nötig oder vorhanden. Es wird nur das DBGrid von VB verwendet. So hast du immer eine dynamische Lösung. Wenn du wie in deinem Beispiel ein Muster in der Attributanzahl hast, brauchst du nur die entsprechnnde Anzahl Spalten als Felder anlegen und fertig. Probier es mal aus. Über die Ereignisse des Grids kannst du Row und Col abfragen und nach einem erneuten einblenden wieder am die Stelle springen. Stelli ------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Goofy007 Mitglied Vermessungstechniker
  
 Beiträge: 578 Registriert: 06.11.2004 Map3D 2018 und Civil3D 2018
|
erstellt am: 05. Sep. 2006 12:34 <-- editieren / zitieren --> Unities abgeben:          Nur für Lappi
Hallo Lappi, meinst du sowas? Code: Private Sub TextBox1_Enter() txtTextBoxName = TextBox1.Name End Sub Private Sub TextBox4_Exit(ByVal Cancel As MSForms.ReturnBoolean) txtTextBoxName = TextBox4.Name End Sub
die erste Variante speichert den Namen beim Erhalt der Focus, die zweite beim Verlust. mfg Didi
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lappi Mitglied Datenträger :)

 Beiträge: 56 Registriert: 30.08.2006 Ich hoffe dieses kleine Feld reicht aus um alles hinein zu schrei
|
erstellt am: 05. Sep. 2006 19:09 <-- editieren / zitieren --> Unities abgeben:         
Hallo zusammen. Finde ich richtig prima, dass mein Problem bei Euch Anklang findet @Stelli Leider ist meine Aufgabenstellung es mit Textfeldern zu lösen. Davon abgesehen ist Deine Idee wirklich gut und ich werde sie nach Abschluss der zur Zeit gestellten Aufgabe ausprobieren! Ich habe mir diese Aufgabe leider nicht selber gestellt, ansonsten wären die gesamten Daten schon längst woanders hin übergeben, wo ich sie komfortabler bearbeiten könnte  @Goofy Ja, so in der Art mache ich es zur Zeit auch schon...ansonsten hätte ich ja 0 Chance den Fokus zurück zu geben. Problem ist nur: Angenommen ich habe 100 Textfelder, so müsste ich 100mal
Code: Private Sub TextBox1_Enter() txtTextBoxName = TextBox1.Name End Sub Private Sub TextBox2_Enter() txtTextBoxName = TextBox2.Name End Sub
verwenden. Ich versuche es innerhalb einer Schleife zu lösen...Meine TextBox(i) hat auch diesen Namen...also z.B. TextBox17, TextBox18 usw. Den Namen generiere ich beim Öffnen der UserForm über "TextBox" & [Zählervariable] ...aber leider scheint es irgendwie keine Möglichkeit zu geben beim _Enter oder _Exit sämtlicher sich auf einem Formular befindlichen TextBoxen den TextBox(i).Name zu greifen *seufs*...oder ich komme halt nicht darauf Grüsse ML Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
muller75 Mitglied
 Beiträge: 1 Registriert: 18.12.2003
|
erstellt am: 06. Sep. 2006 07:25 <-- editieren / zitieren --> Unities abgeben:          Nur für Lappi
Hallo Lappi, du kannst mit Controls("Name") auf alle Steuerelemente mit dem Namen zugreifen. Code: ------------------------------------------------ Private Sub WerteAuslesen() Dim ctlName as String Dim ctlInhalt as String For i = 1 to 100 ctlName = "TextBox" & Trim(i) ctlInhalt = Me.Controls(ctlName).Value Next i End Sub ------------------------------------------------ lg, Michael Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 06. Sep. 2006 11:10 <-- editieren / zitieren --> Unities abgeben:          Nur für Lappi
Hallo, in VB kannst du mit Control Arrays arbeiten. Da kannt du jedes Corntrol mit Textbox(i).blabla ansprechen. Da hast du dann auch einen Eventhndler für das ganze Controlarray. IMHO kannst du das mit VBA nicht machen, weil es keine Controlarrays unterstützt. Auf die Eigenschaften kannst du ja wie muller75 schrieb mit ctlInhalt = Me.Controls(ctlName).Value zugreifen. Aber mit den Events wird es schwierig. Wenn du VB6 hast kannt du dir doch ein OCX bauen welches die Textboxen dynamisch einfügt und das Eventhandlicg übernimmt. Oder doch mit dem Grid ??? Stelli PS: Zitat: Original erstellt von Lappi: Hallo zusammen..bin der Neue 
Habs gerade noch gesehen. Na dann herzlich willkommen ------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lappi Mitglied Datenträger :)

 Beiträge: 56 Registriert: 30.08.2006 Ich hoffe dieses kleine Feld reicht aus um alles hinein zu schrei
|
erstellt am: 06. Sep. 2006 16:58 <-- editieren / zitieren --> Unities abgeben:         
Hmm...wirklich blöde Ja leider kann man nicht auf Events zugreiffen...einzige Möglichkeit die ich gefunden habe wäre eine Endlosschleife die permanent das aktive Steuerelement ausliest. Mit varControl = Active.Control.Name (hoffentlich ohne Tippfehler aus dem Gedächnis gekramt) habe ich es zumindest schon geschafft den Namen in die Variable zu bekommen...aber das geht leider auch nur bedingt. Sobald ich die xTextBoxen auf einer Multipage habe, ist das Active.Control immer Page1  Danke für Eure Gedankenanstösse, sobald ich wieder eine ruhige Minute finde werde ich sie verfolgen und ein wenig weiter testen. Je mehr ich mich mit dem Problem beschäftige reizt es mich..vielleicht kommt ja eines Tages dabei nen schnuckeliges kleines Tool bei rum mit mehr Comfort als _attedit ... *g* Grüsse ML P.S.: Danke für die Willkommensgrüsse  Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
schrema Mitglied Umweltingenieur

 Beiträge: 12 Registriert: 21.02.2006
|
erstellt am: 11. Sep. 2006 10:34 <-- editieren / zitieren --> Unities abgeben:          Nur für Lappi
Hallo Lappi, man kann auch unter VBA auf während der Laufzeit hinzugefügte Steuerelemente zugreifen. Hierzu werden die neuen Steuerelemente in Feld geschrieben, dessen Typ in einem Klassenmodul definiert wurde. 'Code im Klassenmodul "Textfeld_Ereignis" Public WithEvents textfeld As MSForms.TextBox Private Sub textfeld_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) 'Name des aktuellen Textfeldes bei Tastatureingabe tb_name = Me.textfeld.Name End Sub Private Sub textfeld_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) 'Name des aktuellen Textfeldes bei Anklicken mit Maus tb_name = Me.textfeld.Name End Sub 'Hinzufügen der Steuerelemente im Code der Userform Dim tb() As New Textfeld_Ereignis Sub userform_initialize() 'Array für Textfelder initialisieren ReDim tb(0) End Sub Private Sub UserForm_Activate() 'bei erneuter Aktivierung Fokus auf letztes Textfeld setzen If tb_name <> "" Then Me.Controls(tb_name).SetFocus End If End Sub Private Sub CommandButton1_Click() 'Textfelder hinzufügen k = UBound(tb) Set box = Controls.Add("Forms.Textbox.1", "Text_" & k, True) box.top = k * 30 + 20 Set tb(k).textfeld = box ReDim Preserve tb(k + 1) k = k + 1 End Sub Private Sub CommandButton2_Click() 'Userform verbergen Me.Hide End Sub 'Code im Startmodul Public tb_name 'Name der aktuellen Textbox in globaler Variable speichern Sub test() Do Until abbruch = True User_test.Show Loop Unload User_test End Sub Der vorliegende Code ist nur ein Denkanstoß.
MfG Marco Schreiter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lappi Mitglied Datenträger :)

 Beiträge: 56 Registriert: 30.08.2006 Ich hoffe dieses kleine Feld reicht aus um alles hinein zu schrei
|
erstellt am: 11. Sep. 2006 17:22 <-- editieren / zitieren --> Unities abgeben:         
Hallo Marco. Zitat: man kann auch unter VBA auf während der Laufzeit hinzugefügte Steuerelemente zugreifen. Hierzu werden die neuen Steuerelemente in Feld geschrieben, dessen Typ in einem Klassenmodul definiert wurde.
könnte die Lösung sein! Ich war an der Stelle schon am Verzweifeln, dass ich unter AutoCAD nicht mit Active.Control (wie gewohnt) zugreifen konnte. Werde ich sobald als möglich mal ausprobieren..ich danke Dir für den Tipp! Grüsse ML Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ollibaer2004 Mitglied Dipl. Ing. Versorgungstechnik

 Beiträge: 54 Registriert: 28.06.2004 Athlon 64 4000 Windows Xp ADT7 + Rocad 7 http://tga4acad.de.vu
|
erstellt am: 25. Sep. 2006 10:31 <-- editieren / zitieren --> Unities abgeben:          Nur für Lappi
hi zusammnen, bin zufällig in eure diskussion geraten, hatte mal ein ähnliche problem, hab aber mit excel gelöst. mit meinem angehängten program kann man sich alle blöcke in einer zeichnung mit angabe der enthaltenen attribute anzeigen lassen und nach excel übergeben. dort ändert man diese und schreibt sie anschließend zurück. identifiziert wird der block anhand der übergebenen objekt-id löscht man in excel die objekt id wird beim zurückschreiben nach einem einfügepunkt gefragt. ich hoffe es hilft. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lappi Mitglied Datenträger :)

 Beiträge: 56 Registriert: 30.08.2006 Ich hoffe dieses kleine Feld reicht aus um alles hinein zu schrei
|
erstellt am: 26. Sep. 2006 19:10 <-- editieren / zitieren --> Unities abgeben:         
Hallo ollibaer2004. Ich zitiere mich mal selber: Zitat: Am liebsten täte ich ja die Werte an Excel oder Access/dBase übergeben ...aber das ist aus technischen Gründen dieses mal nicht möglich. Ich muss es irgendwie mit einer tabellarischen Darstellung in Acad hinbekommen :/
Eine recht gut funktionierende Schnittstelle zu Office-Produkten habe ich bereits. Es ging dieses mal um eine Lösung in AutoCAD 'pur' (an der ich aus Zeitmangel immer noch sitze ... hrmpf ich hasse dynamischen Aufbau einer MS-Forms in meiner Freizeit ) Danke Dir trotzdem für die Antwort, vielleicht benötigt ja ein anderer Leser Deine angehängte Exceltabelle. Grüsse Lappi ------------------ die EDV (weibl.)...ansonsten wäre die Kommunikation mit Computern und deren angeschlossenen Geräte in einer für jederMann verständlichen Sprache... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Benny4 Mitglied Softwareentwickler
 
 Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2010 ZW-CAD 2012
|
erstellt am: 23. Okt. 2006 23:10 <-- editieren / zitieren --> Unities abgeben:          Nur für Lappi
Hallo, bin auf deinen Eintrag gestoßen und ich denke du könntet mir helfen: Ich muss nämlich die Attribute eines blockes auslesen, diese editieren und weider zurückschreiben. Nur wie kann ich auf die Attribute zugreifen? Und krieg ich auch die anderen Eigenschaften, wie den Einfügepunkt und so? möchte es so machen, dass man einen Block auswählen kann, und von diesem die besagten Sachen auslesen...
Danke schon im Voraus! Grüsse Benny ------------------ Grüse Benny Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Carsten1210 Mitglied staatl. geprüfter Holztechniker
   
 Beiträge: 1360 Registriert: 24.07.2002
|
erstellt am: 24. Okt. 2006 07:11 <-- editieren / zitieren --> Unities abgeben:          Nur für Lappi
|
Benny4 Mitglied Softwareentwickler
 
 Beiträge: 178 Registriert: 16.02.2006 AutoCAD 2010 ZW-CAD 2012
|
erstellt am: 24. Okt. 2006 21:06 <-- editieren / zitieren --> Unities abgeben:          Nur für Lappi
Hallo Carsten, danke schon mal für die schnelle Antwort. Ich hätte da noch ne Frage: Ich wähle so einen Block aus: Code:
Dim ogac_Sset As AcadSelectionSet Dim xType(0) As Integer Dim xvalue(0) As Variant On Error Resume Next Set ogac_Sset = ThisDrawing.SelectionSets("MySelset") If Err.Number Then Set ogac_Sset = ThisDrawing.SelectionSets.Add("MySelset") End If xType(0) = 0 xvalue(0) = "Insert" ogac_Sset.SelectOnScreen xType, xvalue
Ich schaffe es jetzt nur nicht, diese Auswahl einem "AcadBlockReference" - Objekt zuzuweisen, damit ich die Attribute auch bearbeiten kann. Kannst du mir da vielleicht noch auf die Sprünge helfen? Besten Dank schon mal
------------------ Grüse Benny Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Carsten1210 Mitglied staatl. geprüfter Holztechniker
   
 Beiträge: 1360 Registriert: 24.07.2002
|
erstellt am: 25. Okt. 2006 06:59 <-- editieren / zitieren --> Unities abgeben:          Nur für Lappi
Hallo Benny, Schau dir doch mal die Beispiel über GetAttributes in der Hilfe an. Dort ist es recht gut beschrieben, wie du an die Attribute rankommst und diese ändern / auslesen kannst. Gruß, Carsten Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |