Bueno, estaba perfeccionando un programita que tenía, algo así como una radio despertador de estas que a tal hora suena la radio, pues igual.
El programa comparaba cada 0,1 segundos el hora local con una hora en un fichero .ini donde estaba la programación, si la hora del sistema era una hora indicada como para iniciarse, el programa, cargaba una canción aleatoria de una lista de canciones. Bueno, ahora quería perfeccionar el programa de esta forma: cada vez que se reproduzca una canción, cuando termina de reproducirse, esta es eliminada de la lista de canciones. Si la lista de canciones, se queda con 0 items, carga las canciones de otra lista. Para esto he hecho dos listas, la songs.ls y la TEMP_songs.ls. El programa maneja la lista TEMP_songs.ls y sólo usa la songs.ls cuando los items se quedan a 0. Bueno, el problema viene que cuando debería eliminar la canción de la lista me crea una excepción, la típica (creo yo) en lista: List Index Out of Bounds (-1).
Bueno os pongo todo el código donde se maneja la variable SongsList (TStringList) y os indico donde creo que está el error:
Código Delphi
[-]
public
SongsList: TStringList;
Código que se inicia al crear el programa.
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;
end;
Bueno, éste es el código que se ejecuta cada 0,1 segundos:
Código Delphi
[-]
procedure TMainFrm.TimerTimer(Sender: TObject);
var
LocalTime: TSystemTime;
Prog: TIniFile;
ProgTable: TValueListEditor;
i: Integer;
begin
GetLocalTime(LocalTime);
Prog := TIniFile.Create('C:\AdMies\prog.ini');
ProgTable := TValueListEditor.Create(MainFrm);
Prog.ReadSectionValues('Programació',ProgTable.Strings);
if SongsList.Count = 0 then
begin
SongsList.LoadFromFile('C:\AdMies\songs.ls');
SongsList.SaveToFile('C:\AdMies\TEMP_songs.ls');
end;
for i := 1 to ProgTable.RowCount-1 do
begin
if (SystemTimeToDateTime(LocalTime) = StrToTime(ProgTable.Keys[i]) and
(SongsList.Count > 0) then
begin
Randomize;
MPlayer.FileName := SongsList.Strings[Random(SongsList.Count)];
MPlayer.Open;
MPlayer.Play;
end
else
if SystemTimeToDateTime(LocalTime) = StrToTime(ProgTable.Values[
ProgTable.Keys[i]])) then
begin
if MPlayer.FileName <> '' then
begin
if SongsList.Count > 0 then
SongsList.Delete(SongsList.IndexOf(MPlayer.FileName));
MPlayer.Stop;
SongsList.SaveToFile('C:\AdMies\TEMP_songs.ls');
end;
end
else
if (MPlayer.FileName <> '') and (MPlayer.Length = MPlayer.Position) then
begin
Randomize;
if SongsList.Count > 0 then
SongsList.Delete(SongsList.IndexOf(MPlayer.FileName));
SongsList.SaveToFile('C:\AdMies\TEMP_songs.ls');
MPlayer.FileName := SongsList.Strings[Random(SongsList.Count)];
MPlayer.Open;
MPlayer.Play;
end;
end;
ProgTable.Free;
Prog.Free;
end;
Bueno, creo que no me dejado nada. ¡Ah si! Me dejava la liberación de la variable, la he puesto en el OnDestroy del Form.
Estoy perdido del todo, no sé porqué me da esta excepción. No estoy seguro de haberla localizarla correctamente.
Bueno, espero ansioso vuestras respuestas, y gracias por leer este rollo. :P