Item Position in Combobox

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Maggus
****
Beiträge: 108
Registriert: Mo, 01.08.2005 13:32
Kontaktdaten:

Item Position in Combobox

Beitrag von Maggus »

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

Gruß,
Maggus (:o)
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Item Position in Combobox

Beitrag von DPunch »

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.
Maggus
****
Beiträge: 108
Registriert: Mo, 01.08.2005 13:32
Kontaktdaten:

Re: Item Position in Combobox

Beitrag von Maggus »

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
Maggus (:o)
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Item Position in Combobox

Beitrag von DPunch »

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.
DerJJ
Beiträge: 4
Registriert: Do, 10.02.2011 11:54

Re: Item Position in Combobox

Beitrag von DerJJ »

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.
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Item Position in Combobox

Beitrag von DPunch »

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.
DerJJ
Beiträge: 4
Registriert: Do, 10.02.2011 11:54

Re: Item Position in Combobox

Beitrag von DerJJ »

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
Maggus
****
Beiträge: 108
Registriert: Mo, 01.08.2005 13:32
Kontaktdaten:

Re: Item Position in Combobox

Beitrag von Maggus »

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ß,
Maggus (:o)
Antworten