Ir al contenido


Foto

[RESUELTO] Cargando Playlists de winamp en un listbox [Problema]


  • Por favor identifícate para responder
4 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 16 octubre 2009 - 07:05

Hola amigos, estoy haciendo un procedimiento que carga un achivo .M3u de winamp en un listbox, hasta ahora me va funcionando bien, lo teng así:



delphi
  1. Type
  2.   TMiObjeto = class(TObject)
  3.     sPath: String;
  4.   end;
  5.  
  6. procedure CargarM3u(M3u: string; Src: TListbox);
  7. var m3ufile: TStringList;
  8.     i: integer;
  9.     Temp, Cancion: string;
  10.     obj: TMiObjeto;
  11. begin
  12.       obj := TMiObjeto.Create;
  13.       m3ufile := TStringList.Create;
  14.       m3ufile.LoadFromFile(M3u);
  15.  
  16.       for i := 0 to m3ufile.Count -1 do
  17.         begin
  18.           Temp := UpperCase(Trim(m3ufile[i]));
  19.             if Copy(Temp, 1, 1) <> &#39;#&#39; then
  20.                 obj.sPath := m3ufile[i]
  21.             else
  22.                 if Copy(Temp, 1, 8) = &#39;#EXTINF:&#39; then
  23.                   Cancion := Copy(m3ufile[i], Pos(&#39;,&#39;, m3ufile[i]) + 1, Length(m3ufile[i]));
  24.  
  25.                   Src.AddItem(Cancion, TMiobjeto(obj));
  26.         end;
  27.           m3ufile.Free;
  28.           obj.Free;
  29. end;



El resultado es el siguiente:

Imagen Enviada

Problema número 1, se me repite dos veces la canción, problema número 2, cuanto intento el valor del objeto de un item del listbox me da error:

---------------------------

Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 004032B2 in module 'Project1.exe'. Read of address BAADF00D'. Process stopped. Use Step or Run to continue.
---------------------------
OK  Help 
---------------------------


El code lo tengo así:



delphi
  1. procedure TForm1.Button2Click(Sender: TObject);
  2. var
  3.   Obj: TmiObjeto;
  4.   i: integer;
  5. begin
  6.   i := ListBox1.ItemIndex;
  7.   Obj := ListBox1.Items.Objects[ListBox1.Items.IndexOf(ListBox1.Items[i])] as TmiObjeto;
  8.   ShowMessage(Obj.sPath);
  9. end;



Ya probé con el paso a paso (F4 y F7) y se obitenen los valores correctamente, así que no sé por donde anda el problema. ¿me pueden echar una mano?.

Saludos.

  • 0

#2 Héctor Randolph

Héctor Randolph

    501st Legion

  • Moderadores
  • PipPipPip
  • 664 mensajes
  • LocationMéxico

Escrito 16 octubre 2009 - 08:43

Hola enecumene

Debes crear un objeto por cada elemento de la lista, revisando  tu código solamente creas un objeto.



delphi
  1.   obj := TMiObjeto.Create; //Esta línea debe ir dentro del ciclo for



Por otra parte, me parece que esto lo puedes simplificar


delphi
  1.   Obj := ListBox1.Items.Objects[ListBox1.Items.IndexOf(ListBox1.Items[i])] as TmiObjeto;




Tal vez con esto sea suficiente



delphi
  1.   Obj := ListBox1.Items.Objects[i] as TmiObjeto;



Saludos

  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 17 octubre 2009 - 08:10

Gracias Héctor, colocando la creación del objeto dentro del ciclo For se resuelve el problema del error, el problema 1 sigo sin resolver, se repite dos veces y la primera de cada una no tiene valor en su objeto pero en la segunda sí :s.
  • 0

#4 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 17 octubre 2009 - 03:38

Aquí un ejemplo:



delphi
  1. type
  2.   TMiObjeto = class(TObject)
  3.     sPath: String;
  4.     sTitulo: String;
  5.   end;
  6.  
  7. procedure CargarM3U(Filename: String; Dst: TListbox);
  8. var
  9.   i: Integer;
  10.   Str,Titulo: String;
  11.   MiObjeto: TMiObjeto;
  12. begin
  13.   with TStringList.Create do
  14.   try
  15.     Titulo:= EmptyStr;
  16.     LoadFromFile(Filename);
  17.     for i:= 0 to Count - 1 do
  18.     begin
  19.       Str:= Trim(Strings[i]);
  20.       if Str <> EmptyStr then
  21.       begin
  22.         if Copy(Str,1,1) = '#' then
  23.         begin
  24.           if Copy(Uppercase(Str),1,8) = '#EXTINF:' then
  25.           begin
  26.             System.Delete(Str,1,8);
  27.             if Pos(',',Str) > 0 then
  28.             begin
  29.               System.Delete(Str,1,Pos(',',Str));
  30.               if Pos(',',Str) > 0 then
  31.               begin
  32.                 System.Delete(Str,Pos(',',Str),MAXINT);
  33.               end;
  34.               Titulo:= Trim(Str);
  35.             end;
  36.           end;
  37.         end else
  38.         begin
  39.           MiObjeto:= TMiObjeto.Create;
  40.           MiObjeto.sPath:= Str;
  41.           MiObjeto.sTitulo:= Titulo;
  42.           if Titulo <> EmptyStr then
  43.             Dst.AddItem(Titulo,MiObjeto)
  44.           else
  45.             Dst.AddItem(Str,MiObjeto);
  46.           Titulo:= EmptyStr;
  47.         end;
  48.       end;
  49.     end;
  50.   finally
  51.     Free;
  52.   end;
  53. end;



En cuanto a tu código, fíjate que añades un nuevo item siempre, da igual que sea una linea que empiece por #, un archivo o simplemente una linea en blanco. Creo que por ahí te falta algún if o quizá algún else  ;)
  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 17 octubre 2009 - 03:42

Vale, ¡Muchíssima gracias amigo!, ese me funciona de pelos (y) :D (b)
  • 0




IP.Board spam blocked by CleanTalk.