| Autor |
Beitrag |
pascal4free
      
Beiträge: 47
Win2000
D8SSL
|
Verfasst: Mi 22.12.04 18:24
jo, erstmal bisserl Quelltext:
CLient:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.TB_ReglerChange(Sender: TObject); var volume: integer; begin volume:=TB_Regler.Position; if (volume<=20) and (volume>=0) then client.socket.sendtext(inttostr(volume)); end; |
TB_Regler ist ne Trackbar mit 20 "Haltepunkten"
Server
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket); var text: string; volume: integer; begin text:=socket.receivetext; lb_control.Items.add(text); try if (strtoint(text)<=20) and (strtoint(text)>=0) then begin volume:=strtoint(text)*3276; SetWaveVolume(MakeLong(volume,volume)); end; except if text='Mute' then SetMasterMuteValue(0, true); if text='Muteoff' then SetMasterMuteValue(0, false); end; end; |
Das Problem ist nun folgendes, während ich die Trackbar verschiebe kann ich auf dem Serversocket auch einwandfrei Zahlen von 0 bis 20 empfangen, nur sobald ich die Trackbar loslasse kriege ich immer den entsprechenden Wert doppelt hintereinander (aus 11 wird 1111, aus 20 2020 etc). Wie man sieht hab ich das schon versucht abzufangen, aber geht leider irgendwie nicht.
Weiss einer was da dran falsch sein könnte? die Procedure liegt auf dem Ereigniss "OnChange" von der Trackbar. Gibts evt eine andere Art direkt Integer-Werte zu übertragen? Hab dafür nirgends was gefunden.
Die ServerSocket und ClientSocket Komponenten sind noch die standart dinger von D5, die Proz./Funkt. SetmasterValue usw steuern nur diverse Audiosachen
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 22.12.04 18:46
Moin!
| pascal4free hat folgendes geschrieben: | Delphi-Quelltext 1: 2: 3: 4:
| if (volume<=20) and (volume>=0) then client.socket.sendtext(inttostr(volume));
text:=socket.receivetext; | |
Das wird so nix. Ich kann zwar jetzt auch nicht aus dem Handgelenk schütteln, wieso genau da beim Loslassen nochmal ein Ereignis auftritt, das eine Wertänderung mitteilt, aber ohne ein Protokoll kommst du da nicht weiter.
Ganz simpler Vorschlag: du sendest nicht einfach den Wert als String, sondern z.B. sowas:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| SendCmd := TStringList.Create; SendCmd.Add('VOL'); SendCmd.Add('CHG'); SendCmd.Add(IntToStr(volume)); SendCmd.Add(''); Client.Socket.SendText(SendCmd.CommaText); SendCmd.Free; |
Das liefert dann "VOL,CHG,20," beim Server ab. Dabei ist der letzte Leerstring wichtig, damit verkettete Ereignisse getrennt werden.
Auf der Serverseite zerlegst du dann den empfangenen String z.B. so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| RecvCmd := TStringList.Create; RecvCmd.CommaText := Socket.ReceiveText; if (RecvCmd.Count >= 3) then begin if (RecvCmd.Strings[0] = 'VOL') then begin if (RecvCmd.Strings[1] = 'CHG') then begin end else if (RecvCmd.Strings[1] = 'MUT') then begin end; end else if (RecvCmd.Strings[0] = 'DEV') then begin end else if (RecvCmd.Strings[0] = 'GLO') then begin end; end else ShowMessage('Kommando fehlerhaft!'); RecvCmd.Free; |
Das ist jetzt vielleicht nicht das, was man effizient nennt, aber das Prinzip sollte klar sein.
cu
Narses
|
|
pascal4free 
      
Beiträge: 47
Win2000
D8SSL
|
Verfasst: Mi 22.12.04 19:13
hi, das ganze funzt zwar auch, aber irgendwie behebt das mein problem nicht. dennoch baue ich das ganze Programm mit Stringlists um, ist sowieso besser wenn ich noch mehr Funktionen einbaue.
Aber back to problem, mit deinen Stringlist kriege ich als letztes Gesendetes immer: "Chg,Vol,X,Chg,Vol,X" (X= Volume). Zwar kann ich jetzt alles verarbeiten, aber irgendwie ist das das noch nicht das wahre, es muss doch einen Grund geben warum das passiert
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 22.12.04 19:21
Behebt auch nicht die Ursache, aber wie wäre es, wenn du dir auf der Client-Seite merkst, was du als letztes an den Server gesendet hast und nur dann was Neues sendest, wenn sich der Wert geändert hat? Filtert eben diese Redundanzen.
//EDIT: das folgende ist natürlich Blödsinn, s. nächstes Posting von mir
Ahh, hab deinen Fehler gefunden, du machst da sowas:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.TB_ReglerChange(Sender: TObject); var volume: integer; begin volume:=TB_Regler.Position; if (volume<=20) and (volume>=0) then client.socket.sendtext(inttostr(volume)); end; |
Lass die Zeile mit dem "volume :=" weg, der neue Wert steht doch schon in "volume"...
cu
Narses
Zuletzt bearbeitet von Narses am Do 23.12.04 12:50, insgesamt 3-mal bearbeitet
|
|
pascal4free 
      
Beiträge: 47
Win2000
D8SSL
|
Verfasst: Mi 22.12.04 19:43
hmm, ich werds wohl einfach so lassen, da die letzten 2 werte sowieso immer Identisch sind (anscheinend hängt das alles ja nicht an der Trackbar sondern am Übertragen, sonst hätte ich das ja mit Größenvergleichen (s. 1 Bsp) ausschließen können).
Dennoch nochmal BigThx, durch deine Stringlists hat sich nämlich das Problem erübrigt wie ich diverse Commandos ordentlich verarbeiten kann.
Ich lasse hier mal noch etwas auf falls doch noch jemand weiss woher das mit den Doppelten Werten kommt, heute nacht/morgen mach ich dann aber dicht.
edit: ok, prob wäre behoben, close
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Mi 22.12.04 20:47
| Narses hat folgendes geschrieben: |
Ahh, hab deinen Fehler gefunden, du machst da sowas:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.TB_ReglerChange(Sender: TObject); var volume: integer; begin volume:=TB_Regler.Position; if (volume<=20) and (volume>=0) then client.socket.sendtext(inttostr(volume)); end; |
Lass die Zeile mit dem "volume :=" weg, der neue Wert steht doch schon in "volume"... |
Wenn er das weglässt, dann ist volume=0, denn in volume wurde vorher ja noch nichts gespeichert, oder???
Das ganze liegt daran, dass beim loslassen eben nochmal die procedure aufgerufen wird, und das sorgt acuh fürs doppelte senden.
Mach volume global und überprüfe erst, ob volume <> Trackbar.Position bevor du volume den neuen wert zuweist und sendest.
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 22.12.04 21:24
Ohgottogott...  was hab ich denn da gelesen...  dachte wohl, da wird die neue Position als Referenzparameter übergeben, so dass man das ggfs. noch ändern kann oder sowas...
Stimmt natürlich, das ist ja die lokale Variablendeklaration, ahrg...  sorry, peinlich, peinlich  und ich sag immer, wer lesen kann ist klar im Vorteil...
cu
Narses
|
|
|