[Frage] SmartParts Liste [Gelöst]

Schlagworte:
  • SmartPart
  • Dialog
  • Eingabe

Hallo.

Ich habe eine Palette für meinen Smartpart erstellt, in der ich gerne eine Liste erzeugen würde. Ich wollte das mit I_INFIELD_3 lösen, da dieser Befehl (anscheinend) über eine list view control verfügt.
Mein Ziel wäre eine Liste, aus der ich ein Element wählen kann. Je nach gewähltem Element soll sich die weitere Eingabe ändern.

---------------

I_ROW `MyList` , 1
I_INFIELD_3 cur ,
clsz , row * rowsz , ctlw , rowsz * 10 ,
1 , "" , 2 , 2 ,
rowsz , rowsz , rowsz - 2 , rowsz - 2 ,
19093 , `Typ 1` , 1 ,
19095 , `Typ 2` , 2
row = row + 1
I_ROW_END

---------------

Mit dem oben angeführten Skript werden die Elemente aber horizontal gereiht und nicht vertikal! (siehe Bild)

Wie kann ich hier vorgehen bzw. was mache ich falsch?

Anhänge (1)

Typ: image/png
99-mal heruntergeladen
Größe: 2,08 KiB

Lösung anzeigen Lösung verbergen

Die Werte für die Zellenbreite einfach erhöhen:

I_ROW `MyList` , 1
I_INFIELD_3 cur ,
clsz , row * rowsz , ctlw , rowsz * 2 ,
1 , "" , 2 , 2 ,
200 , rowsz , 198 , rowsz - 2 ,
19093 , "Typ 1" , 1 ,
19095 , "Typ 2" , 2
row = row + 1
I_ROW_END

Die Elemente werden in dem ListControl mit einem Wrap-Panel angeordnet.

1 - 10 (15)

Die Werte für die Zellenbreite einfach erhöhen:

I_ROW `MyList` , 1
I_INFIELD_3 cur ,
clsz , row * rowsz , ctlw , rowsz * 2 ,
1 , "" , 2 , 2 ,
200 , rowsz , 198 , rowsz - 2 ,
19093 , "Typ 1" , 1 ,
19095 , "Typ 2" , 2
row = row + 1
I_ROW_END

Die Elemente werden in dem ListControl mit einem Wrap-Panel angeordnet.

Super!

Danke für die Hilfe, jetzt funktioniert es.
Wäre es theoretisch noch Möglich das Bild und den Text darzustellen?
Bildnummer 19093 und "Typ 1"

Anhänge (1)

Typ: image/png
100-mal heruntergeladen
Größe: 2,12 KiB

..tja, leider gehört zu der Implementierung als Wrap-Panel auch, dass der Text immter unterhalb des Bildes angeordnet wird.
Dazu muss die Zellhöhe natürlich Bildgröße + Texthöhe umfassen.

...also wird man um die horizontale Anordnung nicht drum rum kommen.
Finde ich jetzt aber auch nicht schlimm, gerade wenn es "kleine Bilder sind", spart das Platz.

Ansonsten sollte man über eine ComboBox nachdenken!
Multiselect geht bei diesen Controls sowieso nicht!

Anhänge (2)

Typ: image/png
134-mal heruntergeladen
Größe: 62,09 KiB
Typ: image/png
131-mal heruntergeladen
Größe: 73,25 KiB

Einmal muss ich noch nachhaken.

wie gehe ich damit um, wenn ich die Anzahl der Möglichen Felder variabel gestalten will?
Ich habe das mit einem Parameter Buffer probiert

FOR i = 1 TO cnt
PUT 19091 + i * 2 , "Typ " + STR ( i , 1 , 0 ) , i
NEXT i

I_INFIELD_3 cur ,
clsz , row * rowsz , ctlw , rowsz * 5 ,
1 , "" , 2 , 2 ,
2 * rowsz , 2 * rowsz , rowsz , rowsz ,
GET ( NUM_SP )

aber da ich Strings ja nicht in den Buffer geben kann, hat das ganze leider nicht funktioniert...

Muss ich also bei I_INFIELD_3 immer schon VOR dem Ausführen wissen, wie viele Elemente ich darstellen möchte?

Wenn man "zur Laufzeit" eine unterschiedliche Anzahl von Werten mit Bild in der Liste/Combobox darstellen will, geht das derzeit nicht!
Dazu muss man leider vor der Ausführung des Scriptes das statisch im Script mit der o.g. Methode von I_INFIELD_3 definieren.

Dynamisch wird das mit den Bild ab Resource-Nummer 19133 schwierig, da dann nicht mehr die Zahl mit Kreis kommt!
Man kann also mit 19091 + i * 2 sowieso nur 20 Typen abbilden!

Und dafür könnte man noch für jede Anzahl eine SWITCH CASE Weiche bauen
SWITCH

CASE 1
I_ROW `MyList` , 1
I_INFIELD_3 cur ,
clsz , row * rowsz , ctlw , rowsz * 2 ,
1 , "" , 2 , 2 ,
2*rowsz, 2*rowsz , 2*rowsz - 2 , 2*rowsz - 2 ,
19093 , "Typ 1" , 1
BREAK

CASE 2
I_ROW `MyList` , 1
I_INFIELD_3 cur ,
clsz , row * rowsz , ctlw , rowsz * 2 ,
1 , "" , 2 , 2 ,
2*rowsz, 2*rowsz , 2*rowsz - 2 , 2*rowsz - 2 ,
19093 , "Typ 1" , 1 ,
19095 , "Typ 2" , 2

BREAK

...

SWITCH_END

Wenn es ohne Bild auch geht, kann man das Ganze eleganter in einer Combobox lösen.
Dazu braucht man nur die entspr. Werte im Parameter-Script els Enumeration definieren:
VALUES_E "cur" 1 , "Typ 1" , 2 , "Typ 2"
VALUES_E "cur" 3 , "Typ 3"
VALUES_E "cur" 4 , "Typ 4"

Im Dialog-Script wird dann in der I_INFIELD-Combo-Box Text "Typ XX" statt des Wertes angezeigt:
I_ROW `MyList` , 1
I_INFIELD "cur" , clsz , row * rowsz , ctlw , rowsz
row = row + 1
I_ROW_END

Achtung: VALUES_E gibt es erst ab Version 3.0 (Allplan 2018)

Anhänge (1)

Typ: image/png
92-mal heruntergeladen
Größe: 65,43 KiB

Der Trick mit VALUES_E war mir schon bekannt ich wollte nur eine variable Liste generieren..
Schade, dass das noch nicht geht aber danke für die Antwort!

Heißt "derzeit", dass das eventuell in Zukunft mal integriert wird?

Wenn man "zur Laufzeit" eine unterschiedliche Anzahl von Werten mit Bild in der Liste/Combobox darstellen will, geht das derzeit nicht!

...naja, wenn Du der einzige bist, der das "braucht", wird's wohl eher nichts!

Derzeit wird bei Allplan die komplette Entwicklungs-Kapazität für die PythonParts und VisualSripting "verbraten".
Hinsichtlich GUI können diese PyP's nicht mal "dynamische" Dialoge :-)

Ein einfach Möglichkeit, das in den SmartParts zu implementieren wäre, die Werte in ein Array zu legen,
und dann die Werte statt mit GET(num_sp) aus dem Array zu lesen.
In einem Array dürfen numerische und String-Werte gemischt werden.

In dieser Art funktionert jetzt schon das automatische Lesen von Array-Werten bei VALUES.
Dort wird das Array automatisch in eine Werte-Liste expandiert.

Alternativ könnte man PUT/USE/GET so erweitern, dass neben numerischen auch String-Werte benutzt werden können.

Schade!

Ja ich finde auch, dass die GUI mit SmartParts ein wenig anwenderfreundlicher gestaltbar ist als mit PythonParts... am Besten wären wohl WPF-C#-Parts!
Danke für den Tipp mit dem Array aber auch hier muss ich ja vor dem kompilieren schon wissen, wie groß dieser Array ist bzw. sein kann.

Ich habe mich jetzt für eine Lösung mit VALUES_E entschieden, und setze einfach vor das Eingabefeld ein PICT. Ist zwar nicht ganz das was ich wollte aber ich kann damit leben.

Wie immer danke für die Hilfe/Auskunft!

I_ROW `wählen` , 0
I_PICT id , clsz , row * rowsz , 16 , 16
I_INFIELD "cur" , clsz , row * rowsz , ctlw , rowsz , 7
I_ROW_END
row = row + 1

Ein Array kann im Gegensatz zu allen anderen Sprachen (ausser VBS) im SmartPart dynamisch und gemischt sein:

DIM arr[] !dynamisch eindimensional
arr[1]= 1
arr[2]= "text"
arr[3]= 3.2

Beim Ablegen einer Wertes in das dynamische Array wird dieses automatisch vergrößert, wenn es sein muss!
Also Vorsicht bei

arr[32768]= "zu gross"

1 - 10 (15)