Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-01-2006
[Gunman] [Gunman] is offline
Miembro
 
Registrado: dic 2004
Ubicación: Pedreguer.
Posts: 355
Poder: 20
[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
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Creación de una lista de items metalfox6383 Varios 2 19-09-2005 12:57:54
Contar Items en un MainMenu AGAG4 Varios 4 07-10-2004 17:59:01
ListBox Items Hint (MUY URGENTE !!!!) jymy788 Varios 2 17-09-2004 09:41:58
Crear DBComobox con items oliverinf OOP 4 14-09-2004 17:20:21
Componente que tenga checkboxes como items k_miragaya OOP 2 22-07-2004 09:55:54


La franja horaria es GMT +2. Ahora son las 01:12:21.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi