Gente, ya he modificado el programilla. Os dejo el resultado, no me funciona. No encuentro el fallo (seguro que es una tontería...). Os lo explico un poco el código también.
Tenéis que saber, que el archivo prog.ini tiene la siguiente estructura:
[Programació]
HoraPlay=HoraStop
Lo primero que he hecho ha sido crear un tipo registro donde almacenaré el Intervalo que ha de tener el TTimer (se canculará posteriormente) y la tarea que ha de hacer, pues el programa ha de reproducir música durante X minutos, donde X lo configura el usuario en un .ini.
Código Delphi
[-]
type
TTask = (tPlay, tStop);
TNextTime = record
Interval: Cardinal;
Item: Integer;
Task: TTask;
end;
He hecho un procedimiento que calcula el intervalo que ha de tener el TTime, dependiendo si se la siguiente tarea es reproducir o detener la reproducción. Aquí lo pongo:
Código Delphi
[-]
procedure TMainFrm.CalcInterval(Task: TTask);
var
Prog: TIniFile;
ProgTable: TValueListEditor;
ProgTime: Integer;
begin
Prog := TIniFile.Create('C:\AdMies\prog.ini');
ProgTable := TValueListEditor.Create(MainFrm);
Prog.ReadSectionValues('Programació',ProgTable.Strings);
if Task = tPlay then
for ProgTime := 1 to ProgTable.RowCount-1 do
begin
if (ProgTime = 1) then
begin
NextTime.Interval := MillisecondsBetween(StrToTime(
ProgTable.Keys[ProgTime]), Now);
NextTime.Item := 1;
end
else if MillisecondsBetween(StrToTime(ProgTable.Keys[ProgTime]),
Now) < NextTime.Interval then
begin
NextTime.Interval := MillisecondsBetween(StrToTime(
ProgTable.Keys[ProgTime]), Now);
NextTime.Item := ProgTime;
end;
end
else
NextTime.Interval := MillisecondsBetween(StrToTime(
ProgTable.Values[ProgTable.Keys[NextTime.Item]]), Now);
Timer.Interval := NextTime.Interval;
Prog.Free;
ProgTable.Free;
end;
Bueno, he hecho dos pequeños procedimientos, uno de Play y otro de Stop, el de Stop no tiene secreto, de todas formas, aquí lo pongo:
Código Delphi
[-]
procedure TMainFrm.Stop;
begin
MPlayer.Stop; NextTime.Task := tPlay; calcInterval(tPlay);
end;
Ése era el stop, y ahora el play, un poco más larguito, pero sencillo:
Código Delphi
[-]
procedure TMainFrm.Play(FileName: String);
begin
if SongsList.Count > 0 then
begin
SongsList.Delete(SongsList.IndexOf(FileName));
SongsList.SaveToFile('C:\AdMies\TEMP_songs.ls');
end;
if SongsList.Count = 0 then
begin
SongsList.LoadFromFile('C:\AdMies\songs.ls');
SongsList.SaveToFile('C:\AdMies\TEMP_songs.ls');
end;
MPlayer.FileName := FileName;
MPlayer.Open;
MPlayer.Play;
NextTime.Task := tStop; calcInterval(tStop); end;
Después de estos tres procedimientos está el evento OnCreate del programa, aquí os dejo la parte que nos interesa del código:
Código Delphi
[-]
procedure TMainFrm.FormCreate(Sender: TObject);
var
Hnd: Integer;
Reg: TRegistry;
begin
SongsList := TStringList.Create;
Hnd := FileCreate('C:\AdMies\songs.ls');
FileClose(Hnd);
Hnd := FileCreate('C:\AdMies\TEMP_songs.ls');
FileClose(Hnd);
AddCurDir.CurrentDir := ExtractFilePath(Application.ExeName);
AddCurDir.AddFiles;
SongsList.LoadFromFile('C:\AdMies\TEMP_songs.ls');
if SongsList.Count = 0 then
begin
SongsList.LoadFromFile('C:\AdMies\songs.ls');
SongsList.SaveToFile('C:\AdMies\TEMP_songs.ls');
end;
NextTime.Task := tPlay; calcInterval(tPlay); Timer.Enabled := True;
end;
Y finalmente, el OnTimer del TTimer:
Código Delphi
[-]
procedure TMainFrm.TimerTimer(Sender: TObject);
begin
if NextTime.Task = tPlay then
Play(SongsList.Strings[Random(SongsList.Count)])
else if NextTime.Task = tStop then
Stop; end;
Siento haber puesto todo esto aquí, ahora no tenéis excusa de que os falta código... Bueno, voy a ver si resuelvo esto. Espero impaciente vuestra ayuda. Muchas grácias!