| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS | | | | Engineering in the Cloud: Link Sharing of Design Data |
Autor
|
Thema: API - Refresh der UserForm bzw. TextBox (5164 mal gelesen)
|
Andi Beck Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2572 Registriert: 02.10.2006 Firma: SW 2023-4.0 + PDM Prof. Windows 10 Pro 64bit, i9-11900 32 GbRAM, Quadro P2200 Home: SW 2022-5.0 Passungstabelle von Heinz Windows 11 Pro 64bit, i7-12700K, 32 GbRAM, GeForce GTX 1050Ti Samsung C34H892, 3440x1440 Pixel
|
erstellt am: 23. Mrz. 2013 15:35 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich bin gerade beim Anpassen meines Makros Assembly-Safe-Tif an SW2013. Dieses Makro funktioniert unter SW2012 wunderbar. Unter SW2013 mit VisualBasic 7.1 läuft es nach einigen Anpassungen auch, bis auf folgendem Problem. Während das Makro seine Schleifen beim Erfassen und Auswerten durchgeht, werden in TextBoxen die Zwischenergebnisse angezeigt. Mit einem Fortschrittsbalken in Form eines Labels wird der Fortschritt angezeigt. Die entsprechenden Codezeilen heißen dann z.B.: TextBox1.Text = TextBox1.Text + SldPath + vbNewLine lblHinweis2.Text = MaxIdx + 1 & " Komponenten" lblHinweis2.Text = ZaehlerSldDoc & " Komponenten von " & UBound(referencedDoc) & " Komponenten in " & DifTime lblValue.Width = (i + 1) * 215 / UBound(referencedDoc) Wie gesagt, unter SW2012 funktioniert das wie gewünscht, aber in SW2013 wird kein Zwischenergebnis, sondern erst nach durchlaufen des gesamten Makros nur noch das Endergebnis angezeigt. Ich vermute, dass hier ein Refresh nötig ist. Wenn ich vor diesen Aktualisierungen eine MsgBox aufrufe, werden die Zwischenergebnisse wie gewünscht angezeigt. Ich habe aber keine Lust, hundert Mal eine Message Box zu Quittieren. Nun habe ich es mit folgenden Programmzeilen versucht. frmSfInfo.Refresh lblHinweis2.Refresh Me.Refresh Ich bekomme aber immer Fehlermeldungen. Mit Googeln werde ich auch nicht richtig schlau. Wer kann mir einen Tipp geben, wie die betreffenden Anzeigen aktuell gehalten werden können?
Wer sich im Makro umschauen möchte, findet die betreffenden Codezeilen in der Rubrik Sub InsertValue(ByRef NewVal As TreferencedDoc) bzw. Sub Auswerten() (am Ende) Besten Dank schon mal, Grüße, Andi ------------------ Hast du kein Problem? Such dir eins. ( Und löse es ) [Diese Nachricht wurde von Andi Beck am 23. Mrz. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Luechinger Mitglied Ingenieur + CAD-Admin
Beiträge: 71 Registriert: 30.07.2008 Win 7 64bit HP Elitebook 8740W 8 GB Ram Solidworks 2012 SP4 (64bit) ProE WF4 M140 (64bit) Stools 2012
|
erstellt am: 23. Mrz. 2013 16:22 <-- editieren / zitieren --> Unities abgeben: Nur für Andi Beck
Hallo Andi Du könntest nach dem Füllen der Textbox in der Schleife ein DoEvents einfügen. Das sollte den gewünschten Effekt haben. Ist aber sehr "dirty", denn jetzt kann der Benutzer während dein Makro läuft die Buttons nutzen, was zu unschönen Effekten führt. Korrekt wäre glaub ich einen anderen Prozess für das Makro zu Nutzen, wie für das Userinterface, aber wie man sowas macht übersteigt mein Wissen leider deutlich. Gruss David Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andi Beck Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2572 Registriert: 02.10.2006 Firma: SW 2023-4.0 + PDM Prof. Windows 10 Pro 64bit, i9-11900 32 GbRAM, Quadro P2200 Home: SW 2022-5.0 Passungstabelle von Heinz Windows 11 Pro 64bit, i7-12700K, 32 GbRAM, GeForce GTX 1050Ti Samsung C34H892, 3440x1440 Pixel
|
erstellt am: 24. Mrz. 2013 18:31 <-- editieren / zitieren --> Unities abgeben:
Hallo David, besten Dank für die Hilfe. Ich habe es nach diesem Schema eingefügt. http://www.vbarchiv.net/commands/cmd_doevents.html Anfangs war ich etwas irritiert, weil ich glaubte, dass nur die zweite Hälfte des Makros beim Auswerten den gewünschten Erfolg hat. In der ersten Hälfte beim Erfassen der Baugruppe per TraverseComponent konnte ich erst keinen Refresh feststellen. Das liegt aber daran, dass SW2013 mit VisualBasic 7.1 extrem schnell geworden ist. Zu SW2012 hat sich der Durchlauf ca. halbiert. (Bei 456 Komponenten von 16 Minuten auf gut 8 Minuten) Erst als ich eine große Baugruppe zum Testen verwendet hatte, konnte ich auch im ersten Teil den Refresh sehen. Allerdings musste ich hier noch einen Programmabsturz (Überlauf im Fortschrittsbalken) beheben, der mich eine gewisse Zeit beansprucht hatte. Also, falls nicht noch Einwände zu DoEvents von anderen kommen, bleibt es Momentan bei dieser Ergänzung. Das Makro wird dann in seinem eigenen Thread in der neuen Version veröffentlicht. http://ww3.cad.de/foren/ubb/Forum2/HTML/023775.shtml Auch das Schwestermakro bekommt noch die Änderungen verpasst. http://ww3.cad.de/foren/ubb/Forum2/HTML/022358.shtml Viele Grüße, Andi ------------------ Hast du kein Problem? Such dir eins. ( Und löse es ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Torsten Niemeier Ehrenmitglied V.I.P. h.c. Maschinenbau Ingenieur
Beiträge: 3682 Registriert: 21.06.2001 "ZUSE I.36", 8 BIT, 32 Lämpchen, Service-Ölkännchen "ESSO-Super", Software: AO auf Kuhlmann-Parallelogramm-Plattform ** CSWP 04/2011 ** ** CSWE 08/2011 **
|
erstellt am: 24. Mrz. 2013 20:23 <-- editieren / zitieren --> Unities abgeben: Nur für Andi Beck
Hallo Andi. Ich kann bei den neueren Versionen nicht ganz mitreden, aber dieses Problem gab es früher ja auch immer mal wieder. Bis letzte Woche habe ich in einem solchen Fall meistens nach einer Änderung der TextBox oder eines Labels ein Repaint auf die ganze UserForm durchgeführt. Also: Userform.RePaint Nachteil dieser Variante war immer, daß das zu einem deutlichen Flackern der ganzen Userform während der Ausführung geführt hat, und das ganze Makro scheinbar langsamer wurde. Seit kurzem benutze ich jetzt folgende Variante: 1. Änderung der TextBox/ des Labels 2. TextBox.Visible=False / Label.Visible=False 3. TextBox. Visible=True / Label.Visible=True Ist zwar etwas mehr Code, scheint aber bislang problemlos zu funktionieren. Gruß, Torsten
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andi Beck Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2572 Registriert: 02.10.2006 Firma: SW 2023-4.0 + PDM Prof. Windows 10 Pro 64bit, i9-11900 32 GbRAM, Quadro P2200 Home: SW 2022-5.0 Passungstabelle von Heinz Windows 11 Pro 64bit, i7-12700K, 32 GbRAM, GeForce GTX 1050Ti Samsung C34H892, 3440x1440 Pixel
|
erstellt am: 25. Mrz. 2013 23:12 <-- editieren / zitieren --> Unities abgeben:
Hallo Torsten, auch dir besten Dank für deine Ratschläge. Die Variante mit TextBox.Visible bewirkt in meinen Schleifen leider nichts, warum auch immer. Letzte Woche hatte ich Versucht, die UserForm in der Position zu verschieben (frmSfInfo.Left), ebenfalls keine Wirkung. Allerdings funktioniert dein Repaint zum Teil und ist sogar etwas schneller als die DoEvents Variante. Etwas flackern tun beide Varianten. Mit Repaint und der Einstellung "Komponente tatsächlich speichern" habe ich den gewünschten Refresh über die ganze Laufzeit. Verzichte ich auf diese Option (Quasi Testlauf), habe ich die Aktualisierung bis Komponente 18 von 456. Ab da gibt es keine Aktualisierung mehr bis zum Schluss. Auch werden keine Komponenten mehr visuell geladen, es bleibt die 18te Komponente sichtbar. Aber der Featurebaum und der Komponentennamen ganz oben wechseln weiterhin. Alles etwas komisch. Vor allem muss ich mir von den Makros regelmäßig Sicherheitskopien erstellen, weil mir nun schon zum dritten Mal das Makro beim Speichern zerschossen wurde. Es lässt sich nicht mehr aufrufen und ich komme auch nicht mehr per Editor rein. Ob das an dem neuen VisualBasic 7.1 liegt, keine Ahnung. Im Moment scheint mir die DoEvents Anweisung die stabilste zu sein. Falls keine Einwände kommen, bleibt es vorläufig dabei. Grüße, Andi ------------------ Hast du kein Problem? Such dir eins. ( Und löse es ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StefanBerlitz Guter-Geist-Moderator IT Admin (CAx)
Beiträge: 8756 Registriert: 02.03.2000 SunZu sagt: Analysiere die Vorteile, die du aus meinem Ratschlag ziehst. Dann gliedere deine Kräfte entsprechend und mache dir außergewöhnliche Taktiken zunutze.
|
erstellt am: 26. Mrz. 2013 08:50 <-- editieren / zitieren --> Unities abgeben: Nur für Andi Beck
Hallo Andi, ich mach das bei einer Ausgabe in eine Textbox ein bisschen anders, wenn ich das richtig sehe erzeugst du jedesmal den kompletten Text der Textbox neu und aktualisierst das dann. Das dauert seine Zeit, flackert ziemlich stark und die Ausgabe zeigt den Beginn. Ich hab dir mal ein Beispiel angehangen wie ich das meist mache, über den selektierten Text. Grundlegend sind das 3 Zeilen:
Code:
TextBox1.SetFocus For i = 1 To anzahl TextBox1.SelStart = TextBox1.TextLength TextBox1.SelText = "neue Zeile wird am Ende angehangen" & vbCrLf DoEvents Next i
Das TextBox1.SetFocus dient dazu, dass die Textbox auch aktiv ist, dadurch wird bei Setzen des Selektionstextes ans hintere Ende auch dorthin gescrollt. Anschließend den Beginn des "Selektionstextes" mit SelStart hinter das letzte bisherige Zeichen setzen, die neue Zeile als Selektionstext einfügen und mit DoEvents aktualisieren lassen.Ohne das DoEvents sieht man zwar das Scrollen und das Zeilen dazukommen, aber VBA hält (absichtlich) die Ausführung der Repaint Ereignisse zurück, damit es voran geht. Wenn du es statt mit DoEvents über das Repaint oder Refresh der Userform machst werden alle Objekte der Userform neu gezeichnet, das flackert deutlich stärker. Schau dir mal das angehängte Beispiel an, das geht in meinen Augen noch am schicksten. Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andi Beck Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2572 Registriert: 02.10.2006 Firma: SW 2023-4.0 + PDM Prof. Windows 10 Pro 64bit, i9-11900 32 GbRAM, Quadro P2200 Home: SW 2022-5.0 Passungstabelle von Heinz Windows 11 Pro 64bit, i7-12700K, 32 GbRAM, GeForce GTX 1050Ti Samsung C34H892, 3440x1440 Pixel
|
erstellt am: 29. Mrz. 2013 19:17 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von StefanBerlitz:
wenn ich das richtig sehe erzeugst du jedesmal den kompletten Text der Textbox neu und aktualisierst das dann. Das dauert seine Zeit, flackert ziemlich stark und die Ausgabe zeigt den Beginn.
Hallo Stefan, besten Dank auch dir für deine Ausführungen. Ja, das siehst du richtig, wie es bisher von mir gehandhabt wurde, ist halt nach Schulbuch, da wurden deine Feinheiten noch nicht behandelt. Allerdings unter SW2012 ist auch mein Text immer an der untersten Zeile und die Ausgabe zeigt das Ende. Jetzt, wo du mich darauf Aufmerksam machst, stelle ich fest, dass unter SW2013 es so ist, wie du es beschrieben hast. Muss man jetzt unter VisualBasic 7.1 jede Routine auf alles überprüfen? Funktioniert hier manches vermeintlich Selbstverständliche nicht mehr wie gewohnt? Ich habe nun versucht, deine Schreibweise zu übertragen, klingt sie doch sehr plausibel. Erst nur in ähnlicher Form, zum Schluss kpl. mit allem drum und dran. Wo ich nicht weiter komme, ist beim eigenartigen Verhalten bzgl. Scrollen und immer am Textende bleiben. Ich habe wie du eine Private Sub eingerichtet. (Im Anhang ist das kpl. Makro incl. deinen Vorschlägen) Private Sub TextBox(ByVal anzahl As Long) Wenn diese Private Sub direkt über den Start-Button angesprochen wird, funktioniert es wie bei dir, die Ansicht ist immer am Textende. Wenn die selbe Private Sub erneut über meine normale Routine (Sub Auswerten) angesprochen wird, werden zusätzliche Textzeilen zwar ans Ende angefügt, der Scrollbalken geht aber nicht mit. Man sieht also während des ganzen Ablaufes nicht, was hinzugefügt wird. Erst wenn das Makro fertig ist, kann man ans Ende scrollen. Es irritiert mich, dass es nur direkt über den Startbutton richtig funktioniert. (Bei dir vergleichbar mit dem cmdStart100 Button) Wenn du eine Baugruppe mit ca. 30 Komponenten aufmachst, brauchst du mein Makro nur öffnen und auf Starten drücken, schon siehst du das unterschiedliche Verhalten an der Position des Scrollbalkens. Kannst du mir noch einen Tipp geben? Schöne Ostern an Alle, und Grüße, Andi ------------------ Hast du kein Problem? Such dir eins. ( Und löse es ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andi Beck Ehrenmitglied V.I.P. h.c. Konstrukteur
Beiträge: 2572 Registriert: 02.10.2006 Firma: SW 2023-4.0 + PDM Prof. Windows 10 Pro 64bit, i9-11900 32 GbRAM, Quadro P2200 Home: SW 2022-5.0 Passungstabelle von Heinz Windows 11 Pro 64bit, i7-12700K, 32 GbRAM, GeForce GTX 1050Ti Samsung C34H892, 3440x1440 Pixel
|
erstellt am: 23. Apr. 2013 23:09 <-- editieren / zitieren --> Unities abgeben:
Hallo nochmal, ich habe zwischenzeitlich von Stefan per PM den entscheidenden Tipp erhalten und jetzt funktioniert alles (hoffentlich) so wie ich es mir vorstelle. Der Vollständigkeit halber hier noch die empfohlene Lösung von Stefan. "Ich hatte mir das mal runtergeladen und kurz reingeschaut, funktioniert bei mir in der SW2013 wenn ich die Form in der Submain mit frmSfInfo.Show vbmodal aufrufe, bei vbmodeless (so wie bei dir mit (false)) werden bei der Auswertung die Textbox nicht mehr nach oben gescrollt. Scheint daran zu liegen, dass zwischendurch in SolidWorks Modellfenster aktiviert werden" Programmieren sollte man halt können. Die beiden Makros werde ich in den nächsten Tagen in ihren eigenen Beiträgen veröffentlichen und sind dann unter SW2013 lauffähig. Danke schön Stefan und Grüße, Andi ------------------ Hast du kein Problem? Such dir eins. ( Und löse es ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 06. Sep. 2013 08:38 <-- editieren / zitieren --> Unities abgeben: Nur für Andi Beck
Ich kämpfe gerade auch mit der Umstellung der Macros von VBA6 nach VBA7 Mein aktuelles Problem: Die überarbeiteten Makros laufen teilweise unter VBA6 nicht mehr, die brauche ich dort aber- zumindest vorübergehend- auch noch. Gibt es eine Möglichkeit, während der Laufzeit die VBA-Version festzustellen? Und sowas wie "bedingte Compilierung", so dass ich bei VBA6 nicht in einen Fehler laufe, wenn ich dort die Syntax von VBA7 habe (z.B. "Private Declare PtrSafe Function ....") ? Also mal ehrlich, das ist so ein Sch... Bockmist! Und überflüssig wie ein Kropf! ------------------ Klaus www.al-ko.com | mein Gästebuch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StefanBerlitz Guter-Geist-Moderator IT Admin (CAx)
Beiträge: 8756 Registriert: 02.03.2000 SunZu sagt: Analysiere die Vorteile, die du aus meinem Ratschlag ziehst. Dann gliedere deine Kräfte entsprechend und mache dir außergewöhnliche Taktiken zunutze.
|
erstellt am: 06. Sep. 2013 09:16 <-- editieren / zitieren --> Unities abgeben: Nur für Andi Beck
Hallo Klaus, Zitat: Original erstellt von KMassler: Gibt es eine Möglichkeit, während der Laufzeit die VBA-Version festzustellen? Und sowas wie "bedingte Compilierung", so dass ich bei VBA6 nicht in einen Fehler laufe, wenn ich dort die Syntax von VBA7 habe (z.B. "Private Declare PtrSafe Function ....") ?
Ja, das geht. Beispiel aus einem meiner Makros ( 3D Punktewolke generieren - http://solidworks.cad.de/mm_24.htm ) Code:
' ab SW2013 wird VBA7 genutzt, dass erfordert wegen der 64 Bit Möglichkeiten ' sichere Deklarationen. Siehe API Hilfe "VBA and SolidWorks x64" ' und http://msdn.microsoft.com/en-us/library/ff700513(v=office.11).aspx ' und http://www.jkp-ads.com/articles/apideclarations.asp ' #If VBA7 Then ' Windows API for the SaveAs Filebox Private Declare PtrSafe Function GetSaveFileName Lib "comdlg32.dll" Alias _ "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Long ' structure needed by Windows API Private Type OPENFILENAME lStructSize As Long hwndOwner As LongPtr hInstance As LongPtr lpstrFilter As String lpstrCustomFilter As String nMaxCustFilter As Long nFilterIndex As Long lpstrFile As String nMaxFile As Long lpstrFileTitle As String nMaxFileTitle As Long lpstrInitialDir As String lpstrTitle As String flags As Long nFileOffset As Integer nFileExtension As Integer lpstrDefExt As String lCustData As Long lpfnHook As LongPtr lpTemplateName As String End Type #Else ' Windows API for the SaveAs Filebox Private Declare Function GetSaveFileName Lib "comdlg32.dll" Alias _ "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Long ' structure needed by Windows API Private Type OPENFILENAME lStructSize As Long hwndOwner As Long hInstance As Long lpstrFilter As String lpstrCustomFilter As String nMaxCustFilter As Long nFilterIndex As Long lpstrFile As String nMaxFile As Long lpstrFileTitle As String nMaxFileTitle As Long lpstrInitialDir As String lpstrTitle As String flags As Long nFileOffset As Integer nFileExtension As Integer lpstrDefExt As String lCustData As Long lpfnHook As Long lpTemplateName As String End Type #End If
Ciao, tefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|