random fonksiyon uyarlama

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
guduknecmi
Üye
Mesajlar: 99
Kayıt: 08 Nis 2004 02:18
İletişim:

random fonksiyon uyarlama

Mesaj gönderen guduknecmi »

selamlar
mp3 programım bitti derken bir de baktım rastgele çalma sırasında genellikle aynı şarkılar çalıyor.
kullandığım kodlar

Kod: Tümünü seç

randomize;
listbox1.itemindex:=random(listbox1.count-1);   
biraz araştırınca viewtopic.php?t=2226&highlight=random burada Gkimirti Beye ait güzel bir kod buldum ama
kendi programıma uyarlayamadım.denemelerimden birisi:

Kod: Tümünü seç


  function DizideAra(val: Integer; d: array of Integer): Boolean; 
  var 
    i: Integer; 
  begin 
    result := False; 
    for i := 1 to listbox1.count do 
      if d[i] = val then 
      begin 
        result := True; 
        exit; 
      end 
  end; 

procedure Tform1.sirala;
var 
  d: array[1..50] of Integer; // buraya 50 yerine listbox1.count yazınca hata veriyor
  i, val: Integer; 
begin 
  for i := 1 to listbox1.count do 
    d[i] := 0; 

  for i := 1 to listbox1.count do 
  begin 
    repeat 
      val := Random(listbox1.count); 
      sleep(1); 
      if val = 0 then 
        continue; 
    until not DizideAra(val, d); 
    //diziye ekle 
    d[i] := val; 
  end; 
  //dizimiz tamamdır 

end; 
ilk kodun yerine

Kod: Tümünü seç

randomize;
sirala;  
diye yazıyorum ama sonuç aynı.bir çalan şarkının liste bitene kadar birdaha çalmaması için ne yapmam lazım. Yardımcı olursanız sevinirim...
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

orda dizi boyutları statik tanımlı sonradan degistirilecekse boyut belirtilmez
runtime setlength fonksiyonu ile boyut ayarlanır.
asagıdaki ornegi incele

Kod: Tümünü seç

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure sirala(aded: Integer; var liste: TStringList);
var
  d: array of Integer;
  i, val: Integer;

  function DizideAra(val: Integer; d: array of Integer): Boolean;
  var
    i, l: Integer;
  begin
    result := False;
    l := Length(d);
    for i := 1 to l do
      if d[i] = val then
      begin
        result := True;
        exit;
      end
  end;

begin
  SetLength(d, aded);
  for i := 1 to aded do
    d[i] := 0;

  for i := 0 to aded - 1 do
  begin
    repeat
      val := Random(aded);
      sleep(1);
      if val = 0 then
        continue;
    until not DizideAra(val, d);
    //diziye ekle
    d[i] := val;
    //listeye ekle
    liste.Add(IntToStr(val));
  end;
  //dizimiz tamamdır
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  liste: TStringList;
begin
  liste := TStringList.Create;
  sirala(50, liste);
  Memo1.Lines.Assign(liste);
  liste.Free;
end;

end.

ÜŞENME,ERTELEME,VAZGEÇME
nuc
Üye
Mesajlar: 7
Kayıt: 20 Mar 2004 11:49

Mesaj gönderen nuc »

TStringList tipinde Global bir değişken tanımlayın

Kod: Tümünü seç

var
  lst : TStringList;
Rastgele listelemeye başladığınız anda içini Listbox1 deki Item sayısı kadar doldurun

Kod: Tümünü seç

 for i:= 0 to ListBox1.Items.Count-1 do lst.Add(IntToStr(i));
Seçme işlemini lst üzerinden yapın

Kod: Tümünü seç

 randomize;
 nIndex := random(lst.count-1);
 ListBox1.ItemIndex := StrToInt(lst[nIndex]);
 lst.Delete(nIndex);
Cevapla