![]() |
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 |
AW: musik abspielen
uses mmsystem;
DELPHI statt DP für die Codeformaatierung |
AW: musik abspielen
Code:
Nur noch den richtigen Pfad anpassen.playsound(pchar('.\sounddatei.wav'),hinstance,snd_async); |
AW: musik abspielen
Zitat:
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:
oder
ExtractFilePath(ParamStr(0))
Delphi-Quellcode:
ganz passend,
ExtractFilePath(Application.ExeName)
also
Delphi-Quellcode:
, bzw.
sndPlaySound(PChar(ExtractFilePath(ParamStr(0)) + 'Strings.wav'), ...
Delphi-Quellcode:
MeinVerzeichnis := ExtractFilePath(ParamStr(0));
sndPlaySound(PChar(MeinVerzeichnis + 'Strings.wav'), ... |
AW: musik abspielen
Zitat:
Gruß |
AW: musik abspielen
Die Unit einfach hinten an die uses-Klausel mit einem Komma getrennt anhängen.
Delphi-Quellcode:
[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]
unit UnitWuppdi;
interface uses Windows, SysUtils, Messages, Classes, {weitere Units}, DeineUnit; |
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? |
AW: musik abspielen
Jepp, ist es, einfach "verodern": SND_ASYNC or SND_LOOP.
|
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ß |
AW: musik abspielen
Das habe ich vor längerer Zeit einmal in einem
![]() |
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????? |
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) |
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 |
AW: musik abspielen
Wie im verlinkten Tutorial bereits angesprochen ist die Verwendung von + und - extrem fehleranfällig und sollte daher gemieden werden.
|
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 |
AW: musik abspielen
Tut mir Leid aber ich verstehe wirklich nicht was ihr meint :/
by the way wofür steht eigentlich das mmsystem? |
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.
|
AW: musik abspielen
Zitat:
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:
Würde es zu einer exception kommen.
PlaySound(PChar(1),HInstance, snd_ASync or snd_Memory)
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 |
AW: musik abspielen
Ich dachte, das Verständnisproblem liegt beim binären Verodern. :gruebel:
|
AW: musik abspielen
Das sollte helfen:
![]() |
AW: musik abspielen
In meinem Tut steht es etwas ausführlicher, scheint aber nicht verständlich zu sein.
|
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.
|
AW: musik abspielen
Zitat:
|
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.
|
AW: musik abspielen
Das ist in diesem Zusammenhang ja auch irrelevant, da die Bitmaske auf Windows-Seite ausgewertet werden soll.
|
AW: musik abspielen
Ja, aber für das Verständnis doch wichtig.
|
AW: musik abspielen
Zitat:
@Luckie :thumb: übersichtlich und verständlich. hab sogar ich kappiert:wink: Zitat:
So wie im Luckies sein Tut. Gruss alfold |
AW: musik abspielen
Zitat:
|
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:| |
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 |
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: ![]() Bernhard |
AW: musik abspielen
Und zu den Binärwerten: 100 => 64 + 32 + 4
Code:
Jetzt die 1 dazu:
01100100
Code:
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:
01100101
Delphi-Quellcode:
Beim Auswerten geht das dann analog
const
flRead = 1; flWrite = 2; flReadWrite = flRead or flWrite; // = 3
Delphi-Quellcode:
if Bitmaske and flRead = flRead then //Lese-Bit gesetzt
|
AW: musik abspielen
Zitat:
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 |
AW: musik abspielen
Dann macht er wohl irgendetwas anders :glaskugel:
|
AW: musik abspielen
kann es keiner "noch" einfach für mich erklären bitte?
Grüße |
AW: musik abspielen
Zitat:
Zitat:
gruss |
AW: musik abspielen
Zitat:
Bernhard |
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 :|
|
AW: musik abspielen
welche Informationen meinst du denn?
Was möchtest du wissen? Grüße |
AW: musik abspielen
Zitat:
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:
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:
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 00:25 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 by Thomas Breitkreuz