Autor Beitrag
darkdester
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100



BeitragVerfasst: Do 22.09.05 16:45 
hoi

hab problem mit meinem chat

will was senden
es sollt kommen
nick:text

aber es kommt wenn ich bsp hallo sende nur
allo(crypt zeichen, kann nich kopiren)nick
bei mehrfach senden is der nick immer mehrfach

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
type CustomRec = Record
   Text: String[255];
end;


Rec: CustomRec;

 with Rec do begin
    Text :=Edit3.Text;
    end;
  //Record wird verschickt!
  ClientSocket1.Socket.SendBuf(Rec,sizeof(Rec));


Socket.ReceiveBuf(Rec,SizeOf(Rec));
with Rec do begin
    nick:=Text;
      Memo1.Lines.Add(nick + ':' +Socket.ReceiveText);
end;



hab keine idee warum das ne funzt :(

kann mir plz jemand helfe?

thx im voraus

mfg darkdester

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 23.09.05 00:42 
Moin!

Warum verwendest du ein Record und nicht .SendText bzw. .RecieveText? :?

Dein Code ist eher rätselhaft, sprich, der Zusammenhang ist beim rauskürzen der Passagen flöten gegangen. Poste mal mehr Code... :gruebel:

cu
Narses
darkdester Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100



BeitragVerfasst: Fr 23.09.05 18:05 
ja sry hab nur die relevanten code abschnitte gepostet

kann nich nochmal recievetext verwenden weil ich das schon für den text brauche!
will mit dem buffer den nickname senden

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
if ClientSocket1.Active then ClientSocket1.Socket.SendText(Edit2.Text);
//record werte zuweisen
  with Rec do begin
    Text :=Edit3.Text;
    end;
  //Record wird verschickt!
  ClientSocket1.Socket.SendBuf(Rec,sizeof(Rec));


var
nick:string;
begin
 //wir holen unseren Record ab...
Socket.ReceiveBuf(Rec,SizeOf(Rec));
with Rec do begin
    nick:=Text;
      Memo1.Lines.Add(nick + ':' +Socket.ReceiveText);



wenn ich zB Hallo sende und der nickname : Nickname ist
komtm das an:
allonickname
zwischn allo und nickname is zeichen was er nich darstellen kann :/

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 23.09.05 18:17 
Moin!

user profile icondarkdester hat folgendes geschrieben:
ja sry hab nur die relevanten code abschnitte gepostet

Ähm, das aktuelle Code-Fragment ist auch nicht viel besser, MEHR CODE... :wink:

user profile icondarkdester hat folgendes geschrieben:
kann nich nochmal recievetext verwenden weil ich das schon für den text brauche!
will mit dem buffer den nickname senden

Hä? :gruebel: Du hast das was ziemlich grundlegend nicht verstanden, fürchte ich.

Mach das doch mal 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:
22:
23:
24:
25:
26:
27:
28:
var
  Command: TStringList;

Command := TStringList.Create; // Programmanfang

// Client-Seite

begin
  Command.Add('Enter'); // Benutzer kommt dazu
  Command.Add('Heino'); // und heisst "Heino"
  Command.Add('');      // zur Sicherheit, wenn mehrere Befehle gleichzeitig eintreffen
  ClientSocket1.SendText(Command.CommaText);
[...]

// Server-Seite:
begin
  Command.CommaText := Socket.RecieveText;
  if (Command.Strings[0] = 'Enter'then
    Memo1.Lines.Add(Command.Strings[1]+' betritt den Chat.')
  else if (Command.Strings[0] = 'Leave'then
    // Benutzer geht...
  else if (Command.Strings[0] = 'Say'then
    // Text senden...
  else if (Command.Strings[0] = 'Shout'then
    // Broadcast an alle in allen Räumen... oder so

// Programmende
Command.Free;

Das ganze ist mehr als Denkanstoss zu sehen, der Code wird so nicht direkt funktionieren.

Dieses Konzept nennt man Protokoll; such mal hier danach, wirst eine Menge sehr aufschlussreicher Threads dazu finden. :wink:

cu
Narses
darkdester Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100



BeitragVerfasst: Fr 23.09.05 21:44 
wie soll das gehn? ich verwende recievetext doch schon!

da würde ich ja den text durcheinanderschmeißen

ich muss TEXT und NICK gleichzeitig senden!

was daran nich zu verstehn


thx für den vorschlag aber erklärt mir mal lieber wieso das mit dem buffer nicht geht

hab das von hier abgeschaut
www.dsdt.info/tutorials/winsocket/?page=5

wieso funzt das einfahc nich O.o?
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Sa 24.09.05 02:04 
Moin!

user profile icondarkdester hat folgendes geschrieben:
wie soll das gehn? ich verwende recievetext doch schon!
da würde ich ja den text durcheinanderschmeißen
ich muss TEXT und NICK gleichzeitig senden!

Dann schau dir bitte das Beispiel noch einmal sehr genau an; exakt das ermöglicht es dir. Abgesehen davon sind .SendText und .SendBuf praktisch die gleiche Prozedur, lediglich die Parameter unterscheiden sich etwas, in beiden Fällen wird aber einfach ein Stück Speicher versendet. Bei .SendText eben ein String (ab Adresse des ersten Zeichens und soviele Zeichen, wie im String sind) und bei .SendBuf ab Adresse der Buffers soviele Zeichen, wie übergeben. Wenn du also .SendBuf mit der Stringadresse und Length(String) übergibt, tut es das gleiche... :roll:

user profile icondarkdester hat folgendes geschrieben:
was daran nich zu verstehn

Tja, das frag ich mich auch... :wink:

user profile icondarkdester hat folgendes geschrieben:
thx für den vorschlag aber erklärt mir mal lieber wieso das mit dem buffer nicht geht
wieso funzt das einfahc nich O.o?

Dazu ist das Code-Fragment einfach zu klein, da kann man doch nix erkennen.

Also, nochmal langsam zum mitlesen: Lass das mit den Records und nimm nur .SendText, ist eh das gleiche. Um mehrere Parameter zu senden, baust du dir ein Protokoll; wie, habe ich dir bereits vorgeschlagen.

cu
Narses
darkdester Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100



BeitragVerfasst: Sa 24.09.05 10:30 
fehler

Listenindex überschreitet das Maximum 0

nopaste.biz/?2783
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Sa 24.09.05 11:30 
:gruebel:

...Fehler, Link, kein erklärendes Wort...
darkdester Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100



BeitragVerfasst: Sa 24.09.05 11:46 
hm??
was soll ich den noch sagen?

hab fehler gesagt
sourcecode gegeben

was den noch???

edit:

also add.command(edit3.text) ja?
so
zum empfangen

ausblenden Delphi-Quelltext
1:
2:
Command.CommaText:=ClientSocket1.Socket.ReceiveText;
 Memo1.Lines.Add(Command.Strings[0] + ':' +Socket.ReceiveText);


wenn ich nun senden will dann kommt fehler mit dem listenindex :/

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Sa 24.09.05 12:10 
Moin!

user profile icondarkdester hat folgendes geschrieben:
sourcecode gegeben

Warum stellst du den Code nicht hier mit Delphi-Tags rein? Dann könnte man wenigstens das Syntaxhighlighting haben, da du deinen Code ja schon nicht formatierst... :roll:

user profile icondarkdester hat folgendes geschrieben:
was den noch???

Am besten den DFM-Inhalt als Text, oder das ganze Projekt, da du ja auch schlauerweise deinen Controls keine aussagekräftigen Namen gibst, kann das doch keiner lesen... :roll:

user profile icondarkdester hat folgendes geschrieben:
also add.command(edit3.text) ja?
so
zum empfangen

ausblenden Delphi-Quelltext
1:
2:
Command.CommaText:=ClientSocket1.Socket.ReceiveText;
Memo1.Lines.Add(Command.Strings[0] + ':' +Socket.ReceiveText);


wenn ich nun senden will dann kommt fehler mit dem listenindex :/

Zunächstmal: du mußt natürlich auch Command.Strings[] verwenden, du hast doch .RecieveText bereits aufgerufen, dann ist alles schon in Command drin. Ausserden gehört da natürlich noch eine gescheite Parameterprüfung drum rum, kannst ja nicht einfach auf die String-Indices zugreifen, ohne zu wissen, ob´s die überhaupt gibt (könnte ja ein Übertragungsfehler aufgetreten sein und nur ein "halbes" Kommando angekommen sein...)! :arrow: Grund für die von dir angegebene Fehlermeldung

Was mir beim Drübersehen noch aufgefallen ist: Pack das Command := TStringList.Create; in das FormCreate() und das Command.Free; in das FormDestroy; nebenbei, das .Free fehlt bei dir ganz... :| :arrow: Speicherleck...

Das hab ich aber oben schon geschrieben, mein Beispiel ist kein C&P-Code... :roll: Würdest du jetzt bitte langsam anfangen, auch mal etwas zu denken? :wink: Oder wenigstens über Suche in: Delphi-Forum, Delphi-Library PROTOKOLL mal etwas selbst recherchieren?

//EDIT: Hier ist ein Tutorial zum Thema Protokoll, das alle hier noch offenen Fragen klären sollte. Weiterhin ist hier die Erklärung, warum man besser nicht records versenden sollte.

cu
Narses


Zuletzt bearbeitet von Narses am So 04.06.06 23:43, insgesamt 1-mal bearbeitet
darkdester Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100



BeitragVerfasst: Sa 24.09.05 12:30 
was daran jetzt falsch
gleicher fehler

ausblenden volle Höhe 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:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, jpeg, ExtCtrls, Menus, StdCtrls, ScktComp,Shellapi;

type
  TForm1 = class(TForm)
    Image1: TImage;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    about1: TMenuItem;
    Edit1: TEdit;
    Memo1: TMemo;
    Button1: TButton;
    Button3: TButton;
    Button4: TButton;
    Edit2: TEdit;
    GroupBox1: TGroupBox;
    ClientSocket1: TClientSocket;
    ServerSocket1: TServerSocket;
    RadioButton1: TRadioButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Edit3: TEdit;
    Label4: TLabel;
    Label5: TLabel;
    Edit4: TEdit;
    Label6: TLabel;
    procedure FormActivate(Sender: TObject);
    procedure about1Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
    procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    
    procedure Button4Click(Sender: TObject);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    
    procedure Button1Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure N6Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;




var
   Form1: TForm1;
   x:string;
   Command: TStringList;



implementation
 uses unit2,unit3;
{$R *.dfm}

procedure TForm1.FormActivate(Sender: TObject);
begin
///leere alle felder///
Edit1.clear;
Edit2.Clear;
Edit3.Clear;
Memo1.Clear;
Memo1.Clear;
Memo1.Lines.Add('Server Online');
//////////////////////////////////
/////festlegung standardport /////
port:=88;
////// Port --> Var port /////
ServerSocket1.Port:=port;      // Ports setzen
////// aktiviere server  /////////
ServerSocket1.Active := TRUE;
////// verwendeter Port anzeigen /
Edit4.Text:=InttoStr(port);
////// Startsprache Deutsch //////
Form3.RadioButton1.Checked:=true;
end;

procedure TForm1.about1Click(Sender: TObject);
begin
form2.Visible:=true;
end;

procedure TForm1.N4Click(Sender: TObject);
begin
Form1.Close;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
Radiobutton1.Checked :=TRUE;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ClientSocket1.Active := FALSE;
ServerSocket1.Active := FALSE;
end;



procedure TForm1.Button4Click(Sender: TObject);

begin
/// Text senden + Nick senden + Anzeige im Memo ////
if ClientSocket1.Active then ClientSocket1.Socket.SendText(Edit2.Text);
Command.Add(Edit3.text);
Command.Add(Edit2.Text);
if ClientSocket1.Active then ClientSocket1.Socket.SendText(Command.CommaText);
/// ------------ Felder leeren ------------ ///

Edit2.Clear;
Edit2.setfocus; // Focus auf Texteingabefeld
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
/// Text + Nick erhalten ///
 begin
 Command.CommaText:=ClientSocket1.Socket.ReceiveText;
 if (Command.Strings[0] = Edit3.Text) then
 Memo1.Lines.Add(Command.Strings[0] + ':' + Command.Strings[1]);
 
 end;


procedure TForm1.Button1Click(Sender: TObject);
begin
x:=Edit1.Text;
ClientSocket1.Host :=x; // IP des Zielrechners

end;



procedure TForm1.N2Click(Sender: TObject);
begin
Edit1.clear;
Edit2.clear;
Edit3.Clear;
Memo1.Clear;
ClientSocket1.Active := FALSE;
Radiobutton1.Checked:=false;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
////// Tastenshortcut für ALT+S zum senden /////
if (ssalt in Shift) and (Key = Ord('S')) then ClientSocket1.Socket.SendText(Edit2.Text);
if (ssalt in Shift) and (Key = Ord('S')) then Memo1.Lines.Add(Edit3.Text+':'+Edit2.Text);
if (ssalt in Shift) and (Key = Ord('S')) then edit2.clear;
end;

procedure TForm1.N6Click(Sender: TObject);
begin
Form3.Visible:=true; // show Form3
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
//////// Client Aktivierung ////////
ClientSocket1.Port :=port; // Port festlegen
ClientSocket1.Host :=x; // IP des Zielrechners
ClientSocket1.Active := TRUE; // Client aktivieren
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
/// list createn ///
Command := TStringList.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
Command.Free;
end;

end.


Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt



oben steht auch nur command.add
und dann
Memo1.Lines.Add(Command.Strings[1]+

ich habs doch genauso

wieso funzt nich?

bzw sag einfach wodurch son fehler verursacht wird
vlt kann ich das ja selber zurückvollziehn und beheben :/
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Sa 24.09.05 12:50 
Moin!

user profile icondarkdester hat folgendes geschrieben:
was daran jetzt falsch
gleicher fehler

Bitte, (letzte Warnung) das hier ist keine in deinen Computer eingebaute, interaktive Hilfefunktion! Würdest du mich bitte wie einen Menschen behandeln :!:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Button4Click(Sender: TObject);
begin
/// Text senden + Nick senden + Anzeige im Memo ////
if ClientSocket1.Active then ClientSocket1.Socket.SendText(Edit2.Text);
Command.Add(Edit3.text);
Command.Add(Edit2.Text);
if ClientSocket1.Active then ClientSocket1.Socket.SendText(Command.CommaText);
/// ------------ Felder leeren ------------ ///

Edit2.Clear;
Edit2.setfocus; // Focus auf Texteingabefeld
end;

Du sendest zwei mal.

cu
Narses
darkdester Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100



BeitragVerfasst: Sa 24.09.05 13:00 
ja sorry!

ok also
ich hab jetzt den fehler mit 2ma senden berichtigt aber es kommt immer noch der Listindex fehler


kannst du mir bitte sagen woran das liegen könnte? einfahc nur die ursache im groben

vlt kann ich selber fehler finden

nochmal der source
ausblenden volle Höhe 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:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, jpeg, ExtCtrls, Menus, StdCtrls, ScktComp,Shellapi;

type
  TForm1 = class(TForm)
    Image1: TImage;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    about1: TMenuItem;
    Edit1: TEdit;
    Memo1: TMemo;
    Button1: TButton;
    Button3: TButton;
    Button4: TButton;
    Edit2: TEdit;
    GroupBox1: TGroupBox;
    ClientSocket1: TClientSocket;
    ServerSocket1: TServerSocket;
    RadioButton1: TRadioButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Edit3: TEdit;
    Label4: TLabel;
    Label5: TLabel;
    Edit4: TEdit;
    Label6: TLabel;
    procedure FormActivate(Sender: TObject);
    procedure about1Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
    procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    
    procedure Button4Click(Sender: TObject);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    
    procedure Button1Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure N6Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;




var
   Form1: TForm1;
   x:string;
   Command: TStringList;



implementation
 uses unit2,unit3;
{$R *.dfm}

procedure TForm1.FormActivate(Sender: TObject);
begin
///leere alle felder///
Edit1.clear;
Edit2.Clear;
Edit3.Clear;
Memo1.Clear;
Memo1.Clear;
Memo1.Lines.Add('Server Online');
//////////////////////////////////
/////festlegung standardport /////
port:=88;
////// Port --> Var port /////
ServerSocket1.Port:=port;      // Ports setzen
////// aktiviere server  /////////
ServerSocket1.Active := TRUE;
////// verwendeter Port anzeigen /
Edit4.Text:=InttoStr(port);
////// Startsprache Deutsch //////
Form3.RadioButton1.Checked:=true;
end;

procedure TForm1.about1Click(Sender: TObject);
begin
form2.Visible:=true;
end;

procedure TForm1.N4Click(Sender: TObject);
begin
Form1.Close;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
Radiobutton1.Checked :=TRUE;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ClientSocket1.Active := FALSE;
ServerSocket1.Active := FALSE;
end;



procedure TForm1.Button4Click(Sender: TObject);

begin
/// Text senden + Nick senden + Anzeige im Memo ////

Command.Add(Edit3.text);
Command.Add(Edit2.Text);
if ClientSocket1.Active then ClientSocket1.Socket.SendText(Command.CommaText);
/// ------------ Felder leeren ------------ ///

Edit2.Clear;
Edit2.setfocus; // Focus auf Texteingabefeld
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
/// Text + Nick erhalten ///
 begin
 Command.CommaText:=ClientSocket1.Socket.ReceiveText;
 if (Command.Strings[0] = Edit3.Text) then
 Memo1.Lines.Add(Command.Strings[0] + ':' + Command.Strings[1]);
 
 end;


procedure TForm1.Button1Click(Sender: TObject);
begin
x:=Edit1.Text;
ClientSocket1.Host :=x; // IP des Zielrechners

end;



procedure TForm1.N2Click(Sender: TObject);
begin
Edit1.clear;
Edit2.clear;
Edit3.Clear;
Memo1.Clear;
ClientSocket1.Active := FALSE;
Radiobutton1.Checked:=false;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
////// Tastenshortcut für ALT+S zum senden /////
if (ssalt in Shift) and (Key = Ord('S')) then ClientSocket1.Socket.SendText(Edit2.Text);
if (ssalt in Shift) and (Key = Ord('S')) then Memo1.Lines.Add(Edit3.Text+':'+Edit2.Text);
if (ssalt in Shift) and (Key = Ord('S')) then edit2.clear;
end;

procedure TForm1.N6Click(Sender: TObject);
begin
Form3.Visible:=true; // show Form3
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
//////// Client Aktivierung ////////
ClientSocket1.Port :=port; // Port festlegen
ClientSocket1.Host :=x; // IP des Zielrechners
ClientSocket1.Active := TRUE; // Client aktivieren
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
/// list createn ///
Command := TStringList.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
Command.Free;
end;

end.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Sa 24.09.05 13:30 
Moin!

ausblenden Delphi-Quelltext
1:
2:
/////festlegung standardport /////
port:=88;

Laut RFC solltest du für eigene Anwendungen Ports oberhalb von 1024 verwenden; Vorschlag: nimm Port 12345 oder so. :wink:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Button4Click(Sender: TObject);
begin
/// Text senden + Nick senden + Anzeige im Memo ////
  Command.Clear; // Befehlsspeicher leeren
  Command.Add(Edit3.text); // ist das der Nick?
  Command.Add(Edit2.Text); // ist das der Text?
  if ClientSocket1.Active then
    ClientSocket1.Socket.SendText(Command.CommaText);
  // dann wird also "Nick,Text" gesendet, ja?

Du solltest natürlich immer mit einem "neuen" Befehlsspeicher loslegen!

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
/// Text + Nick erhalten ///
begin
  Command.CommaText := Socket.ReceiveText; // vom (lokalen) ServerSocket lesen, NICHT vom Client!
  if (Command.Count >= 2then begin // gültigen Befehl erhalten
    if (Command.Strings[0] = Edit3.Text) then
      Memo1.Lines.Add(Command.Strings[0] + ':' + Command.Strings[1]);
  end
  else // irgendwas stimmt mit dem Befehl nicht, zum debuggen anzeigen
    ShowMessage('komisches Kommando: '+Command.CommaText);

end;

Du mußt natürlich in der gleichen Reihenfolge die Befehle auswerten, wie du sie sendest.

//EDIT:
- Port auf 5 Stellen hochgesetzt, ist noch besser. :wink:
- Im ServerSocket hast du vom ClientSocket gelesen! :shock:

cu
Narses
darkdester Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100



BeitragVerfasst: Sa 24.09.05 13:55 
ok danke

so nun kommt kein listerror mehr sondern jetzt funzt der chat nichmehr

wenn ich sende muss mein text 2mal kommen
weil halt 127.0.0.1 zum testen

ging früher immer
is ja auch klar

nun kommts nur 1mal, d.h. er zeigt mein text beim gegenüber nich an :(

warum das aufeinmal
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Sa 24.09.05 13:56 
Moin!

Hab nochwas am Beitrag geändert, EDIT beachten. :wink:

cu
Narses
darkdester Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100



BeitragVerfasst: Sa 24.09.05 14:31 
- Im ServerSocket hast du vom ClientSocket gelesen! :shock:

KORRIGIERT

port is aber eigentlich egal oder? is nur wegen den appz

ich test eh grad nur auf localhost!

aber es funzt einfach nicht mehr
er zeigt meine message nur 1mal an

ausblenden volle Höhe 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:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, jpeg, ExtCtrls, Menus, StdCtrls, ScktComp,Shellapi;

type
  TForm1 = class(TForm)
    Image1: TImage;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    about1: TMenuItem;
    Edit1: TEdit;
    Memo1: TMemo;
    Button1: TButton;
    Button3: TButton;
    Button4: TButton;
    Edit2: TEdit;
    GroupBox1: TGroupBox;
    ClientSocket1: TClientSocket;
    ServerSocket1: TServerSocket;
    RadioButton1: TRadioButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Edit3: TEdit;
    Label4: TLabel;
    Label5: TLabel;
    Edit4: TEdit;
    Label6: TLabel;
    procedure FormActivate(Sender: TObject);
    procedure about1Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
    procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    
    procedure Button4Click(Sender: TObject);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    
    procedure Button1Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure N6Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;




var
   Form1: TForm1;
   x:string;
   Command: TStringList;
   k:integer;



implementation
 uses unit2,unit3;
{$R *.dfm}

procedure TForm1.FormActivate(Sender: TObject);
begin
/////festlegung standardport /////
port1:=88;
if j=1 then port1:=port2;

///leere alle felder///
Edit1.clear;
Edit2.Clear;
Edit3.Clear;
if j=0 then Memo1.Clear;
if j=0 then Memo1.Lines.Add('Server Online');
////// Port --> Var port /////
ServerSocket1.Port:=port1;      // Ports setzen
////// aktiviere server  /////////
ServerSocket1.Active := TRUE;
////// verwendeter Port anzeigen /
Edit4.Text:=InttoStr(port1);
////// Startsprache Deutsch //////
Form3.RadioButton1.Checked:=true;
end;

procedure TForm1.about1Click(Sender: TObject);
begin
form2.Visible:=true;
end;

procedure TForm1.N4Click(Sender: TObject);
begin
Form1.Close;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
Radiobutton1.Checked :=TRUE;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ClientSocket1.Active := FALSE;
ServerSocket1.Active := FALSE;
end;



procedure TForm1.Button4Click(Sender: TObject);

begin
/// Text senden + Nick senden + Anzeige im Memo ////
Command.Clear;
Command.Add(Edit3.text);
Command.Add(Edit2.Text);
if ClientSocket1.Active then ClientSocket1.Socket.SendText(Command.CommaText);
/// ------------ Felder leeren ------------ ///

Edit2.Clear;
Edit2.setfocus; // Focus auf Texteingabefeld
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
/// Text + Nick erhalten ///
 begin
 Command.CommaText:=Socket.ReceiveText;
 if (Command.Count >= 2then begin // gültigen Befehl erhalten
    if (Command.Strings[0] = Edit3.Text) then
      Memo1.Lines.Add(Command.Strings[0] + ':' + Command.Strings[1])
     end
  else // irgendwas stimmt mit dem Befehl nicht, zum debuggen anzeigen
    ShowMessage('Fehler: '+Command.CommaText);
 end;


procedure TForm1.Button1Click(Sender: TObject);
begin
x:=Edit1.Text;
ClientSocket1.Host :=x; // IP des Zielrechners

end;



procedure TForm1.N2Click(Sender: TObject);
begin
Edit1.clear;
Edit2.clear;
Edit3.Clear;
Memo1.Clear;
ClientSocket1.Active := FALSE;
Radiobutton1.Checked:=false;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
////// Tastenshortcut für ALT+S zum senden /////
if (ssalt in Shift) and (Key = Ord('S')) then ClientSocket1.Socket.SendText(Edit2.Text);
if (ssalt in Shift) and (Key = Ord('S')) then Memo1.Lines.Add(Edit3.Text+':'+Edit2.Text);
if (ssalt in Shift) and (Key = Ord('S')) then edit2.clear;
end;

procedure TForm1.N6Click(Sender: TObject);
begin
Form3.Visible:=true; // show Form3
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
//////// Client Aktivierung ////////
ClientSocket1.Port :=port1; // Port festlegen
ClientSocket1.Host :=x; // IP des Zielrechners
ClientSocket1.Active := TRUE; // Client aktivieren
if k>1 then Memo1.Lines.Add('Server Online');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
/// list createn ///
Command := TStringList.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
Command.Free;
end;

end.
darkdester Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100



BeitragVerfasst: Sa 24.09.05 18:34 
hab getestet

es kommt keine nachricht mehr an!
was hat ds tolle system jezt gebracht :|
nix geht mehr


edit:

wenn mir jemand message schickt zeigt er das else an

also messaebox!

was los?
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: So 25.09.05 03:21 
Moin!

Ich hatte dich gebeten, mal etwas auf deine Umgangsformen zu achten; ich bin nicht dein Programmiersklave... :roll: Deshalb ist das mein letztes Posting in diesem Thread, selbst schuld.

user profile icondarkdester hat folgendes geschrieben:
was hat ds tolle system jezt gebracht :|
nix geht mehr

Das liegt natürlich an dem "tollen" System, klar. Und das kann auch gar nicht daran liegen, dass du´s evtl. nicht kapierst... :roll:

user profile icondarkdester hat folgendes geschrieben:
port is aber eigentlich egal oder? is nur wegen den appz

Hätte ich mir die Mühe gemacht, etwas dazu zu sagen, wenn es egal wäre? Ports unterhalb 1024 sind laut RFC tabu.

user profile icondarkdester hat folgendes geschrieben:
ich test eh grad nur auf localhost!

Ich glaube nicht, dass du das Programm auf dem selben Rechner mehrfach starten kannst, da du nur einen ServerSocket auf einem PC aufmachen kannst (auf dem gleichen Port). Da dein Code aber immer den Server startet, kann das also nicht gehen.

Ich habe deinen (grausamen) Code mal auf das notwendige zusammengestrichen, um es bei mir laufen lassen zu können. Es funktioniert auch, wenn ich es auf zwei verschiedenen Rechnern laufen lasse:
ausblenden volle Höhe 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:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, jpeg, ExtCtrls, Menus, StdCtrls, ScktComp,Shellapi;

const
  CHAT_PORT = 12345;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    ClientSocket1: TClientSocket;
    ServerSocket1: TServerSocket;
    Button3: TButton;
    Button4: TButton;
    RadioButton1: TRadioButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button4Click(Sender: TObject);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    Command: TStringList;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Command := TStringList.Create;
  Edit1.Clear;
  Edit2.Clear;
  Edit3.Clear;
  ServerSocket1.Port := CHAT_PORT;
  ServerSocket1.Active := TRUE;
  Edit4.Text := IntToStr(CHAT_PORT);
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket);
begin
  Radiobutton1.Checked := TRUE;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  Command.Clear;
  Command.Add(Edit3.Text);
  Command.Add(Edit2.Text);
  if ClientSocket1.Active then begin
    Memo1.Lines.Add(Edit3.Text+': '+Edit2.Text);
    ClientSocket1.Socket.SendText(Command.CommaText);
  end;
  Edit2.Clear;
  Edit2.SetFocus;
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
begin
  Command.CommaText := Socket.ReceiveText;
  if (Command.Count >= 2then
    Memo1.Lines.Add(Command.Strings[0]+': '+Command.Strings[1])
  else
    ShowMessage('Fehler: '+Command.CommaText);
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if (ssalt in Shift) and (Key = Ord('S')) then
    Button4Click(Self);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  ClientSocket1.Port := CHAT_PORT;
  ClientSocket1.Host := Edit1.Text;
  ClientSocket1.Active := TRUE;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ClientSocket1.Active := FALSE;
  ServerSocket1.Active := FALSE;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Command.Free;
end;

end.

Entscheidende Änderung ggü. deinem Code:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;  
  Socket: TCustomWinSocket);  
/// Text + Nick erhalten ///  
 begin  
 Command.CommaText:=Socket.ReceiveText;  
 if (Command.Count >= 2then begin // gültigen Befehl erhalten  
    // if (Command.Strings[0] = Edit3.Text) then  // Zeile rausgenommen
      Memo1.Lines.Add(Command.Strings[0] + ':' + Command.Strings[1])  
     end  
  else // irgendwas stimmt mit dem Befehl nicht, zum debuggen anzeigen  
    ShowMessage('Fehler: '+Command.CommaText);  
 end;

Das ist aber nicht die einzige Änderung, vergleich mal meine Version deines Codes mit deiner Letzten, um zu sehen was genau ich geändert habe. Wenn ich schon deinen Code flicke, dann mach du dir mal ruhig die Arbeit, die entsprechenden Stellen rauszusuchen (ich mußte ja auch die Oberfläche "rekonstruieren")...

Nebenbei: dein Ansatz einen Chat zu machen, ist schon eher fragwürdig. Mach mal lieber noch ein paar Tuts durch, damit du etwas besseren Überblick darüber kriegst, was du da eigentlich tust... :|

So, das war´s für mich; brauchst mich auch nicht weiter mit PNs zu nerven.

cu
Narses
darkdester Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100



BeitragVerfasst: So 25.09.05 12:31 
ok danke
vlt läufter ja ma irgendwann wieder

achja und
1. das is nur verwirrend weil ich den chat schon über 2-3monate nicht mehr angerührt hatte
2. lief er vorher super, halt das statt nickname nur Ip kam :|, wollt ich eben ändern
3. in ner anderen version sogar ne verschlüsselung eingebaut is(keine kopierte!!!)
4. ich bestimmt 1monate nix mehr in delphi gemacht hatte und nebenbei au ncoh c++ schreiben muss


naja wie au immmer, thx nochmal

mfg darkdester