Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-07-2008
Avatar de mattgaviota
mattgaviota mattgaviota is offline
Registrado
 
Registrado: jun 2008
Ubicación: Salta, Argentina
Posts: 4
Poder: 0
mattgaviota Va por buen camino
Reproduccion aleatoria con un listbox

Hola, les cuento que estoy haciendo (como tantos otros) un reproductor de mp3. En el, manejo un playlist hecho con un tlistbox e hice (buscando en este foro como hacerlo) con un ttimer un metodo para reproducir las canciones de la lista ya sea aleatoriamente o de uno en uno. El codigo quedo asi :
Código Delphi [-]
procedure TForm1.Timer1Timer(Sender: TObject);
var
r:integer;
begin
if mediaplayer1.Mode=mpstopped then
begin
If MediaPlayer1.position=mediaplayer1.Length then
begin
  If checkbox1.Checked=false then
  begin
   If ListBox1.itemindex= ListBox1.items.count then
      ListBox1.itemindex:= -1;
   ListBox1.itemindex:= ListBox1.itemindex + 1;
   listbox2.ItemIndex:=listbox2.ItemIndex + 1;
  end;
  If checkbox1.Checked=true then
  begin
   Randomize;
   r:= Random(ListBox1.items.count);
   listbox1.ItemIndex:=r;
   listbox2.ItemIndex:=r;
  end;
reproducirdelistbox(listbox1.ItemIndex);
end;
end;
end;
donde reproducirdelistbox es una funcion que uso para reproducir la cancion que este seleccionada en el listbox.
El procedimiento anda, cuando termina una cancion pasa a la siguiente ya sea aleatoriamente o a la inmediatamente siguiente. El problema está en que cuando pulso stop y la canción está por terminar salta a la siguiente canción. Al parecer, segun creo yo, la propiedad position alcanza a la propiedad length antes de que la canción termine. Si me pueden ayudar le estaria agradecido, porque busque bastante y no encontre nada excepto esto que es de donde use para hacer el mio.

Última edición por mattgaviota fecha: 01-07-2008 a las 21:36:17.
Responder Con Cita
  #2  
Antiguo 01-07-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Hola,

con el uso del debugger mediantes 'Watches' podras determinar si realmente van por alla los tiros. Tambien, mirando la ayuda viene la propiedad EndPos y StarPos. Quiza no la tienes determinada correctamente, pues segun la ayuda de delphi ocurre algo indesesado al cambiar de cancion.

saludos, a ver si te sirve de ayuda
Responder Con Cita
  #3  
Antiguo 01-07-2008
Avatar de mattgaviota
mattgaviota mattgaviota is offline
Registrado
 
Registrado: jun 2008
Ubicación: Salta, Argentina
Posts: 4
Poder: 0
mattgaviota Va por buen camino
Gracias por responder. Pero intente y no se como evaluar esas propiedades cuando corro el programa. Lo intente paso a paso con trace into pero no puedo ver el programa. Pero lo que no se es que valor toma cuando termina una canción la propiedad position.
Responder Con Cita
  #4  
Antiguo 01-07-2008
Khronos Khronos is offline
Miembro
 
Registrado: abr 2007
Posts: 298
Poder: 18
Khronos Va por buen camino
Cuando pulsas stop tienes que parar el timer, cuando experimenté con este componente nunca utilice sus feos botones .
Creaba unos TSpeedButton con unas bonitas imagenes y ponia el TMediaPlayer.visible:=false.
En el evento del boton de stop ponia:

Código Delphi [-]
begin
Timer1.enabled:=false;
end;

Cuando le volvia a dar al play lo activaba de nuevo. Pero si estas utilizando los botones propios del componente, yo haria algo como esto:

Código Delphi [-]
procedure TForm1.MediaPlayer1Click(Sender: TObject; Button: TMPBtnType;
  var DoDefault: Boolean);
begin
                If Button=btStop then Timer1.enabled:=false 
end;

PD: Copiar y pegar codigo sin saber lo que hace no sirve de nada si no se entiende, buscate un buen manual de delphi y empieza por cosas mas sencillas.

Salu2
Responder Con Cita
  #5  
Antiguo 01-07-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Ctrl+F5 -> watches o bien boton derecho sobre el identificador. Con el F5, break points. F7,F8 trace into, trace over. Las opciones de debug tienen que estar activadas en options->project->compiler options o algo asi...En tu caso, pulsaria F5 para poner un breakpoint en la linea siguiente del primer 'if' (begin), y ctrl+f5 encima MediaPlayer1.Position, ctrl+F5 encima mediaplayer1.Lenght. otra manera practica de evaluar es poner un par de labels y con algun evento irlas actualizando, luego ya las quitas...

Código Delphi [-]

label1.Caption := inttostr(MediaPlayer1.Position);
label2.Caption := inttostr(MediaPlayer2.Lenght);

Última edición por coso fecha: 01-07-2008 a las 23:06:13.
Responder Con Cita
  #6  
Antiguo 01-07-2008
Avatar de mattgaviota
mattgaviota mattgaviota is offline
Registrado
 
Registrado: jun 2008
Ubicación: Salta, Argentina
Posts: 4
Poder: 0
mattgaviota Va por buen camino
Gracias por responder khronos y coso. Khronos es justo lo que necesitaba. Funciono muy bien. Yo tambien uso otros botones para usar el mediaplayer, y realmente estoy aprendiendo, asi que cuando uso codigo o parte del codigo que hizo otra persona me fijo bien en lo que hace.
Responder Con Cita
  #7  
Antiguo 02-07-2008
Khronos Khronos is offline
Miembro
 
Registrado: abr 2007
Posts: 298
Poder: 18
Khronos Va por buen camino
Para obtener la duracion y la posicion actual de cualquier canción usas las propiedades length y position como bien te dijo coso. Haciendo las operaciones adecuadas podemos conseguir el formato x:xx:xx.

Código Delphi [-]
function ObtenerDuracion(milisegundos: integer) : string;
var
min, sec, hor: integer;
segundos, minutos: string;
begin

sec:= milisegundos div 1000;
min:= sec div 60;
hor:= min div 60;
sec:= sec mod 60;

segundos:=inttostr(sec);
minutos:=inttostr(min);

if min<10 then begin
  minutos:='0' + inttostr(min);
end;
if sec<10 then begin
segundos:='0' + inttostr(sec);
end;

result:= inttostr(hor) +':' +minutos + ':' + segundos;
end;

Cada vez que cargues una cancion actualizas el label de la duracion total de la pista, y en el timer harias algo asi:

Código Delphi [-]
procedure TForm1.Timer1Timer(Sender: TObject);
var
r:integer;
begin
If MediaPlayer1.mode=mpplaying then LabelPosicion.caption:=ObtenerDuracion(MediaPlayer1.position);
if mediaplayer1.Mode=mpstopped then
begin
If MediaPlayer1.position=mediaplayer1.Length then
begin
  If checkbox1.Checked=false then
  begin
   If ListBox1.itemindex= ListBox1.items.count then
      ListBox1.itemindex:= -1;
   ListBox1.itemindex:= ListBox1.itemindex + 1;
   listbox2.ItemIndex:=listbox2.ItemIndex + 1;
  end;
  If checkbox1.Checked=true then
  begin
   Randomize;
   r:= Random(ListBox1.items.count);
   listbox1.ItemIndex:=r;
   listbox2.ItemIndex:=r;
  end;
reproducirdelistbox(listbox1.ItemIndex);
end;
end;
end;

Salu2
Responder Con Cita
Respuesta



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
Como generar una cadena aleatoria? JuanErasmo C++ Builder 3 16-06-2008 20:18:33
cleanScreen,letra aleatoria yessika19 Varios 13 04-11-2007 22:14:22
Imagen aleatoria en Fastreport jegrebahe1 Impresión 0 10-06-2007 01:04:40
La PC se Reseta sola y de manera aleatoria Enan0 Varios 5 25-04-2006 17:34:21
Hacer que me saque 50 números de forma aleatoria james_dean Varios 4 16-05-2005 22:20:15


La franja horaria es GMT +2. Ahora son las 23:14:52.


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