Verificar e não repetir itens no combobox

Bom dia Senhores,

   Tenho uma duvida sobre combobox, não consigo criar a lista de itens utilizando a função "Click" dele mesmo, somente consigo criar os itens com a função "OnStartRunning" utilizando o comando "AddItem".

A minha necessidade é a seguinte, por exemplo: tenho

3 combobox .
 E uma lista de 5 itens iguais para os 3 combobox: AddItem "1",AddItem "2",AddItem "3",AddItem "4",AddItem "5".

Preciso que quando o combobox 1 selecionar o Item “1”, esse itenm não deve parecer mais no combobox 2 e 3.

Obrigado pela ajuda.

Você pode concentrar seus scripts todos no ComboBox1.

No OnStartRunning, crie o seguinte script:

Sub ComboBox1_OnStartRunning()
	Dim i
	Dim cbox
	Dim list
	
	Set list = CreateObject("System.Collections.ArrayList")
	
	list.Add Screen.Item("ComboBox1")
	list.Add Screen.Item("ComboBox2")
	list.Add Screen.Item("ComboBox3")
	
	For Each cbox In list
		For i = 1 To 5
			cbox.AddItem CStr( i )
		Next
	Next	
End Sub

E no evento Change, o seguinte:

Sub ComboBox1_Change()
	Dim i
	Dim cbox
	Dim list
	
	Set list = CreateObject("System.Collections.ArrayList")
	
	list.Add Screen.Item("ComboBox2")
	list.Add Screen.Item("ComboBox3")
	
	For Each cbox In list
		cbox.Clear
		For i = 1 To 5
			If ( Value <> CStr( i ) ) Then cbox.AddItem CStr( i )
		Next
	Next	
End Sub
1 Like

Alexandre,

Pelo o que eu entendi, você quer remover o item selecionado em um ComboBox dos demais. Se for isso, você pode usar o método RemoveItem e a propriedade ListIndex no evento Change ou Click de cada ComboBox. por exemplo:

Sub ComboBox1_Change()
	Screen.Item("ComboBox2").RemoveItem(ListIndex)
	Screen.Item("ComboBox3").RemoveItem(ListIndex)
End Sub

Não é possível dessa forma, ao escolher o Item “1” (Index 0), por exemplo, os ComboBox 2 e 3 serão indexados do 0 ao 3, assim, quando vc clicar no Item “5” do Combox1 irá ocorrer um erro, pois ele irá tentar remover o Index 4.

1 Like

Tens razão, Leandro!

Obrigado pela ajuda pessoal,

  E interessante a sua solução Leandro, porem como você comentou a script 

fica concentrado no combobox1, e quando a seleção começa no combobox3 não atualiza os outros(claro por não ter nenhum script). Tentei replicar o seu script do “change” mas ainda não deu certo, estou testando aqui. mas ja agradeço ajuda.

Alexandre,

Veja se desta forma satisfaz a sua necessidade:

Sub ComboBox1_Change()

	set cbox2 = Screen.Item("ComboBox2")
	set cbox3 = Screen.Item("ComboBox3")
	
	for i = 0 to cbox2.ListCount-1
		if cbox2.List(i) = Value then
			cbox2.RemoveItem(i)
			exit for
		end if
	next
	
	for i = 0 to cbox3.ListCount-1
		if cbox3.List(i) = Value then
			cbox3.RemoveItem(i)
			exit for
		end if
	next

End Sub

Depois é só copiar esse script para os outros comboboxes adaptando as duas primeiras linhas.

Boa Tarde Paulo,

   A questão de quando eu seleciono por exemplo o valor "1" no combobox1 

nos outros não aparece, porem após eu selecionar o valor 1 eu seleciono o valor 2 e nos combobox2 e 3 não volta a aparecer o valor “1”, estou tentando solucionar aqui.

Entendi, Alexandre. Nesse caso você pode guardar em Tags Internos os valores selecionados em cada ComboBox, para adicioná-los novamente quando eles forem alterados. Por exemplo:

Sub ComboBox1_Change()
	
	set cbox2 = Screen.Item("ComboBox2")
	set cbox3 = Screen.Item("ComboBox3")
	set tag = Application.Item("TagInterno1")
	
	for i = 0 to cbox2.ListCount-1
		if cbox2.List(i) = Value then
			cbox2.RemoveItem(i)
			exit for
		end if
	next
	
	for i = 0 to cbox3.ListCount-1
		if cbox3.List(i) = Value then
			cbox3.RemoveItem(i)
			exit for
		end if
	next
	
	if tag.Value <> "" then
		cbox2.AddItem tag.Value
		cbox3.AddItem tag.Value
	end if
	
	tag.Value = Value
	
End Sub

Basta copiar o script para cada ComboBox e ajustar as três primeiras linhas. Se os valores forem do tipo String, os Tags Internos tem que ser do tipo String também, com valor inicial vazio.