ciao ragazzi
ho una listbox con dentro degli elementi come posso farli mescolare?
con random?
ciao ragazzi
ho una listbox con dentro degli elementi come posso farli mescolare?
con random?
ti dico a memoria. Dovrebbe esserci una proprietà di TListBox che si chiama Items che è un TStrings.
Ti crei a run time una TStringList, derivata da TStrings ma di più semplice da tilizzare e la popoli con gli elementi di Items posizionati in maniera random (logicamente devi tenere conto delle celle che occupi).
Infini sovrascrivvi la proprietà Items con i nuovi elementi.
ciao
sergio
il problema sta nel non ripetere gli items con il random
la funzione random ti dovrà ritornare l'indice dove scrivere la stringa.
La via più veloce come programmazione ma non come prestazione è quella di verificare se in corrispondenza di questo indice sulla lista di appoggio esiste già una stringa, se questo fosse ripetere fino a che non si trova una posizione vuota.
Altrimenti puoi utilizzare una array di interi dove memorizzi gli indici già occupati.
ciao
sergio
Penso che una soluzione migliore, ma altrettanto semplice da realizzare sia la seguente:
Prima di tutto, come già si diceva, vanno copiati gli elementi dalla TListBox (L) in una TStringList (S).
A questo punto si esegue un ciclo I da 0 a (L.Count - 1) all'interno del quale verrà fatto:
- generazione numero casuale (X) compreso tra 0 e (S.Count - 1);
- copia dell'elemento X della TStringList all'elemento I della TListBox;
- rimozione (delete) dell'elemento X dalla TStringList.
Spero di non essermi scordato nulla.
Ciao io farei così:
come è stato precedentemente suggerito conviene lavorare su una TStringList già piena di elementi.
Poi si crea una procedura di mescolamento in cui all'interno di un ciclo si prendono due numeri a Random indicanti le rispettive posizioni e poi si effettua uno Swap (scambio) tra le due posizioni. Lo swap conviene essere una procedura esterna.
Questo procedimento effettua un certo numero (dipende dal numero di iterazioni) di mescolamenti nella lista. Più iterazioni si faranno e + mischiata sarà la lista.
Spero di averti aiutato
ciao ragazzi grazie per le soluzioni
girando avevo trovato questa bella procedura che va bene per la listbox
non mi uccidete adesso ... praticamente ho dovuto lasciare la listbox per una listview quindi dovrei mescolare quest'ultima.. secondo voi adattando questa procedura si può fare?Codice PHP:
procedure ShuffleStrings( sl : TStrings; nIntensity : integer );
var
n1, n2, n3 : integer;
s1 : string;
begin
if(0 = nIntensity)then
begin
nIntensity := sl.Count;
end else
if(nIntensity > sl.Count)then
begin
nIntensity := sl.Count;
end;
Randomize;
for n1 := 1 to nIntensity do
begin
n2 := Random( nIntensity );
n3 := Random( nIntensity );
s1 := sl.Strings[n3];
sl.Strings[n3] := sl.Strings[n2];
sl.Strings[n2] := s1;
end;
end;
Non mi sembra però che questa procedura faccia tutto quello che chiedevi, in particolare "non ripetere gli items con il random".girando avevo trovato questa bella procedura che va bene per la listbox
Certo, basta che in quel caso tieni conto anche dei subitems di ciascun item.non mi uccidete adesso ... praticamente ho dovuto lasciare la listbox per una listview quindi dovrei mescolare quest'ultima.. secondo voi adattando questa procedura si può fare?
lo sto trovando difficoltoso modificarlo
il tipo che riceve non dev'essere più TStrings?
Non direi. Gli items in una TListView sono memorizzati come TListItems, non come TStrings.il tipo che riceve non dev'essere più TStrings?