Funcion LB

Aquí puedes preguntar o compartir tus dudas y conocimientos acerca del programa
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
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...
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.
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 :(
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
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
quiero ver quiero ver jejej, haber de que anda esto.
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
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
vamos a chekear el ejemplo tonces
Gracias amigo
vamos a verla a ver como funciona
Voy a echarle un ojo, a lo mejor hago algo raro por aquí xD
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.
gracias
gracias
gracias