Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi top100 in mp3player (https://www.delphipraxis.net/24121-top100-mp3player.html)

EvilDragon 15. Jun 2004 19:44


top100 in mp3player
 
hi leutz, ich versuche nun seit 2 tagen eine toplist für meinen mp3player zu programmieren.
wenn ein track komplet durchgelaufen ist wird überprüft ob in der listbox (top100l) schon was drin steht wenn nicht, dann wird der aktuellgespielter track eingetragen bzw die variabeln in die vorher aus dem Id3Tag der artist und titel ausgelsen wurde.
wenn schon was in der liste steht werden die inhalte in strings geladen der platz abgezogen und nachgeschaut ob artist und titel identisch sind, wenn ja, dann listbox.item.delete(i) den platz addieren um 1 und eintragen in listbox
sollte nicht gleich sein dann einfach eintragen mit platz=1

platz heißt eigentlich punkte bzw. stimmen....

hier mein jetzige und 3. code:

Delphi-Quellcode:
procedure Thauptprog.top100Timer(Sender: TObject);
var artneu, trackneu, zkneu, zklist, plist : String;
    pneu, i, code : Integer;
begin
  if Trackbar1.Position = TrackBar1.Max then //status von song
  begin
    artneu := id3_tag.EdtArtist.Text; //id3tag artist
    trackneu := id3_tag.EdtTitle.Text; //id3tag titel
    if top100l.Count = 0 then
    begin
      pneu := 1;
      top100l.Items.Add(IntToStr(pneu)+'~'+artneu+'~~'+trackneu);
    end
    else if top100l.Count > 0 then
    begin
      for i:=0 to top100l.Count-1 do
      begin
        zkneu := artneu+'~~'+trackneu;
        zklist := top100l.Items[i];
        plist := Copy(zklist,0,Pos('~',zklist)-1);
        Val(plist, pneu, code);
        zklist := Copy(zklist, Pos('~',zklist)+1, Length(zklist));
        if zklist=zkneu then
        begin
          top100l.Items.Delete(i);
          pneu := pneu+1;
          top100l.Items.Add(IntToStr(pneu)+'~'+zkneu);
        end
        else
        begin
          pneu := 1;
          top100l.Items.Add(IntToStr(pneu)+'~'+zkneu)
        end;
      end;
    end;
  end;
end;
mein prob, es geht auch so weit aber bei meist mehr wie 2-3 einträgen fängt er an nicht mehr zu vergleich oder speichert einträge doppelt ect...

EvilDragon 15. Jun 2004 20:46

Re: top100 in mp3player
 
habs nun so versucht aber klappt auch net:

Delphi-Quellcode:
procedure Thauptprog.top100Timer(Sender: TObject);
var artneu, trackneu, zkneu, zklist, plist : String;
    pneu, i, code, drin : Integer;
begin
  if Trackbar1.Position = TrackBar1.Max then //status von song
  begin
    drin := 0;
    pneu := 0;
    artneu := id3_tag.EdtArtist.Text; //id3tag artist
    trackneu := id3_tag.EdtTitle.Text; //id3tag titel
    if top100l.Count = 0 then
    begin
      pneu := 1;
      top100l.Items.Add(IntToStr(pneu)+'~'+artneu+'~~'+trackneu);
    end
    else if top100l.Count > 0 then
    begin
      for i:=0 to top100l.Count-1 do
      begin
      While drin = 0 do
      begin
        zkneu := artneu+'~~'+trackneu;
        zklist := top100l.Items[i];
        plist := Copy(zklist,0,Pos('~',zklist)-1);
        Val(plist, pneu, code);
        zklist := Copy(zklist, Pos('~',zklist)+1, Length(zklist));
        if zklist=zkneu then
        begin
          top100l.Items.Delete(i);
          pneu := pneu+1;
          top100l.Items.Add(IntToStr(pneu)+'~'+zkneu);
          drin := 1;
        end
        else
        begin
          pneu := 1;
          top100l.Items.Add(IntToStr(pneu)+'~'+zkneu);
          drin := 1
        end;
      end;
      end;
    end;
  end;
end;
naja, hoffe kann mir jemand helfen bzw. versteht was ich meine...und hat eine lösung bzw. eine andere idee *hoff*

EvilDragon 16. Jun 2004 05:07

Re: top100 in mp3player
 
hm... kann wohl keiner, naja selber noch ein bissel testen vielleicht überwinde ich ja die mauer die mich quährdenken lässt :wall:

Muetze1 16. Jun 2004 08:59

Re: top100 in mp3player
 
Moin!

Du brauchst doch nur den Zähler, wie oft gespielt. Dadurch entstehen doch automatisch die Top100...

MfG
Muetze1

EvilDragon 16. Jun 2004 15:16

Re: top100 in mp3player
 
hopla.. meist jetzt den der zählt, wie oft das lied lief?? oder wie...
ich muss doch auch nachschauen ob das lied in der top100 drin ist und wenn, dann den zähler um eins addieren....

Muetze1 16. Jun 2004 16:17

Re: top100 in mp3player
 
Moin!

Zitat:

Zitat von EvilDragon
hopla.. meist jetzt den der zählt, wie oft das lied lief?? oder wie...
ich muss doch auch nachschauen ob das lied in der top100 drin ist und wenn, dann den zähler um eins addieren....

Ich meinen einen Zähler für jedes Lied - musst du eh haben, weil folgendes mal vorstellen:

Deine Top1000 - davon das das am Platz 1000: Angenommen dieses wurde schon 5x gespielt. Wie willst du das denn mit deiner Logik machen? Wenn du nun ein Lied hast was zum ersten mal gespielt wurde, dann wird es auch nicht in die Top1000 aufgenommen, ergo hast du keinen Zähler, ergo weisst du das nächste mal spielen des Liedes nicht mehr, das es schon einmal gespielt wurde. Darauf folgt: es können sich nur noch die Positionen in der Top1000 ändern.

Deshalb: Einen Zähler bauen für jedes File der mit jedem abspielen um eins erhöhrt wird. Wenn du das gemacht hast, kannst du daraus dann deine Top1000 ermitteln...

MfG
Muetze1

EvilDragon 16. Jun 2004 19:04

Re: top100 in mp3player
 
hm... von prinzip her also eine liste die man nicht sieht...in dieser wird immer das aktuelle lied gespeichert, was gespielt wurde... würd dieses später wieder mal abgespielt erhält es eine 2 und das gleich auch mit anderen liedern..

so, nun sagen wir mal, man klickt auf einem butten der dann eine zweite listbox, die dann aus der unsichbaren die ersten 100 einträge ausließt und dann anzeigt,

vorausgesetz die unsichtbare die, halt zählt ist von hause aus sortiert...

so in edwar?


die unsichtbare listbox kann man ja immer in einer datei abspeichern und laden beim progstart...

Muetze1 17. Jun 2004 00:40

Re: top100 in mp3player
 
Moin!

Ja, genau so.

Dazu noch ein paar Tipps:

1. Du brauchst keine unsichtbare ListBox, du kannst einfach eine TStringList nehmen. Die kannst du genauso einfach laden und speichern und die ist von Haus aus nicht auf der Oberfläche zu sehen.
2. Speicher die Abspielhäufigkeit am besten in dem Object[] Array bei den Einträgen - die werden mitsortiert und dann ist es einfacher, da dann der Name und die Anzahl ordentlich getrennt sind...
3. Du könntest auch den PlayCounter nutzen, der in den ID3v2.3.x.x mindestens definiert sind - Nachteil: jedesmal die MP3's auslesen - und es geht halt nur bei MP3s - also kein OGG, WMA oder sonstige...
4. schöne Interpretation von "etwa" als "edwar"... :thuimb:

MfG
Muetze1

EvilDragon 17. Jun 2004 07:17

Re: top100 in mp3player
 
oky, alles klaro so wei *denk ich* :)

Zu2.
aber das mit 2 raf ich net, wie meinst soll ich array nutzen....als zähler???

Zu3.
Ja könnte man, aber später soll der Nutzer auch einstellen ob er außer mp3 anderes hört und wenn ja, ob top100 dann halt die dateinamen benutzen soll.

Muetze1 17. Jun 2004 09:01

Re: top100 in mp3player
 
Moin!

Zitat:

Zitat von EvilDragon
Zu2.
aber das mit 2 raf ich net, wie meinst soll ich array nutzen....als zähler???

Nutze eine TStringList und missbrauche die Objekt Eigenschaft als Speicherplatz für deinen Zähler:

Delphi-Quellcode:
  StrL := TStringList.Create;
  StrL.LoadFromFile('top100');

  // so, lied A wird abgespielt
  Index  := StrL.IndexOf(A);
  Counter := Integer(StrL.Objects[Index]);
  Inc(Counter);
  StrL.Objects[Index] := TObject(Counter);
Mir fällt nur noch ein, das du dir was beim Speichern überlegen musst, da die Objekte nicht mit gespeichert werden...

MfG
Muetze1

EvilDragon 17. Jun 2004 11:32

Re: top100 in mp3player
 
:shock: so ganz verstanden ha ich es noch nciht aber mal schauen raus kommt... danke für deine Hilfe und wenn ich kein stück weiterkomme :pale: , weiß ich ja, wo hilfe zu finden ist *gg* :dp:

yankee 17. Jun 2004 12:04

Re: top100 in mp3player
 
ist doch quasi nichts anderes als 'ne Highscore, nur dass es statt der Punkte die Zahl giubt, wie häufig das abgespielt worden ist. Ich würde es allerdinbgs in ini, csv oder xml speichern. Ich schätze aber ini ist das einfachste. Dazu habe ich schonmal was geschrieben:
Hier habe ich schonmal was zu ini und Highscore geschrieben...

EvilDragon 18. Jun 2004 12:56

Re: top100 in mp3player
 
hi, hab mir den code mal angeschaut:
Delphi-Quellcode:
procedure Highsoreladen;
var ini:TIniFile;
    s:integer;
begin
   for s:=1 to 10 do //10=anzahl der Einträge
   begin
        Ziel :=ini.readstring('Highscore','Name'+inttostr(s),'');
        Ziel :=ini.readstring('Highscore','Score'+inttostr(s),'');
   end;
end;
die idee ist nicht schlecht, es von eine highscorelist abzuschauen aber ich muss ja schauen ob der song nachher schon drin ist und wenn, dann soll einfach seine "punkte" (anzahl von abgespielt) addiert werden mit der die in der liste steht...

eigentlich wollte ich das ja statt in einer ini in einer textdatei haben mit einer beliebeigen endung... so das man diese im www laden kann und dann ein phpskrip auswertet bzw. mit den einträgen arbeiten kann....

yankee 18. Jun 2004 13:33

Re: top100 in mp3player
 
Zitat:

Zitat von EvilDragon
die idee ist nicht schlecht, es von eine highscorelist abzuschauen aber ich muss ja schauen ob der song nachher schon drin ist und wenn, dann soll einfach seine "punkte" (anzahl von abgespielt) addiert werden mit der die in der liste steht...

Sollte doch eigenlich kein Problem sein. Du kannst ja einfach mit einer for-Schleife alle Einträge durchgehen. Wenn der Eintrag gefunden wurde, dann brichst du die Schleife ab und hast den Eintrag. Also so ungefähr:
Delphi-Quellcode:
procedure eintragUpdate(Song:string);
var ini:TIniFile;
    s:integer;
begin
   for s:=1 to 101 do
   begin
        if ini.readstring('Highscore','Name'+inttostr(s),'') =Song then
  begin
    ini.writeint('Highscore','Score'+inttostr(s),ini.readint('Highscore','Score'+inttostr(s),0)+1);
//Klartext: Ich lese dir Score aus, erhöhe sie um 1 und speichere sie wieder...
    break;
  end;
  if =101 then //dann ist es nicht drin...
   end;
Ich weiß nicht mehr genau, ob es writeint oder writeinteger heißt (das gleiche gilt für read, musst du mal auspürobieren (oder wissen *g*).
Zitat:

Zitat von EvilDragon
eigentlich wollte ich das ja statt in einer ini in einer textdatei haben mit einer beliebeigen endung... so das man diese im www laden kann und dann ein phpskrip auswertet bzw. mit den einträgen arbeiten kann....

Eine ini-Datei ist auch nicht an die Endung .ini gebunden. Bzw.: die Endung einer ini-Datei ist total egal. Eine ini-Datei ist ja nun nichts anderes als eine Textdatei. So ist das ganze auch mit PHP zu realisieren.

EvilDragon 18. Jun 2004 16:15

Re: top100 in mp3player
 
danke, das mit ini ist das kleine prob, wegen befehle, hab ja meine skins und optionen damit gemacht....
das mit php war eigentlich nur das was mir im hinterkopf schwebte, hm.... muss ich halt ein script machen was mit dem aufbau einer ini klar kommt...

werd mich melden wenn ich es getsetet hab ;)

EvilDragon 20. Jun 2004 22:09

Re: top100 in mp3player
 
danke... hab mal eben alles so gemacht das das programm jeden song in einer ini eintraägt.. startet man das prog neu, schaut er nahc wo der letze eintrag war und macht da dann weiter nun nur noch dsa überprüfen, wenn schon drin dann gehört +1 und dann noch ein schönes form in dem alles angezeigt wird...

hier mal ein kleier code:
Delphi-Quellcode:
// top100
    if (id3_tag.EdtArtist.Text='')and(id3_tag.EdtTitle.Text='')then
    begin
    end
    else
    begin
      initop100 := TiniFile.Create(ExtractFilePath(ParamStr(0))+'inis/top.100');
      try
        initop100.WriteInteger('top100','eintrag'+IntToStr(eintragtop100),eintragtop100);
        initop100.WriteString('top100','artist'+IntToStr(eintragtop100),id3_tag.EdtArtist.Text);
        initop100.WriteString('top100','track'+IntToStr(eintragtop100),id3_tag.EdtTitle.Text);
        initop100.WriteString('top100','gehoert'+IntToStr(eintragtop100),'1');
      finally
        initop100.Free;
      end;
      eintragtop100 := eintragtop100+1;
    end;
// top100


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz