PropertyManagerPagina

Hoi allemaal

Een paar vragen over PropertyManagerPage, in VBA:

  1. Normaal gesproken worden besturingselementen weergegeven op de PropertyManager-pagina in de volgorde waarin ze zijn gedeclareerd. Behalve dat groepen blijkbaar voorrang hebben op controles zonder groep. Dit is een persoonlijke conclusie, ik heb geen enkele aanwijzing gevonden in de documentatie. Kan iemand dit bevestigen?

  2. Kunt u met de PropertyManagerPage API alle PropertyManagers reproduceren die u in solidworks ziet:

    2.1. In de Constraint PropertyManager worden pictogrammen weergegeven op de tabbladen. Ik ben er nog niet achter hoe ik hetzelfde kan doen in een PropertyManagerPage.

    2.2. In de Constraint PropertyManager staat er tekst achter de knoppen om de beperking te selecteren. Ik weet hoe ik deze knoppen moet maken, maar ik weet niet hoe ik er tekst achter moet zetten.

Le PropertyManager Contraintes

  1. Waar vindt u voorbeelden van het beheren van .Net-besturingselementen of ActiveX-besturingselementen in een
    PropertyManager-pagina? Dit zou de oplossing kunnen zijn voor mijn paragraaf 2.1. en 2.2.

Kortom, mijn PropertyManagerPage werkt, het gaat meer om bruikbaarheid dan om iets anders.

Bedankt

Benedictus

Hallo @binoyte ,

PropertyManagerPage, een uitgebreid onderwerp...
Hiermee kan een gebruikers/SW-interface worden geïntegreerd in de SW-omgeving, met standaard en gespecialiseerde componenten, allemaal met een Solidworks-look.

Met drie niveaus van containers: de pagina zelf, kaarten met tabbladen (PropertyManagerPageTab) en groepen (PropertyManagerPageGroup).
Elke container kan verschillende en gevarieerde besturingselementen ontvangen, vergelijkbaar met die van een UserForm (zoals Label, TextBox, Button, enz.), en andere gespecialiseerde besturingselementen (selectie van SW-objecten).

Maar het beheer van de positie van de bedieningselementen op de pagina is vrij eenvoudig.
Het probleem is dat Solidworks zelf de positie van de besturingselementen in de PropertyManager-pagina definieert, althans gedeeltelijk.
Laat het me uitleggen: aan het begin wordt er een tabbladkaart op de pagina gemaakt. Op deze kaart worden een knop (PropertyManagerPageButton) en een groep (PropertyManagerPageGroup) gemaakt, in deze volgorde. Logischerwijs zouden we verwachten dat de knop boven de groep zou worden geplaatst. In feite is het eronder geplaatst, bedankt SW.
Omdat SW voorrang geeft aan de groep(en), komen de knoppen na...

Het is ook onmogelijk om de positie van de bedieningselementen binnen dezelfde container nauwkeurig af te stellen.
Aangezien een label en een tekstvak in dezelfde groep zijn gedefinieerd, worden ze standaard onder elkaar geplaatst met slechts één inspringing, enkel of dubbel.

Deze beperking kan worden omzeild door het label (van het type PropertyManagerPageLabel) naar het type OLE-variant te casten en het tekstvak (van het type PropertyManagerPageTextBox) naar het type OLE-variant. De besturingselementen maken dus gebruik van de eigenschappen Boven en Links van hun " voorouders " (zoals PropertyManagerPageControl), waardoor ze hun posities in de container kunnen forceren.
image

Maar ook daar zijn er beperkingen, aangezien SW dit alles onder toezicht houdt: de eigenschap Links lijkt beperkt te zijn tot het interval [0... 100], waardoor het onmogelijk is om meerdere knoppen over de gehele breedte van de pagina te plaatsen.
Het is onmogelijk om de lijn te voltooien met 4 of 5 knoppen.

image

Wat betreft de pictogrammen voor de paginacomponenten, deze worden weergegeven door de methode SetPictureLabelByName die is gedefinieerd voor de besturingselementen. Nogmaals, u moet de componenten casten naar het type PropertyManagerPageControl of een neutraal type OLE-variant.
image

Om nog maar te zwijgen van een paar andere ellende...

1 like

Hallo;

Een voorbeeld is beschikbaar in de Solidworks Help:
https://help.solidworks.com/2024/english/api/sldworksapi/Create_PropertyManager_Page_Example_VB.htm
of een video van SolidXperts:

Bedankt voor je feedback @m_blt !

Voorlopig zal het gieten van objecten, ondanks hun beperking, me goed voldoen.

Aan de andere kant, afgezien van de standaard soorten vba, omdat Cstr ik niet echt weet hoe ik het moet doen. Set monControl = new Variant OLE ?

@Maclane ben ik bekend met de voorbeelden van online hulp. Zo ben ik begonnen. Maar als je goed kijkt, ondanks wat er bovenaan de pagina wordt gezegd, is er geen ActiveX-besturingselement. De regels worden becommentarieerd. En mijn onderzoek om verder te gaan liep vast.

Aan de andere kant ken ik de youtube-tutorial niet; Ik ga het zo snel mogelijk bekijken.

De cast wordt impliciet afgehandeld door VBA: een knop met de naam PrMgrButton " wijst " naar een besturingselement met de naam PrMgrControl door een eenvoudige toewijzing:

dim PrMgrButton as PropertManagerPageButton
dim PrMgrControl as PropertManagerPageControl

set PrMgrControl = PrMgrButton  ' Possible car le bouton est héritier du contrôle

Hetzelfde geldt voor een variant:

dim PrMgrButton as PropertManagerPageButton
dim vrtControl as variant

set vrtControl = PrMgrButton  ' Usage de "set" à valider...

impec! Ik was niet op de hoogte van deze techniek. Ik denk dat ik het weer in andere projecten kan gebruiken.

Het is een beetje HS, maar ik heb ook problemen met het late binden met het EdmVaultX object, ik kan geen EdmVault krijgen waar X op de juiste waarde staat, 5 in plaats van 21 of andersom weet ik niet meer. En ik was op zoek naar hoe ik het object naar de gewenste EdmVault-versie kon casten. Ik zal kijken of ik me kan aanpassen. Alleen in Late binding, en dit is de enige mogelijke keuze, bij het coderen voor SW task addin .

Hoe dan ook, anders heb ik nog een vraag: OLE-variant is het varianttype of iets anders?

In VBA is er maar één varianttype, ongeacht het object waarnaar wordt verwezen.

Afgaande op deze regel uit een VB.NET voorbeeld, is het gieten van EdmVaultX mogelijk tussen de opeenvolgende aanwijzingen...

  Dim CurrentVault As IEdmVault21 = TryCast(New EdmVault5(), IEdmVault21)

Hallo
In vb.net ja is het mogelijk, en ook in VBA, zolang je maar in het begin van de binding bent, dat wil zeggen, wanneer je de referenties in het project controleert. Je kunt schrijven:

Dim eVault As IEdmVault21
Set eVault = New EdmVault5

En je krijgt een object IEdmVault21/IEdmVault21 (naar mijn mening is er een fout, we hadden moeten hebben IEdmVault5/IEdmVault21):
{A14B1B02-D76A-4F55-B7E7-B78398D569C4}

Behalve dat wanneer u een solidworks-taak codeert (SolidWorks Tasks-invoegtoepassing), u de verwijzingen niet kunt controleren. Daarom moet u het object in late binding maken:

Dim eVault As Object 'Futur objet EdmVault21
Set eVault = CreateObject("ConisioLib.EdmVault.1")

In tegenstelling tot wat men zou denken, is het getal aan het einde niet de index van het object. Ik verkrijg zo een object van het type Object/IEdmVault21.
{6E1FDD15-2E19-415C-B404-D1BB7F4D4330}

En de twee zijn niet gelijkwaardig. Als ik dan schrijf:

Dim eFile As Object  'Futur objet IEdmFile6
Set eFile = eVault.GetFileFromPath(sFichier)

Ik krijg een foutmelding 13: mismatch type. Het gaat echter vanzelf in de vroege binding. En het is begrijpelijk, de methode GetFileFromPath is lid van IEdmVault5.

En daar om te gieten, in late binding, nou ik weet niet hoe ik het moet doen