Ver Mensaje Individual
  #1  
Antiguo 16-01-2006
[Gunman] [Gunman] is offline
Miembro
 
Registrado: dic 2004
Ubicación: Pedreguer.
Posts: 355
Reputación: 22
[Gunman] Va por buen camino
Eliminando items en TTimer...

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
    { Public declarations }
    SongsList: TStringList; //Declaración de la variable
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);

  {La función AddFiles en la unidad AddCurDir sirve para añadir items al archivo songs.ls, no hay ningún problema con el, puesto que no lo he modificado...}
  AddCurDir.CurrentDir := ExtractFilePath(Application.ExeName);
  AddCurDir.AddFiles;

{Combrueba que el TEMP_songs.ls no este vacío, si es así añade las canciones de songs.ls}
  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);

{Aquí comprueba que los items de SongsList.Count no sean 0, de serlo así carga los items de songs.ls y los guarda en TEMP_songs.ls, no creo que aquí este el problema porque antes, ya lo he usado y no me ha hecho fallo}
  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
    {Este primer if, ni lo he tocado, no creo que el problema este aquí}
    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
    {Creo que el problema estará aquí, en el SongsList.Delete}
    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
{Último if, en caso de no haber pasado el tiempo indicado y haberse terminado la canción, entonces pasa a otra canción}
    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
__________________
l2prog.co.nr
Responder Con Cita