unit randomfromalbums; interface uses sysutils,graphics; type tavail = record album : integer; track : integer; end; type TRandomCallback = function(c : integer) : boolean of object; procedure InitRandom; function AddAlbum(no : integer) : integer; function RemoveAlbum(no : integer) : integer; function makerandom(cb : TRandomCallback) : boolean; function getrandomtrackcount : integer; implementation uses main; var avail : array of tavail; trackcount : integer; function getrandomtrackcount : integer; begin result:=trackcount; end; procedure InitRandom; begin setlength(avail,0); trackcount:=0; end; function AddAlbum(no : integer) : integer; var n : integer; begin mainform.dalbumlist.itemindex:=no; mainform.dalbumlistChange(nil); for n:=0 to mainform.dtracklist.Items.Count-1 do begin inc(trackcount); setlength(avail,trackcount); avail[trackcount-1].album:=no; avail[trackcount-1].track:=n; end; result:=trackcount; end; procedure removeitem(i : integer); var n : integer; begin for n:=i to (trackcount-2) do begin avail[n]:=avail[n+1]; end; dec(trackcount); setlength(avail,trackcount); end; function RemoveAlbum(no : integer) : integer; var found : integer; n : integer; begin found:=-1; for n:=0 to trackcount-1 do begin if avail[n].album=no then begin found:=n; break; end; end; if found=-1 then begin result:=trackcount; exit; end; mainform.dalbumlist.itemindex:=no; mainform.dalbumlistChange(nil); for n:=0 to mainform.dtracklist.items.count-1 do begin removeitem(found); end; result:=trackcount; end; procedure swappos(a,b : integer); var c : tavail; begin c:=avail[a]; avail[a]:=avail[b]; avail[b]:=c; end; function makerandom(cb : TRandomCallback) : boolean; var n, i : integer; begin randomize; if trackcount=0 then begin result:=false; exit; end; dice1:=tbitmap.create; dice2:=tbitmap.create; dice3:=tbitmap.create; dice4:=tbitmap.create; dice1.LoadFromResourceName(hinstance,'DICE1'); dice2.LoadFromResourceName(hinstance,'DICE2'); dice3.LoadFromResourceName(hinstance,'DICE3'); dice4.LoadFromResourceName(hinstance,'DICE4'); mainform.numberoftracks.enabled:=false; mainform.clearlistclick(nil); for n:=0 to trackcount-1 do begin i:=random(trackcount-1); swappos(n,i); mainform.dalbumlist.itemindex:=avail[n].album; mainform.dalbumlistchange(nil); mainform.dtracklist.itemindex:=avail[n].track; mainform.AddClick(nil); if cb(n)=true then break; end; mainform.numberoftracks.enabled:=true; dice1.free; dice2.free; dice3.free; dice4.free; result:=true; end; end.