Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Cover-Anzeige für WMP Programmieren (https://www.delphipraxis.net/150902-cover-anzeige-fuer-wmp-programmieren.html)

LukasB 29. Apr 2010 21:28


Cover-Anzeige für WMP Programmieren
 
Hallo Forumgemeinschaft,

ich habe eine Frage, bei der es um das grundsätzliche Verständnis von Delphi geht.
Wie im Betreff geschrieben, will ich eine Cover-Anzeige + Interpret etc für den WMP programmieren.
Den schwierigsten Teil hab ich hinter mir, dachte ich zumindest.
Ich habe die Metadaten des aktuellen Liedes in entsprechenden Strings vorliegen und kann sie bei Button-Klick in Labels ausgeben. Aus dem Liednamen könnte ich dann entsprechende Grafik anzeigen.
Jetzt möchte ich das natürlich nicht bei jedem Klick, sondern autonom alles 10 sec aktualisieren. Und das ist das Problem: Wenn ich eine While-Schleife in meine Unit einbaue, dann sehe ich das Formular garnicht erst, weil er garnicht an die Stelle des Hauptprogramms "Application.Run;" kommt. Baue ich die Schleife in das Hauptprogramm, dann wird sie nie durchlaufen, weil der Prozess beim "Run-Befehl" hängt, so lang ich das Fenster nicht wegklicke.
Wie kann ich einfach alles 10 sekuden (ca) eine Aktualisierung vornehmen?
Danke schon mal und viele Grüße

Lukas

P.S. Ich bin ganz frisch in Delphi und hab die Trial Embarcardo RDA 10

Luckie 29. Apr 2010 22:14

Re: Cover-Anzeige für WMP Programmieren
 
Wie wäre es mit einem Timer? Aber warum ständig aktualisieren? Das Cover ändert sich doch nur, bei einem neuen Lied.

LukasB 30. Apr 2010 08:10

Re: Cover-Anzeige für WMP Programmieren
 
Servus Luckie,

danke schon mal für deine schnelle Antwort.
Das mit dem Timer hab ich mir auch schon überlegt, nur weiß ich nicht, wie ich eine Prozedur darauf ansprechen lasse.
mit ständig aktualisieren meine ich zeitlich lang, halt so lang Musik abgespielt wird.
Ich hatte eigentlich folgende Struktur im Kopf, aber wahrscheinlich zu sehr C-Denke:

unit

interface

var ....

prozedure wait(sec);
prozedure writeMetaData();
prozedure showCover();

sec = 10;
while true do
begin
writeMetadata();
showCover();
wait();
end;

end.

Das soll nur Struktur-Code sein :wink:
Aber sowas geht dann wohl nicht wenn du den Time vorschlägst, oder?
Die wait habe ich hier aus dem Forum genommen, war glaube ich sogar eine Antwort auf einen Poste von dir:

procedure Delay(Milliseconds: Integer);
var
Tick: DWord;
Event: THandle;
begin
Event := CreateEvent(nil, False, False, nil);
try
Tick := GetTickCount + DWord(Milliseconds);
while (Milliseconds > 0) and
(MsgWaitForMultipleObjects(1, Event, False, Milliseconds, QS_ALLINPUT) <> WAIT_TIMEOUT) do
begin
Application.ProcessMessages;
if Application.Terminated then Exit;
Milliseconds := Tick - GetTickcount;
end;
finally
CloseHandle(Event);
end;
end;

Kann man die irgenwie hernehmen? Dann bräuchte ich aber wieder die while und hätte das gleiche Problem.....
Hoffe du kannst mir weiterhelfen

Lukas

dominikkv 30. Apr 2010 12:01

Re: Cover-Anzeige für WMP Programmieren
 
Hmm du denkst falsch. Du musst ereignisorientiert denken, das heißt Delphi bestimmt selbst, wann etwas ausgeführt wird. Nimm einfach einen TTimer, klatsch ihn auf die Form und stell ihn entsprechend ein (Intervall in Milisekunden!). Dann machst du einen Doppelklick auf den Timer und du siehst eine OnTimer-Procedure. Diese wird nun in deinem eingestellten Intervall aufgerufen, dh dort kannst du dann dein Cover updaten.

Aber: Warum muss das in einem regelmäßigen Abstand sein? Du brauchst doch nur das Cover zu wechseln, wenn sich auch das Lied wechselt.

LukasB 30. Apr 2010 12:25

Re: Cover-Anzeige für WMP Programmieren
 
Hi Dominik,

zunächst Danke!! Werde deinen Vorschlag vielleicht noch heut Nachmittag umsetzen.
Momentan muss ich Java für die FH proggen.
Zu deiner Frage: vielleicht ist das auch wieder auf meine C-Denke zurückzuführen. Ich dachte mir, dass ich um ein sich änderndes Lied abzufragen auch wieder regelmäßig schauen muss, ob es sich geändert hat, in Pseudocode:

if(title_old!=title-now)
lade_neues_cover();

Das muss ich ja auch in Intervallen tun, du für mich im worst case noch akzeptabel sind.
Also war für mich die Aufgabe eigentlich die selbe: entweder, alle 10 sec Metadaten und Cover aktualisieren, oder alles 10 sec schauen, ob neues Lied läuft und dann u.U. alles aktualisieren. Sicher wäre letzteres effizienter, aber ich denke 3 Labels schreiben und ein Bild laden tut den heutigen Rechnern nicht mehr weh ;-) Nichts desto trotz ist es sicher die bessere alternative, werde also versuchen den Timer zu implementieren und innerhalb dessen schauen, ob ein neues Lied läuft. Wenn ja, aktualisieren, wenn nicht, halt ncihts tun ;-)
Beste Grüße :hi:

Lukas

LukasB 30. Apr 2010 12:50

Re: Cover-Anzeige für WMP Programmieren
 
Hi Leute,

also zunäcsht viele vielen Dank!! konnte doch nicht die Finger davon lassen :wink:
Hab zwar nicht alles fertig, aber der Rest sind halt Design-Arbeiten. Kann mir jetzt die Metadaten rausgeben lassen! :hello:
Das mit dem Timer war echt nicht schwierig, hatte den versucht "zu Fuß" zum implementieren, aber daran bin ich halt gescheitert; naja, und vor allem an der mir bisher verborgen geblieben Ereignisorientiertheit von Delphi: Danke an Dominik :cheers:
Bleibt nur die Frage, wie ich das Thema als erledigt deklarieren kann ;-)
Beste Grüße

Lukas

dominikkv 30. Apr 2010 13:02

Re: Cover-Anzeige für WMP Programmieren
 
Hi Lukas,

in Delphi musst du ein bisschen umdenken: Es gibt zwar noch die Hauptschleife (wie von dir erwähnt Application.Run), mit der hast du als Programmierer aber nichts zu tun! Wenn sich etwas ändert wird Delphi dich informieren.

Beispiel: du hast einen Button. Du willst bei einem Klick darauf etwas ausführen.
a) Polling
Du frägst alle 10 msec ab, ob der Button gedrückt ist. Wenn ja, mache was, wenn nein, mache nichts.
b) Ereignisorientiert
Du machst die ganze Zeit nichts, nur wenn der Button gedrückt wurde ruft Delphi eine Procedure auf, in der du dann was machen kannst.

Und jetzt rate mal, welche Variante performanter und einfacher ist :zwinker:


Was ich dir damit sagen will: weg vom Polling, hin zu Ereignissen! Du wirst höchstwarscheinlich eine Komponente nutzen, um das Lied abzuspielen. Diese wird wahrscheinlich ein Ich-fange-jetzt-an-ein-Lied-zu-spielen und ein Das-Lied-ist-jetzt-zu-Ende Ereignis haben. Genau dort kannst du das Cover ändern.

LukasB 1. Mai 2010 13:38

Re: Cover-Anzeige für WMP Programmieren
 
Hi Leute,

also vielleicht ist mein Titel etwas irreführend; ich hab keinen eigenen Player programmiert ;-)
Nutze den WMP11 und wollte eine Visualisierung nach meinem Geschmack haben: großes Cover + Interpret/Album/Titel.
Das klappt dank euerer Hilfe jetzt super, allerdings hat das ganze einen Makel, den ich mir nicht erklären kann, vielleicht wieder etwas Pascal spezfisches:
Bei Album X&Y von Coldplay zeigt mir mein Programm leider XY an mit folgendem Code: (ich lese die Metadaten aus der Registry)

label5.Caption := ' ' + regist.ReadString('album') + ' ';

Das entsprechende Cover lese ich wie folgt ein, bzw. gebe es wie folgt aus:

jpg.LoadFromFile('E:\Musik gesamt\Musik MP\Cover\'+ regist.ReadString('album')+'.jpg' );
canvas.Draw(50,100,jpg);

Das verrückte ist nun, dass ich das Albumcover, also die entsprechende jpg, X&Y.jpg nennen muss, sonst findet er sie nicht.
Das heißt für mich, dass die Funktion ReadString richtig liest, aber das Label sie nicht richtig rausgeben kann.
Hat jemand von euch eine Ahnung warum?
Viele Grüße

Lukas

DeddyH 1. Mai 2010 13:41

Re: Cover-Anzeige für WMP Programmieren
 
Das "&" sorgt dafür, dass der folgende Buchstabe unterstrichen dargestellt wird. Um das zu vermeiden, musst Du es einfach verdoppeln.

LukasB 1. Mai 2010 14:07

Re: Cover-Anzeige für WMP Programmieren
 
Hi Detlef,

danke für die schnelle Antwort!
Hatte gehofft ich käme um Stringmanipulation herum, aber dann muss ich wohl doch nochmal ran.
Werd dann erstmal bissi rumgooglen und nach Stringfunktionen suchen.
Besser so als garnicht zu wissen, woher es kommt ;-)
Viele Grüße

Lukas


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:32 Uhr.
Seite 1 von 2  1 2      

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