Item Position in Combobox

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Item Position in Combobox

Re: Item Position in Combobox

von Maggus » Mi, 25.05.2011 21:12

Hallo Zusammen,
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
So gut hätte ich das nicht ausdrücken können, aber genau da lagen meine Bedenken, mit der Dauer der Schleife.

Das mit der IndexInArray Funktion werde ich ausprobieren, vielen Dank DPunch! :)

Gruß,

Re: Item Position in Combobox

von DerJJ » Mi, 25.05.2011 20:57

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
Stimmt. Ohne das ist das Script um den Faktor 10 schneller. Danke für den Hinweis
Globalscope.BasicLibraries.loadLibrary("Tools")
Ist auch sehr praktisch. Nochmals danke für den Hinweis

Re: Item Position in Combobox

von DPunch » Mi, 25.05.2011 16:00

Abgesehen vielleicht vom eventuellen Lerneffekt ist es überflüssig, das Ganze selber zu schreiben, einfach

Code: Alles auswählen

Globalscope.BasicLibraries.loadLibrary("Tools")
nSelectedItemPos = IndexInArray(meineCombobox.Text,meineCombobox.Model.StringItemList)
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

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
   next
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.

Re: Item Position in Combobox

von DerJJ » Mi, 25.05.2011 15:11

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 Sub
Ich weiß nicht ob mit der Zeitmessung was anzufangen ist, aber:
iItemNumber 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

von DPunch » Mi, 25.05.2011 14:49

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.
Das geht so schnell, dass Du davon nichts mitkriegen dürftest.

Die in der "Tools"-Bibliothek mitgelieferte Funktion "IndexInArray" sollte genau Deinen Ansprüchen genügen.

Re: Item Position in Combobox

von Maggus » Mi, 25.05.2011 14:37

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.
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.
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.

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

Re: Item Position in Combobox

von DPunch » Mi, 25.05.2011 14:11

Aloha
Maggus hat geschrieben:Kann mir mal bitte jemand erklären, warum man bei Comboboxen nicht die Position des selektierten Items bestimmen kann?
Vermutlich, weil eine Combobox auch neue Eingaben erlaubt, und diese selbstverständlich keine Position haben.

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.

Item Position in Combobox

von Maggus » Mi, 25.05.2011 13:12

Kann mir mal bitte jemand erklären, warum man bei Comboboxen nicht die Position des selektierten Items bestimmen kann? :?

Gruß,

Nach oben