Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   musik abspielen (https://www.delphipraxis.net/160189-musik-abspielen.html)

Coxy 1. Mai 2011 22:37

Delphi-Version: 5

musik abspielen
 
Hallo,
ich versuche in meinem Programm gerade Musik abspielen zu lassen.
Dazu benutze ich diesen Code
[DP]sndPlaySound(PChar('C:\Users\Anonym\Desktop\Delphi Project\Strings.wav'),SND_LOOP);[/DP]

Dann kommen allerdings Fehler mit denen ich nichts anfangen kann und zwar:
undefinierte Bezeichnung sndPlaySound
undefinierte Bezeichnung SND_LOOP

Wo liegt das Problem denn genau?
Grüße

Bummi 1. Mai 2011 22:42

AW: musik abspielen
 
uses mmsystem;

DELPHI statt DP für die Codeformaatierung

xxsasch4xx 1. Mai 2011 22:43

AW: musik abspielen
 
Code:
 
playsound(pchar('.\sounddatei.wav'),hinstance,snd_async);
Nur noch den richtigen Pfad anpassen.

himitsu 2. Mai 2011 07:11

AW: musik abspielen
 
Zitat:

Dann kommen allerdings Fehler mit denen ich nichts anfangen kann und zwar:
undefinierte Bezeichnung
Ist eigentlich ganz einfach.

Der Compiler kennt an dieser Stelle diese Befehle/Konstanten nicht,
bzw. diese wurden vorher nirgendwo deklariert und existieren demnach nicht.

Wenn man hier nun die nötige Unit einbindet und somit dem Compiler vorher sagt, daß es das gibt (in dieser Unit sind diese Dinge ja deklariert),
dann kann er sie finden und alles ist gut.



Ansonsten: Verwende besser keine statischen absoluten Pfade,
denn diese stimmen nur auf deinem aktuellen System/PC und nicht bei Anderen.
Relative Pfade sind allerdings auch nicht sonderlich gut, da diese nicht vom Pfad der EXE ausgehn, sondern vom aktuellen Arbeitsverzeichnis.
Dynamische absolute Pfade wären da besser.

Wenn deine EXE also auch in C:\Users\Anonym\Desktop\Delphi Project\ liegt, dann wäre
Delphi-Quellcode:
ExtractFilePath(ParamStr(0))
oder
Delphi-Quellcode:
ExtractFilePath(Application.ExeName)
ganz passend,
also
Delphi-Quellcode:
sndPlaySound(PChar(ExtractFilePath(ParamStr(0)) + 'Strings.wav'), ...
, bzw.
Delphi-Quellcode:
MeinVerzeichnis := ExtractFilePath(ParamStr(0));

sndPlaySound(PChar(MeinVerzeichnis + 'Strings.wav'), ...

Coxy 2. Mai 2011 14:48

AW: musik abspielen
 
Zitat:

Ist eigentlich ganz einfach.

Der Compiler kennt an dieser Stelle diese Befehle/Konstanten nicht,
bzw. diese wurden vorher nirgendwo deklariert und existieren demnach nicht.

Wenn man hier nun die nötige Unit einbindet und somit dem Compiler vorher sagt, daß es das gibt (in dieser Unit sind diese Dinge ja deklariert),
dann kann er sie finden und alles ist gut.
und wie genau mach ich das? (Nur zur Anmerkung ich benutze Delphi 6)
Gruß

DeddyH 2. Mai 2011 14:51

AW: musik abspielen
 
Die Unit einfach hinten an die uses-Klausel mit einem Komma getrennt anhängen.
Delphi-Quellcode:
unit UnitWuppdi;

interface

uses Windows, SysUtils, Messages, Classes, {weitere Units}, DeineUnit;
[edit] Wenn Du allerdings im interface-Teil noch nicht auf Klassen oder Routinen der einzubindenden Unit zugreifst, kannst Du auch im implementation-Teil eine uses-Klausel einfügen bzw. wie beschrieben erweitern. [/edit]

Coxy 2. Mai 2011 15:11

AW: musik abspielen
 
Vielen dank, es klappt jetzt
aber die Musik Datei wird nicht wiederholt obwohl ich am Ende ein SND_LOOP stehen habe.
Und ich würde gern das SND_LOOP mit dem SND_ASYNC kombinieren ist das überhaupt Möglich?

DeddyH 2. Mai 2011 15:15

AW: musik abspielen
 
Jepp, ist es, einfach "verodern": SND_ASYNC or SND_LOOP.

Coxy 2. Mai 2011 15:42

AW: musik abspielen
 
super läuft jetzt alles wie ich es wollte :)

PS: eine letzte Frage noch
warum heißt es SND_ASYNC or SND_LOOP
und nicht SND_ASYNC and SND_LOOP?

Also nur vom Prinzip her jetzt or heißt doch das eine oder das andere aber ich ja beides sozusagen ein und haben

Gruß

DeddyH 2. Mai 2011 15:44

AW: musik abspielen
 
Das habe ich vor längerer Zeit einmal in einem Tutorial beschrieben.

Coxy 2. Mai 2011 16:21

AW: musik abspielen
 
Ehrlich gesagt verstehe ich es nicht ganz:
or - Das Ergebnis ist dann 1, wenn mindestens eins der zu vergleichenden Bits 1 ist

Ich verstehe nicht wie das die beiden Befehle verbinden soll:
wenn async and ist und aloop aus das ist 1?????

DeddyH 2. Mai 2011 17:07

AW: musik abspielen
 
Ich kenne jetzt die Werte dieser beiden Konstanten nicht auswendig, möchte aber wetten, dass es 2er-Potenzen sind. Sagen wir einfach mal, SND_ASYNC sei 4 und SND_LOOP 16, dann ergibt
Delphi-Quellcode:
SND_ASYNC or SND_LOOP
Code:
00000100  //SND_ASYNC (4)
00010000  //SND_LOOP (16)
========
00010100  //SND_ASYNC or SND_LOOP (20)

rollstuhlfahrer 2. Mai 2011 18:35

AW: musik abspielen
 
Ich müsste die Werte jetzt auch nachschlagen, aber man könnte ja auf die Idee kommen, dass man "+" verwenden kann (kommt ja das selbe raus). Sollte man aber nicht, da es auch Konstanten gibt, die andere Konstanten enthalten (z.B. Rechte beim Zugriff auf Dateien/Registry). Da hilft nur ein OR weiter.

Bernhard

DeddyH 2. Mai 2011 18:48

AW: musik abspielen
 
Wie im verlinkten Tutorial bereits angesprochen ist die Verwendung von + und - extrem fehleranfällig und sollte daher gemieden werden.

Aphton 2. Mai 2011 18:58

AW: musik abspielen
 
ja, ein Beispiel dazu wäre das hier:
OR
00000011 (3)
00000001 (1)
--------
00000011 (3)

+
00000011 (3)
00000001 (1)
--------
00000100 (4)

4 <> 3

Coxy 2. Mai 2011 21:10

AW: musik abspielen
 
Tut mir Leid aber ich verstehe wirklich nicht was ihr meint :/

by the way wofür steht eigentlich das mmsystem?

DeddyH 2. Mai 2011 21:57

AW: musik abspielen
 
mm dürfte wohl Multimedia heißen. Und was verstehst Du nicht? Du musst doch nur die binär dargestellten Zahlen Bit für Bit oben mit unten vergleichen.

alfold 2. Mai 2011 22:12

AW: musik abspielen
 
Zitat:

Zitat von Coxy (Beitrag 1098446)
Tut mir Leid aber ich verstehe wirklich nicht was ihr meint :/

by the way wofür steht eigentlich das mmsystem?

mmsystem = Multimedia und stellt die Verbindung zur Windows eigenen mediaApi zu verfügung.

Und was die Parameter übergabe betrifft, bedeutet dies lediglich eine Entscheidung des system was es benutzen soll/kann.(Ausschlussverfahren)
Hier mal ein kleines Beispiel:
Delphi-Quellcode:
PlaySound(PChar(1), HInstance, snd_ASync or snd_Memory or snd_Resource)

Was ist HInstance? Ich weiss es, weil ich es da rein geschrieben habe.

Würde ich jetzt schreiben:
Delphi-Quellcode:
PlaySound(PChar(1),HInstance, snd_ASync or snd_Memory)
Würde es zu einer exception kommen.
Grund, HInstance ist der Zeiger auf eine resource und nicht auf ein Speicherplatz.(Simpel ausgedrückt)

Also entscheidet die Api sozusagen selbst welches es verwenden soll/kann!
Ich hoffe das ich es so einfach wie möglich erklärt habe.

Gruss alfold

mal sehen was die anderen dazu sagen

DeddyH 2. Mai 2011 22:35

AW: musik abspielen
 
Ich dachte, das Verständnisproblem liegt beim binären Verodern. :gruebel:

Luckie 2. Mai 2011 22:40

AW: musik abspielen
 
Das sollte helfen: http://www.michael-puff.de/Programmi...itMasken.shtml

DeddyH 2. Mai 2011 22:45

AW: musik abspielen
 
In meinem Tut steht es etwas ausführlicher, scheint aber nicht verständlich zu sein.

Luckie 2. Mai 2011 22:47

AW: musik abspielen
 
Deins kenne ich nicht. Aber hier im Thread hat immer der zweite teil gefehlt, wie man die Verknüpfung wieder auflöst.

BUG 2. Mai 2011 22:54

AW: musik abspielen
 
Zitat:

Zitat von Luckie (Beitrag 1098465)
Aber hier im Thread hat immer der zweite teil gefehlt, wie man die Verknüpfung wieder auflöst.

Meinst du damit das Abfragen einzelner Bits :gruebel:

Luckie 2. Mai 2011 23:01

AW: musik abspielen
 
Es wurde immer nur gesagt mit or Verknüpfen, aber wie man wieder ermittelt welche Bits gesetzt sind, wurde nicht erklärt -- oder ich habe es überlesen.

DeddyH 2. Mai 2011 23:05

AW: musik abspielen
 
Das ist in diesem Zusammenhang ja auch irrelevant, da die Bitmaske auf Windows-Seite ausgewertet werden soll.

Luckie 2. Mai 2011 23:10

AW: musik abspielen
 
Ja, aber für das Verständnis doch wichtig.

alfold 2. Mai 2011 23:12

AW: musik abspielen
 
Zitat:

Zitat von Luckie (Beitrag 1098468)
Es wurde immer nur gesagt mit or Verknüpfen, aber wie man wieder ermittelt welche Bits gesetzt sind, wurde nicht erklärt ....

So ist es leider.
@Luckie :thumb: übersichtlich und verständlich. hab sogar ich kappiert:wink:

Zitat:

Zitat von DeddyH (Beitrag 1098469)
Das ist in diesem Zusammenhang ja auch irrelevant, da die Bitmaske auf Windows-Seite ausgewertet werden soll.

währe aber für @Coxy wichtig gewesen zu wissen wie das nun ausgewertet wird, um es zu verstehen.

So wie im Luckies sein Tut.

Gruss alfold

DeddyH 3. Mai 2011 07:03

AW: musik abspielen
 
Zitat:

Zitat von alfold (Beitrag 1098472)
Zitat:

Zitat von DeddyH (Beitrag 1098469)
Das ist in diesem Zusammenhang ja auch irrelevant, da die Bitmaske auf Windows-Seite ausgewertet werden soll.

währe aber für @Coxy wichtig gewesen zu wissen wie das nun ausgewertet wird, um es zu verstehen.

So wie im Luckies sein Tut.

Ihr tut (:mrgreen:) ja alle so, als stünde das in meinem nicht drin.

alfold 3. Mai 2011 10:53

AW: musik abspielen
 
Sorry @DeddyH wenn das so rübergekommen ist:cry:
Natürlich ist Dein Tut genauso :thumb: aber sehr Umfangreich.
Wenn ich als Neuling dies lese, am Ende angekommen bin, habe ich den Anfang schon wieder vergessen. Genauer gesagt, es behandelt nicht nur solchen Fall, ich muss es mehrmals lesen um es zu verstehn.
Und dann im einklang zubringen mit diesem speziellen Fall.
Dies geht leider so einfach nicht, beides gleich zu kapieren.
Dein Tut und dieser Fall.
Im gegenzug von @Luckie, es bezieht sich förmlich darauf.

Also schlagt mich tot, steinigt mich, wenn ich da falsch liege!

Gruss alfold

PS: Wichtiger währe evtl Erleuterungen Simple zu machen ala praktisches Beispiel so wie ich es versucht habe. Auch wenn es vielleicht nicht ganz gelungen ist:|

Coxy 12. Mai 2011 15:24

AW: musik abspielen
 
Okay,
also würden jetzt z.B aus den beiden: snd_async =1 und snd_loop = 100 ein neuer wert undzwar 101.
Woher weiß man aber welchen Zahlen-Wert die Befehle haben? Gibt es vielleicht eine ausführliche Einführung in das Binärsystem das speziell für Anfänger ausgerichtet?

und meine eigentlich wichtigere frage ist:
hinstace zeigt also auf eine Ressource.
1) Was ist eine Ressource/ Was macht diese
2) Welche konkrete Bedeutung hat es für den Befehl Playsound?

Freundliche Grüße
Coxy

rollstuhlfahrer 12. Mai 2011 15:42

AW: musik abspielen
 
Ressource ist die Quelle deiner Informationen. Diese Quelle kann grundsätzlich verschiedene Typen haben . Mit hInstance gibst du an, dass der Sound innerhalb deiner Anwendung abgespielt werden soll und nicht z.B. als Systemsound.
Da du mit deiner Funktion auch WAV-Ressourcen (sind in die EXE einkompiliert, liegen als *.RES-Datei vor) abspielen kannst, muss das System UNBEDINGT wissen, aus WELCHER Datei es die Informationen laden soll.

Das gehört zwar zu einem anderen Thema, erklärt aber auch, was hInstance ist: http://blogs.msdn.com/b/oldnewthing/...18/409205.aspx

Bernhard

DeddyH 12. Mai 2011 15:54

AW: musik abspielen
 
Und zu den Binärwerten: 100 => 64 + 32 + 4
Code:
01100100
Jetzt die 1 dazu:
Code:
01100101
Jedes Bit kann einen Wert repräsentieren (oder auch nicht, dann wird es aber normalerweise schlicht ignoriert). Schlaue Programmierer deklarieren jetzt zu diesen Bits sprechende Konstanten, damit man weiß, wofür das einzelne Bit steht. Das funktioniert natürlich auch für Bit-Kombinationen, z.B. so:
Delphi-Quellcode:
const
  flRead = 1;
  flWrite = 2;
  flReadWrite = flRead or flWrite; // = 3
Beim Auswerten geht das dann analog
Delphi-Quellcode:
if Bitmaske and flRead = flRead then //Lese-Bit gesetzt

Coxy 18. Mai 2011 15:13

AW: musik abspielen
 
Zitat:

Zitat von rollstuhlfahrer (Beitrag 1100450)
Ressource ist die Quelle deiner Informationen. Diese Quelle kann grundsätzlich verschiedene Typen haben . Mit hInstance gibst du an, dass der Sound innerhalb deiner Anwendung abgespielt werden soll und nicht z.B. als Systemsound.
Da du mit deiner Funktion auch WAV-Ressourcen (sind in die EXE einkompiliert, liegen als *.RES-Datei vor) abspielen kannst, muss das System UNBEDINGT wissen, aus WELCHER Datei es die Informationen laden soll.

Das gehört zwar zu einem anderen Thema, erklärt aber auch, was hInstance ist: http://blogs.msdn.com/b/oldnewthing/...18/409205.aspx

Bernhard

Also würde das Lied automatisch stoppen, wenn ich die Anwendung schließe, wenn ich hinstance benutze?

Ich dachte der Verweis gibt Auskunft darüber, welche Datei es abspielen soll.

Was ich aber nicht verstehe,
mein Freund benutzt auch Musik nur funktioniert das bei ihm auch ohne hinstance,
bei mir kommt jedoch der Fehler: nicht genüged Parameter????

Dein Link ist zwar nett,
jedoch bin ich ein Anfänger und verstehe daher (fast) nichts :/

Grüße

DeddyH 18. Mai 2011 15:19

AW: musik abspielen
 
Dann macht er wohl irgendetwas anders :glaskugel:

Coxy 18. Mai 2011 19:41

AW: musik abspielen
 
kann es keiner "noch" einfach für mich erklären bitte?
Grüße

EWeiss 18. Mai 2011 19:47

AW: musik abspielen
 
Zitat:

Zitat von Coxy (Beitrag 1101644)
kann es keiner "noch" einfach für mich erklären bitte?
Grüße

Zitat:

Handle to the instance of the module to be associated with the window.
Sorry aber noch einfacher geht es nicht.

gruss

rollstuhlfahrer 18. Mai 2011 20:35

AW: musik abspielen
 
Zitat:

Zitat von DeddyH (Beitrag 1101563)
Dann macht er wohl irgendetwas anders :glaskugel:

Ja, und zwar vor allem bei snd_play mit *_LOOP. Da knallt es nämlich, wenn man die Anwendung beendet und nicht vorher den Sound wieder abstellt (-> MSDN). Das Problem hatte ich nämlich, als ich einem Freund ein Programm für den Info-Unterricht geschrieben habe.

Bernhard

DeddyH 18. Mai 2011 21:04

AW: musik abspielen
 
Ich helfe ja gerne, wenn ich kann, aber wenn der TE dann nicht mit ausreichenden Infos herausrückt vergeht mir schon ein bisschen die Lust :|

Coxy 18. Mai 2011 21:55

AW: musik abspielen
 
welche Informationen meinst du denn?
Was möchtest du wissen?
Grüße

alfold 18. Mai 2011 22:37

AW: musik abspielen
 
Zitat:

Zitat von Coxy (Beitrag 1101561)
Also würde das Lied automatisch stoppen, wenn ich die Anwendung schließe, wenn ich hinstance benutze?

Die Unit mmsystem ist nur die Schnittstelle zur windowsapi.
Egal ob du hinstance benutzt oder nur files auf der Festplatte
Wenn du Loop benutzt wird es auch hier krachen, weil der Loop auf diese Resource zugreift!
Wurde aber schon genannt!
Du musst also den sound stoppen, bevor Du Dein Programm beendest!
Zitat:

Zitat von Coxy (Beitrag 1101561)
Ich dachte der Verweis gibt Auskunft darüber, welche Datei es abspielen soll.

Ja, nur musst du da noch einiges beachten!
HInstance zeigt nur auf den Inhalt Deiner Exe. Dort könnte man auch MusikDateien einbinden. Das einbinden geht aber nur einmal! Dann sind diese MusikDateien immer in deiner EXE. Ein späteres ändern geht nur, wenn Du dein Prog mit Neuen MusikDateien compelierst!
Anbei, Deine Exe wird dann aber auch seeehr Big:wink:

Zitat:

Zitat von Coxy (Beitrag 1101561)
Was ich aber nicht verstehe,
mein Freund benutzt auch Musik nur funktioniert das bei ihm auch ohne hinstance,
bei mir kommt jedoch der Fehler: nicht genüged Parameter????

Dann benutzt er nur Dateien die auf der Festplatte sind!
Und die werden so geladen, wie Du es schon oben aufgeführt hast! ohne hinstance

Also denke dran. Wenn du loop ausführst und Du willst Dein Programm beenden, musst Du vorher den Sound Stoppen.

Ansonsten gibt es für das mmsystem genügend Beispiele hier im Forum.
Einfach mal ein paar testen(suche im Forum benutzten).

Wenn Dein Prog dann immer noch nicht funct, dann solltest Du aber auch ein bischen Code Zeigen wo an welcher Stelle es zu Probleme kommt. Nur so kann man auch effektiv Helfen.
Alles andere währe nur Raten:|

Gruss alfold


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:45 Uhr.

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