Gruß,
Item Position in Combobox
Moderator: Moderatoren
Item Position in Combobox
Kann mir mal bitte jemand erklären, warum man bei Comboboxen nicht die Position des selektierten Items bestimmen kann?
Gruß,
Gruß,
Maggus (:o)
Re: Item Position in Combobox
Aloha
Als Workaround kannst Du den selektierten Text / Wert im Array aller Items suchen und, wenn vorhanden, die Position dort nehmen - ergibt das gleiche wie die SelectedItemPos in einem Listenfeld.
Vermutlich, weil eine Combobox auch neue Eingaben erlaubt, und diese selbstverständlich keine Position haben.Maggus hat geschrieben:Kann mir mal bitte jemand erklären, warum man bei Comboboxen nicht die Position des selektierten Items bestimmen kann?
Als Workaround kannst Du den selektierten Text / Wert im Array aller Items suchen und, wenn vorhanden, die Position dort nehmen - ergibt das gleiche wie die SelectedItemPos in einem Listenfeld.
Re: Item Position in Combobox
Hi DPunch
So ähnlich hätte ich auch vermutet, aber wär das nicht trotzdem möglich, und wenn ein neuer Text eingegeben wurde, dann würde man halt "" als Wert zurückbekommen, oder so... naja egal.
Was ich auch überlegt habe, dass ich beim Befüllen der Combobox die Position am Ende als Text mitgebe: "Comboboxtexteintrag (437)" etwa. Da würde das Ermitteln der Position wohl schneller gehen.
Ich hab mich jetzt vorerst für Listboxen entschieden und werde das ggf. später umbauen...
LG
So ähnlich hätte ich auch vermutet, aber wär das nicht trotzdem möglich, und wenn ein neuer Text eingegeben wurde, dann würde man halt "" als Wert zurückbekommen, oder so... naja egal.
Ja, aber dafür müsste ich ja eine Schleife machen. Meine Comboboxen sind aber gut gefüllt, was wahrscheinlich zu lange dauern dürfte.DPunch hat geschrieben: Als Workaround kannst Du den selektierten Text / Wert im Array aller Items suchen und, wenn vorhanden, die Position dort nehmen - ergibt das gleiche wie die SelectedItemPos in einem Listenfeld.
Was ich auch überlegt habe, dass ich beim Befüllen der Combobox die Position am Ende als Text mitgebe: "Comboboxtexteintrag (437)" etwa. Da würde das Ermitteln der Position wohl schneller gehen.
Ich hab mich jetzt vorerst für Listboxen entschieden und werde das ggf. später umbauen...
LG
Maggus (:o)
Re: Item Position in Combobox
Das geht so schnell, dass Du davon nichts mitkriegen dürftest.Maggus hat geschrieben:Ja, aber dafür müsste ich ja eine Schleife machen. Meine Comboboxen sind aber gut gefüllt, was wahrscheinlich zu lange dauern dürfte.
Die in der "Tools"-Bibliothek mitgelieferte Funktion "IndexInArray" sollte genau Deinen Ansprüchen genügen.
Re: Item Position in Combobox
Code: Alles auswählen
Sub getSelectedItemPos_combobox
t1 = getsystemticks() ' um Ausfuehrungsdauer zu messen
oComSet = oDialDokErst.getControl("ComboSetting") 'die Combobox um die es geht
iItemNumber = -1 ' iItemNumber wird mit -1 initialisiert
iListCount = ubound(oComSet.Model.StringItemList) 'Anzahl der Elemente der Combobox
for i=0 to iListCount 'Schleife ueber die Elemente der Combobox
if oComSet.text = oComSet.Model.StringItemList(i) then
iItemNumber = i 'Falls der Text in der Combobox dem i-ten Element entspricht ist i die die Position des Elements
exit for
end if
next
t2 = getsystemticks()
if iItemNumber = -1 Then 'Falls iItemNumber noch -1 ist, also kein uebereinstimmendes Element in der Schleife gefunden wurde
msgbox("Item """ + oComSet.text + """ nicht in Liste")
Else
msgbox("Item """ + oComSet.text + """ hat Nr. " + iItemNumber)
End If
msgbox("Dauer: " & t2-t1 & " ms und Ende")
REM Was ist ein Tick?
t1 = getsystemticks()
wait(1000)
t2 = getsystemticks()
msgbox("1 Tick ist ungefaehr " & (t2-t1)/1000 & " ms")
REM 1 Tick ist ca. 1 ms
End SubiItemNumber ist -1 falls kein Listeneintrag gewählt wurde
iItemNumber entspricht der Position des gewählten Listeneintrags falls einer der Text in der Combobox einem Listeneintrag entspricht.
Re: Item Position in Combobox
Abgesehen vielleicht vom eventuellen Lerneffekt ist es überflüssig, das Ganze selber zu schreiben, einfach
Ausserdem kann ich nur dringend davon abraten, allgemein bei mehrmaliger Verwendung, aber vor allem in Schleifen (!), Obekt- und Arrayattribute jedes Mal wieder neu über das "Mutter"-Objekt zu referenzieren
Du lässt Dir in diesem Fall z.B. jedes Mal neu das Model-Objekt und dann das String-Array übergeben.
Je größer dabei das StringItemList-Array, desto schlechter ist dieser Weg, weil das zu übergebende Objekt a) immer größer wird und b) immer öfter übergeben wird.
Code: Alles auswählen
Globalscope.BasicLibraries.loadLibrary("Tools")
nSelectedItemPos = IndexInArray(meineCombobox.Text,meineCombobox.Model.StringItemList)Code: Alles auswählen
iListCount = ubound(oComSet.Model.StringItemList) 'Anzahl der Elemente der Combobox
for i=0 to iListCount 'Schleife ueber die Elemente der Combobox
'#####
if oComSet.text = oComSet.Model.StringItemList(i) then '##### no-go #####
'#####
iItemNumber = i 'Falls der Text in der Combobox dem i-ten Element entspricht ist i die die Position des Elements
exit for
end if
nextJe größer dabei das StringItemList-Array, desto schlechter ist dieser Weg, weil das zu übergebende Objekt a) immer größer wird und b) immer öfter übergeben wird.
Re: Item Position in Combobox
Stimmt. Ohne das ist das Script um den Faktor 10 schneller. Danke für den HinweisAusserdem kann ich nur dringend davon abraten, allgemein bei mehrmaliger Verwendung, aber vor allem in Schleifen (!), Obekt- und Arrayattribute jedes Mal wieder neu über das "Mutter"-Objekt zu referenzieren
Ist auch sehr praktisch. Nochmals danke für den HinweisGlobalscope.BasicLibraries.loadLibrary("Tools")
Re: Item Position in Combobox
Hallo Zusammen,
Das mit der IndexInArray Funktion werde ich ausprobieren, vielen Dank DPunch!
Gruß,
So gut hätte ich das nicht ausdrücken können, aber genau da lagen meine Bedenken, mit der Dauer der Schleife.DPunch hat geschrieben:Ausserdem kann ich nur dringend davon abraten, allgemein bei mehrmaliger Verwendung, aber vor allem in Schleifen (!), Obekt- und Arrayattribute jedes Mal wieder neu über das "Mutter"-Objekt zu referenzieren
Das mit der IndexInArray Funktion werde ich ausprobieren, vielen Dank DPunch!
Gruß,
Maggus (:o)