| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
| |
| Technikerschüler der staatlichen Feintechnikschule Schwenningen zu Besuch bei SolidCAM GmbH in Schramberg |
Autor
|
Thema: API - Nutzung von ActiveX Steuerelementen (2162 mal gelesen)
|
mafu Mitglied Student
Beiträge: 18 Registriert: 15.10.2002
|
erstellt am: 26. Aug. 2005 15:15 <-- editieren / zitieren --> Unities abgeben:
Hallo Zusammen! Ich verzweifle schon seit einiger Zeit an folgendem Problem: Ich möchte für eine Zusatzanwendung ein Treeview Steuerelement auf einem selbst erstellten Register im Feature Manager nutzen. Beim Testen in einem Solidworks Macro funktioniert die ganze Sache tadellos. Versuch ich dagegen das Steuerelement aus einer Solidworks -Zusatzanwendungs dll heraus zu erzeugen, funktioniert das nur beim Einsatz der späten Bindung. Dann kann ich allerdings keine Events des Treeviews mehr abfangen. Ist es überhaupt möglich, ein Activex Steuerelement mit Events aus einer Addin Dll heraus zu nutzen? Bin für jegliche Hinweise dankbar. Viele Grüße Mathias
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
SLDW-FEM Mitglied Simulations-Ingenieur
Beiträge: 640 Registriert: 21.02.2005 Solidworks 2017+2019+20+22 SpaceClaim Windows 11 64bit HP-ZBook 32gbRAM NVIDIA
|
erstellt am: 26. Aug. 2005 15:35 <-- editieren / zitieren --> Unities abgeben: Nur für mafu
Wie erzeugst DU denn die DLL? .NET oder VB6 oder anderer Compiler (ggf. Delphi, keine c-Syntax) => wenn möglich, Dein Macro mal mitschicken? Ausserdem mal mit SW2006 testen, es wird ständig was verbessert Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mafu Mitglied Student
Beiträge: 18 Registriert: 15.10.2002
|
erstellt am: 26. Aug. 2005 15:50 <-- editieren / zitieren --> Unities abgeben:
|
PASCAM Mitglied Diplom Informatiker
Beiträge: 67 Registriert: 25.11.2002
|
erstellt am: 26. Aug. 2005 17:29 <-- editieren / zitieren --> Unities abgeben: Nur für mafu
Hallo Matthias, das koennte auch an der Registry liegen. Welche Version ist dort registriert und welche hat Deine Dll vom Steuerelement. SWX erzeugt ein Objekt anhand des Namens bzw. der GUID, also rein anhand der Registry. VB6 holt sich die Infos aber aus der TLB, also der Dll. Daher muss das zusammenpassen. Ansonsten schick mal einen Beispielcode. Gruss, Ralph ------------------ PASCAM Ralph Müller Softwareentwicklung Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mafu Mitglied Student
Beiträge: 18 Registriert: 15.10.2002
|
erstellt am: 26. Aug. 2005 18:10 <-- editieren / zitieren --> Unities abgeben:
Hallo! Ich habe mal unten liegenden Quelltext mitgeschickt. Der Funktioniert aus einem Macro wunderbar. Aus meiner Addin dll jedoch nur wenn ich beim Treeview Control die späte Bindung benutze. Mache ich das nicht, erhalte ich bei .GetControl eine Typenunverträglichkeit. Der Fehler tritt bei allen Controls auf. Das Problem ist das ich eigentlich mit Programmierung bisher nicht viel gemacht habe, bisher aber dennoch viel geschafft habe. Das ist die einzige Sache die bisher überhaupt nicht funktionieren will. Vielen Dank für Eure Mühen. Mahias Code: Public Sub Test() Const IconSmall As String = "D:\Diplomarbeit\ActiveX_test\toolbar_small.bmp" Dim tvTreeCtrl As MSComctlLib.TreeView Dim swapp As SldWorks.SldWorks Dim idoc As SldWorks.ModelDoc2 Dim pModViewMgr As SldWorks.ModelViewManager Dim swFeatMgrTabTop As SldWorks.FeatMgrView Dim swFeatMgrTabBtm As SldWorks.FeatMgrView Dim nActivePane As Long Dim nViewHwnd As Long Set swapp = GetObject(, "SldWorks.Application") Set idoc = swapp.ActiveDoc Set pModViewMgr = idoc.ModelViewManager Set swFeatMgrTabTop = pModViewMgr.CreateFeatureMgrControl2(IconSmall, "MSComctlLib.TreeCtrl", "", "TDE top tooltip", swFeatMgrPaneTop) Set tvTreeCtrl = swFeatMgrTabTop.GetControl tvTreeCtrl.Nodes.Add , , "Test", "Test" idoc.FeatureManagerSplitterPosition = 0.5 nActivePane = swFeatMgrTabTop.ActivateView End Sub
[Diese Nachricht wurde von mafu am 26. Aug. 2005 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mafu Mitglied Student
Beiträge: 18 Registriert: 15.10.2002
|
erstellt am: 29. Aug. 2005 09:31 <-- editieren / zitieren --> Unities abgeben:
Morgen! Niemand eine Idee? Wenn jemand so etwas schon mal gemacht hat, wäre ein kurzer Hinweis was zu beachten ist nicht schlecht. Habe mal parallel dem Solidworks API Support mein Problem geschickt, mal sehen was dabei rauskommt. Viele Grüße Mathias Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Carlhainz Mitglied Student
Beiträge: 12 Registriert: 18.07.2004
|
erstellt am: 31. Aug. 2005 11:18 <-- editieren / zitieren --> Unities abgeben: Nur für mafu
Morgen, ich hab genau das gleiche Problem... Mein Code sieht folgendermaßen aus. Code:
Private Function SwAddin_ConnectToSW(ByVal ThisSW As Object, ByVal Cookie As Long) As Boolean Set swApp = ThisSW Set swModel = swApp.ActiveDoc() swCookie = Cookie swApp.SetAddinCallbackInfo App.hInstance, Me, swCookie If swModel Is Nothing Then MsgBox "Noch kein Doc offen" Else 'ActiveX-Steuerelemente laden If swModel.GetType() = swDocASSEMBLY Then Set swFeatMgrView = swModelViewManager.CreateFeatureMgrControl2(iconPath, "TestProjekt.MyTreeView", "", "Testbaum", swFeatMgrPane_e.swFeatMgrPaneBottom) 'Strukturbaum laden If Not swFeatMgrView Is Nothing Then swFeatMgrView.ActivateView Set TreeViewCtrl = swFeatMgrView.GetControl() If Not TreeViewCtrl Is Nothing Then swStatusBarPane.Text = "TreeView erfolgreich geladen..." Call TreeViewCtrl.AddItem(, , "Root", "RootNode", NewItem) Else MsgBox "TreeView nicht erfolgreich geladen..." End If End If Else MsgBox "Keine Bauteilezusammenstellung geöffnet" End If End If swStatusBarPane.Text = "AddIn successfully loaded..." SwAddin_ConnectToSW = True End Function
Dazu sei allerdings zu sagen, dass ich ein eigenes ActiveX-Steuerelement geschrieben habe, das ein TreeView-Control enthält. Die Varibale TreeViewCtrl ist global als Variant definiert. Arbeitet man so, so wird das eigene ActiveX-Steuerelement in SolidWorks angezeigt. Das Problem mit den Events ist so aber noch nicht gelöst. Ich hab mich dazu für einen etwas komplizierten Lösungsweg entschieden: Ich habe eine zweites Klassenmodul geschrieben, das alle Events des interen TreeView Controls weiterleitet. Diese Klasse kann man ohne weiteres instanziieren und dann dem eigenen Steuerelement, in dem das TreeView-Steuerelement enthalten ist zuweisen. In dem eigenen Steuerelement müssen nun nur alle benötigten Events des TreeView-Steuerelements abgefangen und weitergeleitet werden. Etwas kompliziert, aber es funktioniert. Für Rückfragen steh ich gern zur Verfügung... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Carlhainz Mitglied Student
Beiträge: 12 Registriert: 18.07.2004
|
erstellt am: 31. Aug. 2005 11:33 <-- editieren / zitieren --> Unities abgeben: Nur für mafu
Hi nochmal, meine Probleme beginnen noch ein wenig später. Mein TreeView wird ja tadellos angezeigt. Nun habe ich den Typ der TreeViewCtrl-Variable ausgelesen und von VB als Antwort erhalten, dass es sich um mein eigenes Steuerelement handelt... Soweit so gut. Nun dachte ich mir, dass ich einfach eine weitere globale Variable anlegen, von genau diesem Typ und nachdem die Variable TreeViewCtrl einen Wert zugewiesen bekommen hat ich dann diesen Wert per: Code:
Set MyTree = TreeViewCtrl
Der globalen Variablen zuweise. Mache ich das so, so bekomme ich beim laden des AddIns in SolidWorks die Fehlermeldung, dass meine AddIn nicht korrekt geladen werden kann, da evtl. eine Zusatzanwendung oder Komponente fehle. Ich weiß mir da einfach nicht zu helfen, weil ich nicht herausfinde an welcher Stelle etwas schief gelaufen sein könnte.Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
VBSpawn Mitglied Programmierer
Beiträge: 514 Registriert: 23.08.2005 Sorgfältige Planung ersetzt niemals pures Glück.
|
erstellt am: 01. Sep. 2005 13:05 <-- editieren / zitieren --> Unities abgeben: Nur für mafu
Holla zusammen, Versucht es mal indem Ihr eine Klasse hinzufügt 'Class1 Private WithEvents tvTreeCtrl As MSComctlLib.TreeView Public Property Let xTree(mytree As MSComctlLib.TreeView) Set tvTreeCtrl = mytree End Property und anschliessend anstelle von: Set tvTreeCtrl = swFeatMgrTabTop.GetControl dies (Private myClass as new Class1) Set myClass.xTree = tvTreeCtrl BTW: unter vb6 Projekteigenschaften Nicht verwendete ActiveX Steuerelemente entfernen NICHT aktivieren ... Gruß Micha
------------------ Zitat: Interpunktion und Orthographie des Postings sind frei erfunden. Eine Übereinstimmung mit aktuellen oder ehemaligen Regeln wäre rein zufällig und ist nicht beabsichtigt.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |