Página 1 de 1

Funcion LB

Publicado: 09 Ene 2011 13:59
por rafaxplayer
Buenas compañero , tengo unproblema con una funcion que quiero hacer en un listbox.
La función debe alterar el orden del items del listbox aleatoria mente cada vez , el script que tengo es este pero no funciona como esperaba , haber si me ilumináis con alguna idea nueva .;)
function LBAltered_Order(sLBName)
local tblText={}
local tblData={}
local nCount = ListBox.GetCount(sLBName)
	if (nCount > 0) then
		for s=1,nCount do
		Table.Insert(tblText,s,ListBox.GetItemText(sLBName, s))
		Table.Insert(tblData,s,ListBox.GetItemData(sLBName, s))
		end
		ListBox.DeleteItem(sLBName,LB_ALLITEMS)
		n=1
		repeat
			x = Math.Random(1,nCount)
			if  x ~= n then
				ListBox.InsertItem(sLBName,n,tblText[x],tblData[x]);
				n=n+1
				if n > nCount then
					n=1;
				end
			end
		until ListBox.GetCount(sLBName)<nCount
			
	end
end

Re: Funcion LB

Publicado: 09 Ene 2011 16:21
por carsonzillo
A ver si con este ejemplo te sirve para el tema de la aleatoriedad:

Código: Seleccionar todo

hxxp://www.mediafire.com/?6lu07gh9ofhiqur
Sustituye la xx por tt

Ya me diras si es lo que buscas...

Re: Funcion LB

Publicado: 09 Ene 2011 17:02
por rafaxplayer
Gracias , calzoncillo ( tiene huevos el nombrecito XD) este ejemplo ya lo vi pero no es muy aplicable a lo mio (solo en parte) , la cosa no parece complicada utilizando math.random y demás pero el tema esta en que no se repitan los valores con esta función o por lo menos no se añadan repetidos al listbox y ahí surgen los problemas... al aplicar los filtros para esto.

Re: Funcion LB

Publicado: 09 Ene 2011 18:23
por carsonzillo
Vaya pos no se aparentemente no se repite en el ejemplo, lo malo es que las mates no es lo mio si supiera te ayudaria :(

Re: Funcion LB

Publicado: 09 Ene 2011 18:27
por Pabloko
function sorter(v1,v2)
rnd = Math.Random(1, 2);
if (rnd==1)then
        return true;
    else
        return false;
    end
end


Debug.ShowWindow(true);
MyTable = {"Hockey","Baseball","Football", "Soccer"};
Table.Sort(MyTable, sorter);
for x,y in pairs(MyTable) do
    Debug.Print(y.."\r\n");
end

Re: Funcion LB

Publicado: 10 Ene 2011 00:51
por rafaxplayer
Bueno parece que ya saque la función , parece que va bien lo que da error cada ciertas ejecuciones de la misma en la linea de ListBox.Find.Item , no estoy a 100% que no se a cuestión de esta función en si o de mi código , echarle un vistazo haber si veis alguna solución ;)

Codigo:
function LBAltered_Order(sLBName)

	function sorter(v1,v2)
		rnd = Math.Random(1, 2);
		if (rnd==1)then
        	return true;
    	else
        	return false;
    	end
	end
	
local tblText={}
local tblData={}
local nCount;
local nRes;
nCount = ListBox.GetCount(sLBName)
if nCount > 0 then
	for s=1,nCount do
		Table.Insert(tblText, s, ListBox.GetItemText(sLBName, s))
	end
		Table.Sort(tblText,sorter)
		for i = 1,nCount do
			nRes = ListBox.FindItem(sLBName,LB_ALLITEMS, LB_BYTEXT, tblText[i]);	
			if nRes ~= -1 then
				Table.Insert(tblData,i,ListBox.GetItemData(sLBName,nRes))
			end
		end
			
		ListBox.DeleteItem(sLBName,LB_ALLITEMS)
		for x =1,nCount do
		txt=txt..""..tblText[x].." = "..tblData[x].."\r\n"
		ListBox.AddItem(sLBName,tblText[x],tblData[x])
		end
		
	end
end


Aqui el ejemplo con la funcion:

HIDE: ON
Hidebb Message Hidden Description

Re: Funcion LB

Publicado: 10 Ene 2011 02:26
por Agotaras123
quiero ver quiero ver jejej, haber de que anda esto.

Re: Funcion LB

Publicado: 10 Ene 2011 11:23
por rafaxplayer
Arreglado, he simplificado la función en varias lineas menos y sin Find.item , ahora va fino
function LBChangue_Order(sLBName)

	function sorter(v1,v2)
		rnd = Math.Random(1, 2);
		if (rnd==1)then
        	return true;
    	else
        	return false;
    	end
	end	
tblOut={}
nCount = ListBox.GetCount(sLBName)
for n =1,nCount do
	local strText= ListBox.GetItemText(sLBName, n);
	local strData= ListBox.GetItemData(sLBName, n);
	tblOut[strText]={data=strData}
end
	Table.Sort(tblOut,sorter)
	ListBox.DeleteItem(sLBName,LB_ALLITEMS)
	for i,v in pairs (tblOut) do
		ListBox.AddItem(sLBName,i,tblOut[i]["data"])
	end
end
Esta función le meteré algunas opciones mas de Ordenar items y la pondremos en el próximo includes de los packs de Ceone , un saludo

Re: Funcion LB

Publicado: 10 Ene 2011 13:28
por Pabloko
saca la funcion sorter de la funcion, dejarla dentro da problemas y cargas la memoria con la redefinición, debes ponerla en funciones globales y ademas te aconsejo que la llames sorter_rand() para que no te haga conflicto con otras cosas, por lo demas lo veo correcto

Re: Funcion LB

Publicado: 20 Ene 2011 17:29
por minkoxvr
vamos a chekear el ejemplo tonces

Re: Funcion LB

Publicado: 23 Ene 2011 03:17
por noureddine
Gracias amigo

Re: Funcion LB

Publicado: 31 Ene 2011 21:14
por warlock
vamos a verla a ver como funciona

Re: Funcion LB

Publicado: 01 Feb 2011 10:37
por Daniel_Lechu
Voy a echarle un ojo, a lo mejor hago algo raro por aquí xD

Re: Funcion LB

Publicado: 01 Feb 2011 11:21
por Daniel_Lechu
Ya está, he hecho algo raro :P

He usado una funcion random que he hecho que saca números aleatorios sin repetirlos o repetidos, eso depende de ti :lol: y la he usado para mezclar los items:

Esto serían las funciones globales:
function random_number(inicio, fin, cantidad, repetir)
	if repetir == nil then repetir = true; end
	local encontrado = false
	local lista_numeros = {}
	while Table.Count(lista_numeros) < cantidad do
		local encontrado = false
		local numrand = Math.Random(inicio, fin);
		for j, k in pairs(lista_numeros) do
			if numrand == k then encontrado = true; end
		end
		if repetir == true or encontrado == false then 
			lista_numeros[Table.Count(lista_numeros)+1] = numrand; 
		end
	end
	return lista_numeros
end

function LBAltered_Order(sLBName)
	local datos_listbox = {item = {}, data = {}}
	for j = 1, ListBox.GetCount(sLBName) do
		datos_listbox.item[j] = ListBox.GetItemText(sLBName, j)
		datos_listbox.data[j] = ListBox.GetItemData(sLBName, j)
	end
	local num_aleatorio = random_number(1, Table.Count(datos_listbox.item), Table.Count(datos_listbox.item), false)
	
	ListBox.DeleteItem(sLBName, -1);
	local texto = ""
	
	for j,k in pairs(num_aleatorio) do
		ListBox.AddItem(sLBName, datos_listbox.item[k], datos_listbox.data[k]);
		texto = texto..datos_listbox.item[k].." = "..datos_listbox.data[k].."\n";
	end
	Paragraph.SetText("Paragraph1", texto);
end
La función random_number() que es la que he hecho permite sacar la cantidad de números que quieras entre un rango y sin repetirlos, he probado con 1000 números sin repetir y tarda como 9 segundos, sin embargo con 100 tarda mucho menos de 1 segundo y con 5 que son la listbox ni te cuento...
He hecho pruebas con 1000 repitiéndolos y tarda poco más de 1 seg.

La función hay que mejorarla poniendo comprobadores, ya que si pones que te saque 10 numeros entre 1 y 5 sin repetir pues se queda colgado.

Re: Funcion LB

Publicado: 23 Dic 2011 12:47
por bumbo
gracias

Re: Funcion LB

Publicado: 18 May 2017 22:20
por omegacjfenix
gracias

Re: Funcion LB

Publicado: 19 May 2017 16:35
por kantigo
gracias