Ver Mensaje Individual
  #6  
Antiguo 17-01-2006
[Gunman] [Gunman] is offline
Miembro
 
Registrado: dic 2004
Ubicación: Pedreguer.
Posts: 355
Reputación: 20
[Gunman] Va por buen camino
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.ini, es donde se encuentra la programación horaria; ProgTable, 
   es la tabla donde se abrirá la programación, yo he creado una tabla 
   porqué me resulta más facil de manejar que con archivos Ini}
  Prog := TIniFile.Create('C:\AdMies\prog.ini');
  ProgTable := TValueListEditor.Create(MainFrm);
  Prog.ReadSectionValues('Programació',ProgTable.Strings);

  {Aquí es donde empieza el lío... Dependiendo si la tarea es 
   reproducir o parar ejecuta un código u otro}
  if Task = tPlay then
  {Recorre toda la programación con un for y...}
  for ProgTime := 1 to ProgTable.RowCount-1 do
  begin
    {Cuando se recorre el primer item, asigna al valor de NextTime.Interval,
      la diferencia en milisegundos de la hora a que va a empezar la música
      y la hora actual. También, asgina al valor de NextTime.Item, el valor 
      de 1, es decir, el primer item de la programación}
    if (ProgTime = 1) then
    begin
      NextTime.Interval := MillisecondsBetween(StrToTime(
      ProgTable.Keys[ProgTime]), Now);
      NextTime.Item := 1;
    end
    {Si no recorre el primer item de la programación, comprueba que la
     diferencia entre la hora programada y la actual sea menor, si es 
     así hace lo mismo que lo dicho anteriormente}
    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 {En caso de que la tarea a realizar no sea la de reproducir, sino
  la de detener una reproducción, entonces, el próximo intervalo de 
  tiempo, será la diferencia entre la hora de detención de la reproducción
  y la actual}
  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;  //Detiene la reproducción en curso...
  NextTime.Task := tPlay; //Asigna el valor tPlay a la propiedad Task
  calcInterval(tPlay);  //Calcula el intervalo para la próxima reproducción
  {Más cosillas de la interfaz}
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
  {Elimina la canción que se va a reproducir de la lista de canciones para
   que no se vuelva a repetir hasta que todas se hayan reproducido, por
   lo menos, una vez}
  if SongsList.Count > 0 then
  begin
    SongsList.Delete(SongsList.IndexOf(FileName));
    SongsList.SaveToFile('C:\AdMies\TEMP_songs.ls');
  end;

  {En caso de que todas las canciones se hayan escuchado, vuelve a 
   cargar las canciones desde la lista songs.ls a la lista TEMP_songs.ls}
  if SongsList.Count = 0 then
  begin
    SongsList.LoadFromFile('C:\AdMies\songs.ls');
    SongsList.SaveToFile('C:\AdMies\TEMP_songs.ls');
  end;

  MPlayer.FileName := FileName;  //sin comentarios
  {Cosillas de la interfaz}
  MPlayer.Open;
  MPlayer.Play; 
  NextTime.Task := tStop;  //La próxima tarea será la de detener
  calcInterval(tStop);  //calcula cuantos milisegundos faltan para detener
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;

  {Otras cosillas que no influyen}

  {Crea los archivos songs.ls y TEMP_songs.ls}
  Hnd := FileCreate('C:\AdMies\songs.ls');
  FileClose(Hnd);

  Hnd := FileCreate('C:\AdMies\TEMP_songs.ls');
  FileClose(Hnd);

  {Estas sentencias sirven para añadir las canciones de la carpeta donde 
   se encuentra el programa a la lista songs.ls}
  AddCurDir.CurrentDir := ExtractFilePath(Application.ExeName);
  AddCurDir.AddFiles;

  {Carga a la lista SongsList las canciones de TEMP_songs.ls}
  SongsList.LoadFromFile('C:\AdMies\TEMP_songs.ls');
  {En caso de que TEMP_songs.ls no tenga canciones, se añaden las del 
   archivo songs.ls}
  if SongsList.Count = 0 then
  begin
    SongsList.LoadFromFile('C:\AdMies\songs.ls');
    SongsList.SaveToFile('C:\AdMies\TEMP_songs.ls');
  end;

  {Otras cosillas}

  NextTime.Task := tPlay; //Empieza a reproducir
  calcInterval(tPlay); //Calcula el intervalo de tiempo para reproducir
  Timer.Enabled := True;  //Activa el temporizador

  {Cosillas de la interfaz}
end;
Y finalmente, el OnTimer del TTimer:
Código Delphi [-]
procedure TMainFrm.TimerTimer(Sender: TObject);
begin
  //Si la tarea a realizar es reproducir...
  if NextTime.Task = tPlay then
  Play(SongsList.Strings[Random(SongsList.Count)])  //Una canción 
                                                    //aleatoria de la lista SongsList
  {En caso de que la tarea sea la de detener...}
  else if NextTime.Task = tStop then
   Stop; //detiene la reproducción
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!
__________________
l2prog.co.nr
Responder Con Cita