Autor Beitrag
pascal4free
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 47

Win2000
D8SSL
BeitragVerfasst: Mi 22.12.04 18:24 
jo, erstmal bisserl Quelltext:

CLient:
ausblenden 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 22.12.04 18:46 
Moin!

pascal4free hat folgendes geschrieben:
ausblenden 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:

ausblenden 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:

ausblenden 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
      // an der Lautstärke spielen
    end
    else if (RecvCmd.Strings[1] = 'MUT') then begin
      // Ton ganz wegklemmen oder wieder an machen
    end;
  end
  else if (RecvCmd.Strings[0] = 'DEV') then begin
    // hier könnte man auf irgendwelche Gerätesteuerungen reagieren
  end
  else if (RecvCmd.Strings[0] = 'GLO') then begin
    // hier könnte man auf globale Ereignisse reagieren, z.B. Programm beenden etc.
  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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 47

Win2000
D8SSL
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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:
ausblenden 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"... :wink:

cu
Narses


Zuletzt bearbeitet von Narses am Do 23.12.04 12:50, insgesamt 3-mal bearbeitet
pascal4free Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 47

Win2000
D8SSL
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Mi 22.12.04 20:47 
Narses hat folgendes geschrieben:

Ahh, hab deinen Fehler gefunden, du machst da sowas:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 22.12.04 21:24 
Ohgottogott... :? was hab ich denn da gelesen... :gruebel: dachte wohl, da wird die neue Position als Referenzparameter übergeben, so dass man das ggfs. noch ändern kann oder sowas... :shock:

Stimmt natürlich, das ist ja die lokale Variablendeklaration, ahrg... :autsch: sorry, peinlich, peinlich :oops: und ich sag immer, wer lesen kann ist klar im Vorteil...

cu
Narses