Autor Beitrag
McNugget
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 11.03.10 12:23 
Hallo allerseits.

Ich bin quasi blutiger Anfänger in Delphi und habe noch grosse Probleme damit.

Aus einem Beispielprojekt habe ich mir schon mal etwas zusammenbasteln können, was schon sehrmeinen Anforderungen entspricht.

Ich habe das Projekt gezippt und mit Unterordner "Nummern" angehängt.

Zum Standard Delphi habe ich die Jedi VCL for Delphi zusätzlich eingebunden:
jvcl.delphi-jedi.org/


In meiner grafischen Oberfläche sieht man diverse Bits die als LED dargestellt sind.

In aller Regel sollen diese LED inaktiv sein. Aber wenn eine LED aktiv wird, soll sofort eine WAV-Datei aus dem Verzeichnis "Nummern" endlos abgespielt werden, bis die LED wieder erlischt, oder bis jemand in der grafischen Oberfläche eine "Mute"-Taste oder etwas ähnliches klickt.

Wie geht das?

Könnte mir jemand helfen und den fehlenden Code ergänzen?

Wie gesagt, verändern kann ich, aber selber schreiben leider noch nicht.

Ich habe auch noch grosse Probleme mit den Begrifflichkeiten wie Uses etc..
Daher bitte auf niedrigstem Level mit mir schreiben. Step by step.


Vielen Dank bereits im Voraus für Eure Mühen.

McNugget
Einloggen, um Attachments anzusehen!
McNugget Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 11.03.10 21:15 
Ist meine Aufgabenstellung so exotisch? Oder habe ich etwas nicht beachtet?


Gruss

McNugget
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Do 11.03.10 22:08 
Ja, du hast nicht beachtet das du eine konkrete Fragen stellen solltest, wir sicher nicht dein programm für dich programmieren werden, du für jede frage einen neuen Thread aufmachen solltest und das pushen erst nach 24 stunden erlaubt ist. Such dir ein davon aus. ;)

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
McNugget Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 12.03.10 09:13 
Hallo Elundril.

Wie ich bereits schrieb, bin ich relativ unsicherer Einsteiger. Da ich aus Unwissenheit auf Rückfragen schlecht antworten kann, da mir nicht alle Begrifflichkeiten in Delphi geläufig sind, habe ich mein Projekt komplett eingestellt. Dadurch hat jeder potentielle Helfer die Möglichkeit, meinen wüsten Code anzuschauen.

Sicher war es nicht so gedacht, dass ich erwarte, dass mir jemand schlüsselfertig etwas hinwirft, ich möchte ja weiter Erfahrungen sammeln.


Es tut mir leid, zu früh gepusht zu haben. Da sind tatsächlich die Pferde mit mir durchgegangen.

Nun die konkrete Fragen (ein Thread pro Frage wäre, glaube ich, übertrieben):
Wie integriere ich (für mich verständlich) einen Player für .WAV Dateien in mein Programm?
Wie sieht der Befehl aus, ihn von aussen mit einer Datei zu belegen, die abgespielt werden soll?
Wie lasse ich das Programm im Hintergrund weiterlaufen?
Wie unterbreche ich den Player sofort, wenn sich etwas ändert?

Ich hoffe, das kommt den Anforderungen hier im Board etwas näher und entschuldige mich noch mal für anfänglichen Unsicherheiten.


Gruss

McNugget
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Fr 12.03.10 17:05 
Hallo und :welcome: im Delphi-Forum,

(hab ich gestern vergessen, aber ich hoffe angesichts der Uhrzeit meines Posts kannst du darüber hinwegsehen.

Ok, freut mich das du selbst programmieren willst, ich hatte gestern anderes angenommen aufgrund des folgenden Satzes.
user profile iconMcNugget hat folgendes geschrieben Zum zitierten Posting springen:
Könnte mir jemand helfen und den fehlenden Code ergänzen?


Das mit dem "erst ab 24 stunden" pushen weißt du zumindest jetzt. ;)

Die eine Frage pro Thread ist aus dem Grund, das manche Fragen sich nicht mit einem Posts abhandeln lassen können und es sonst zu verwirrend für uns und vor allem auch für dich wird wenn jetzt 5 fragen quer herum beantwortet werden und weder wir noch du weißt welche Antwort zu welcher Frage gehört. Um diesen Unklarheiten vorzubeugen nimmt das Foren-Team gern mal etwas mehr speicherplatz in kauf wenn dafür die user einen nutzen daraus ziehen ;)

So, nun zu deinen Fragen dich ich mal oberflächlich beantworten kann:
Sound kannst du mit der Komponente TMediaPlayer abspielen. Dazu kann ich dir dieses Kapitel auf den Delphi-Wikibook empfehlen (auch das Wikibook als ganzes ist empfehlenswert wenn du noch Einsteiger bist).

Wie du dann dem TMediaPlayer Dateien zum abspielen zuweisen kannst, kannst du in der Delphi-Hilfedatei nachlesen (F1 drücken zum aufrufen der Delphi-Hilfe).

Kommt darauf an was du meinst mit Hintergrund weiterlaufen. Wenn du meinst, das zum Beispiel die Musik weiterläuft wenn ein anderes Programm im vordergrund ist, dann geht das automatisch. ;) Wenn du aber meinst das wenn ein benutzer dein Programm schließt, das es dann noch weiterspielt, da musst man dann schon weiter nachhacken -> neuer Thread wäre angebracht. ;)

Das unterbrechen des MediaPlayers steht ebenfalls in der Delphi-Hilfe. ;)

Außerdem würd ich dir empfehlen Christian's Crashkurs mal zu lesen, damit du dich bei solchen Begriffen wie Uses und so weiter auskennst. Diese sind wichtig um dich mit anderen Programmieren zu verständigen, ungefähr so wie die Sprache der Mathematik für Mathematiker und die lateinischen Fachbegriffe für Mediziner zum Beispiel.

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
McNugget Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 16.03.10 15:52 
Hallo elundril (und auch alle anderen, die das hier lesen mögen).

Vielen Dank für die Links. Ich habe jetzt erst mal den Crash-Kurs gelesen. und noch mal nach TMediaPlayer gesucht.

Ich habe auch schon etwas "gespielt". ;-)

Nun komme ich aber wieder nicht weiter, weil ich etwas Kopfsalat ob der vielen möglichen Optionen und Wege gibt.

Leider muss ich wieder einen Block aus Frage lospusten, aber ich versehe sie mal mit einem Index. ;-)

(Ich hoffe, anhand der Fragen kann das jeder nachvollziehen.)

Es werden diverse (ca. 30) Bedingungen im 1-Sekunden-Takt abgefragt.


1. Jede Bedingung soll eine spezifische Wav-Datei in eine Playlist des TMedia-Players einfügen.

Wenn eine Bedingung wieder wegfällt, soll der dazugehörige Eintrag sofort wieder aus der Playlist entfernt werden. Wenn es mehrere Elemente in der Playlist gibt, und das was gerade gespielt wird wegfällt, soll der Player sofort (noch im Abspielen des obsoleten Elements) zum nächsten Element springen.

2. Der Player soll, sobald die Playlist >1 Eintrag ist, abspielen und sofort (noch im Abspielen) stoppen, wenn die Elemtliste =0 ist.


Wie lässt sich so etwas anfangen?


Gruss

McNugget
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Di 16.03.10 16:07 
dann muss du in 1 sekundentakt mal alle elemente aus der playlist entfernen die nicht mehr zutreffen und jene hinzufügen die neu drin sind. (for-schleife, while-schleife oder eine andere schleife deiner wahl). Dann würd ich schauen ob im MediaPlayer1.Filename ein File drinsteht das entfernt werden muss. wenn dies der Fall ist, dann soll er "MediaPlayer1.Stop;" ausführen, "MediaPlayer1.Close", dann den Filename an der ersten Stelle nehmen, sofern vorhanden und dann "MediaPlayer1.Open" und "MediaPlayer1.Play" ausführen, wenn ein filename vorhanden. damit ist punkt 2 auch gleich gewährleistet. ;)

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
smt
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 45



BeitragVerfasst: Di 16.03.10 17:16 
Hallo,

ich hab mich jetzt mit dem Problem als solches nicht intensiver beschäftigt, aber ein kleiner Tipp, was deinen Code eventuell etwas lesbarer macht

Du hats ganz viele solche Konstrukte drin:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
...
if (DynByteArray[5and 32) <> 0 then
     begin
    jvled38.Active  := True;
    end
   else
   begin
    jvled30.Active  := False;
    jvled30.Status  := False;
    end;

  if (DynByteArray[5and 64) <> 0 then
     begin
    jvled39.Active  := True;
    end
   else
   begin
    jvled30.Active  := False;
    jvled30.Status  := False;
    end;
...

Du kannst die Komponenten auch anders ansprechen und sparst Dir viel Code:

ausblenden Delphi-Quelltext
1:
2:
3:
for i:=1 to xxx do begin
   (findcomponent('jvled' + IntToStr(i * irgendwas)) as TJvLed).Active:=false;
end;

Ist natürlich nur ein Beispiel.
Die Komponente muss natürlich existieren unter diesem Namen. Aber dann kannst Du das setzen der LED's in eine Schleife packen.

VG Sascha

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
McNugget Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 31.03.10 09:12 
Hallo smt,

sorry, dass ich erste jetzt antworte, aber ich war im Urlaub.

Leider kann man es nicht per Schleife regeln, da es innerhalb der Elemente der Schleife auch welche gibt, die sich anders verhalten.

zum Beispiel gibt es mitten in der Reihe der Störmeldungen auch einen RUN-Meldung, die anders behandelt werden muss.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
 if (DynByteArray[0and 8) <> 0 then
     begin
    jvled12.Status  := True;
    end
   else
   begin
    jvled12.Active  := False;
    jvled12.Status  := False;
    end;

  if (DynByteArray[0and 16) <> 0 then
     begin
    jvled13.Active  := True;
    end
   else
   begin
    jvled13.Active  := False;
    jvled13.Status  := False;
    end;

  if (DynByteArray[0and 32) <> 0 then
     begin
    jvled14.Status  := True;
    end
   else
   begin
    jvled14.Status  := False;
    jvled14.Status  := False;
    end;




Aber dazu stellt sich mir die nächste Frage: Wie könnte man das am elegantesten lösen?
Schreibe ich gleichartige Elemente in eine neue (von den Bedingungen her eiheitliche) Liste und werte diese dann mit Schleife aus?
Oder mache ich zwei Schleifen (eine bis z.B Element 12, die nächste ab Element 14) um das eine andersartige Element zu überspringen??

Ausserdem können mehrer Elemente der Schleife gleichzeitig aktiviert sein, dies müsste dann auch sofort in der Soundausgabe berücksichtigt werden.

Leider muss ich hier das als gegeben hinnehmen, was andere gebastelt haben.

Vielen Dank auf jeden Fall für´s Lesen meines Quelltexts.

(Langsam habe ich das Gefühl, ich bin zu alt es zu lernen, oder zu unbegabt...)

Gruss

McNugget