Поиск рандомного файла из папки. Делфи
Нужно выбрать рандомную песню из папки, как это можно осуществить?
Unit Game;
Interface
Uses
Player,
PlaylistData,
Winapi.Windows,
Winapi.Messages,
System.SysUtils,
System.Variants,
System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
Vcl.StdCtrls,
Vcl.Imaging.pngimage,
Vcl.ExtCtrls, Vcl.MPlayer;
Type
TfmGame = class(TForm)
bbBack: TButton;
lbLives: TLabel;
lbPoints: TLabel;
bbStartGame: TButton;
edText: TEdit;
lbTimer: TLabel;
imBackground: TImage;
imBackground1: TImage;
bbAnswer: TButton;
lbPlayerName: TLabel;
edPlayerName: TEdit;
mpMediaPlayer: TMediaPlayer;
procedure bbBackClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure bbStartGameClick(Sender: TObject);
procedure UpdateLabels();
procedure PlayRandomSong();
function GetPosOfDigit(const str: string) : integer;
procedure bbAnswerClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Const
SONGDIRECTORY = 'Data';
Var
fmGame: TfmGame;
player: TPlayer;
activeSong: TSong;
Implementation
{$R *.dfm}
Uses
Main;
procedure TfmGame.bbAnswerClick(Sender: TObject);
var
temp: string;
correctAnswer: string;
isCorrect: boolean;
begin
temp := edText.Text;
correctAnswer := activeSong.Name;
isCorrect := false;
temp := Trim(temp);
temp := LowerCase(temp);
correctAnswer := Trim(correctAnswer);
correctAnswer := LowerCase(correctAnswer);
if AnsiCompareText(temp, correctAnswer) = 0 then
isCorrect := True;
if isCorrect then
begin
edText.Text := '';
GainPoints(player);
//PlayRandomSong();
end
else
begin
LoseLive(player);
//В случае проигрыша
if player.Lives = 0 then
begin
mpMediaPlayer.Stop;
mpMediaPlayer.Close;
edPlayerName.Enabled := True;
bbStartGame.Enabled := True;
edText.Enabled := False;
bbAnswer.Enabled := False;
end;
end;
UpdateLabels();
end;
procedure TfmGame.bbBackClick(Sender: TObject);
begin
lbLives.Visible := False;
lbPoints.Visible := False;
edPlayerName.Enabled := True;
bbStartGame.Enabled := True;
edText.Enabled := False;
bbAnswer.Enabled := False;
fmMain.Show;
fmGame.Hide;
end;
procedure TfmGame.bbStartGameClick(Sender: TObject);
begin
player := InitializePlayer(edPlayerName.Text);
UpdateLabels();
lbLives.Visible := True;
lbPoints.Visible := True;
edPlayerName.Enabled := False;
bbStartGame.Enabled := False;
edText.Enabled := True;
bbAnswer.Enabled := True;
//PlayRandomSong();
end;
procedure TfmGame.FormClose(Sender: TObject; var Action: TCloseAction);
begin
lbLives.Visible := False;
lbPoints.Visible := False;
edPlayerName.Enabled := True;
bbStartGame.Enabled := True;
edText.Enabled := False;
bbAnswer.Enabled := False;
fmMain.Show;
end;
procedure TfmGame.UpdateLabels();
var
temp: string;
index: integer;
begin
temp := lbLives.Caption;
index := GetPosOfDigit(temp);
Delete(temp, index, length(temp) - index + 1);
temp := temp + IntToStr(player.Lives);
lbLives.Caption := temp;
temp := lbPoints.Caption;
index := GetPosOfDigit(temp);
Delete(temp, index, length(temp) - index + 1);
temp := temp + IntToStr(player.Points);
lbPoints.Caption := temp;
end;
procedure TfmGame.PlayRandomSong();
var
songname: string;
begin
songname := '';
// найти рандомную песню из директории Songs
mpMediaPlayer.FileName := SONGDIRECTORY + '/' + songname;
mpMediaPlayer.Open;
mpMediaPlayer.Play;
//activeSong := FindSongByFileName(...);
// запустить таймер
end;
function TfmGame.GetPosOfDigit(const str: string) : integer;
var
i: integer;
begin
for i := 1 to length(str) do
begin
if (str[i] >= '0') and (str[i] <= '9') then
result := i;
end;
end;
End.
Где-нибудь в начале программы получаешь список всех файлов, например:
list := TStringList.Create;
list.AddStrings(TDirectory.GetFiles('Songs'));
Чтобы взять случайный файл из списка:
if list.Count > 0 then // проверяешь есть ли ещё файлы в списке
begin
index := Random(list.Count); // генерируешь индекс в диапазоне 0...list.Count - 1
randomFileName := list[index]; // берёшь файл под этим индексом
list.Delete(index); // и удаляешь его из списка (чтобы не использовать его повторно)
end else begin
// если неиспользованных файлов больше не осталось
ShowMessage('нет больше файлов');
end;
Создать список файлов, выбрать из него случайный элемент. Задавай какие-нибудь более конкретные вопросы, что именно у тебя там не получается?