Entschuldige bin noch neu hier
Also erstes kommt folgende Fehlermeldung wenn die Datei z.B. Client oder Server geöffnet wird (in diesem Falle Client)
Klasse TClientSocket nicht gefunden. Fehler Ignorieren oder fortfahren ? WARNUNG Ignorieren kann bedeutet dass
Komponenten gelöscht werden oder Eigenschaftswerte verloren gehen.
Ich klicke dann auf Ignorieren .
Wenn mir dann die Datei angezeigt wird klicke ich sofort ohne was zu verändern auf Debuggen.
Dann kommt folgende Meldung :
FeldForm1.ClientSocket1 besitzt keine entsprechende Komponente. Soll die Deklaration entfernt werden ?
Ich drücke auf NEIN und dann kommt folgende Meldung :
Benachrichtigung über Debugger Exception
Im Projekt Client.exe ist eine Exception der Klasse EAccessViolation aufgetretten. Meldung : "Zugriffsverletzung bei Adresse 004566A8 in Modul 'Cleint.exe'. Lesen von Adresse 00000034 Prozess wurde angehalten. Mit einzelnen Anweisungen oder Start fortsetze.
Hier nun der Quellcoe :
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: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ScktComp, StdCtrls;
const SERVER_PORT = 12345;
type TCmdSyntax = record Text: ShortString; ArgCount: Integer; end;
TCmdToken = ( cmdNOP = 0, cmdSAID, cmdUSER, cmdERROR );
TMyConState = ( mcsOffline, mcsPending, mcsOnline );
TForm1 = class(TForm) Server: TEdit; BtnConnect: TButton; BtnDisconnect: TButton; Nickname: TEdit; Log: TMemo; Input: TEdit; BtnSend: TButton; Clients: TListBox; ClientSocket1: TClientSocket; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure BtnConnectClick(Sender: TObject); procedure BtnDisconnectClick(Sender: TObject); procedure ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); procedure ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket); procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure BtnSendClick(Sender: TObject); procedure InputKeyPress(Sender: TObject; var Key: Char); procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); procedure ParseBuffer; function GetCmdToken(const StrToken: String): TCmdToken; procedure Execute(const Command: TCmdToken; Data: TStringList); private FMyConState: TMyConState; procedure SetConState(const Value: TMyConState); public ReceiveBuffer: String; property ConnectionState: TMyConState read FMyConState write SetConState; end;
const Syntax: Array[TCmdToken] of TCmdSyntax = ( (Text: ''; ArgCount: 1), (Text: 'SAID'; ArgCount: 3), (Text: 'USER'; ArgCount: 2), (Text: ''; ArgCount: 1) );
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin ClientSocket1.Port := SERVER_PORT; ConnectionState := mcsOffline; end;
procedure TForm1.SetConState(const Value: TMyConState); begin FMyConState := Value; BtnConnect.Enabled := (Value = mcsOffline); BtnDisconnect.Enabled := (Value = mcsOnline); BtnSend.Enabled := (Value = mcsOnline); end;
procedure TForm1.FormDestroy(Sender: TObject); begin BtnDisconnectClick(Self); end;
procedure TForm1.BtnConnectClick(Sender: TObject); begin ConnectionState := mcsPending; ClientSocket1.Host := Server.Text; ClientSocket1.Open; end;
procedure TForm1.BtnDisconnectClick(Sender: TObject); begin ConnectionState := mcsPending; if (ClientSocket1.Active) then ClientSocket1.Close else ConnectionState := mcsOffline; end;
procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); begin ReceiveBuffer := ''; ConnectionState := mcsOnline; Log.Clear; Log.Lines.Add('Verbunden mit: '+ClientSocket1.Socket.RemoteHost); Socket.SendText('NICK'+#13+Nickname.Text+#13); end;
procedure TForm1.ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket); begin ConnectionState := mcsOffline; Clients.Clear; Log.Lines.Add('Verbindung getrennt.'); end;
procedure TForm1.ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin if (ClientSocket1.Active) then ClientSocket1.Close; ConnectionState := mcsOffline; Clients.Clear; ErrorCode := 0; Log.Lines.Add('Verbindungsfehler!'); end;
procedure TForm1.BtnSendClick(Sender: TObject); begin ClientSocket1.Socket.SendText('SAY'+#13+Input.Text+#13); end;
procedure TForm1.InputKeyPress(Sender: TObject; var Key: Char); begin if (Key = #13) then begin BtnSendClick(Self); Input.SetFocus; Input.SelectAll; end; end;
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); begin ReceiveBuffer := ReceiveBuffer +Socket.ReceiveText; if (ReceiveBuffer <> '') then ParseBuffer; end;
procedure TForm1.ParseBuffer; var Data: TStringList; Current: TCmdToken; OutOfArg: Boolean; begin Data := TStringList.Create; try Data.Text := ReceiveBuffer; OutOfArg := FALSE; while ( (Data.Count > 0) and (NOT OutOfArg) ) do begin Current := GetCmdToken(UpperCase(Data.Strings[0])); if (Data.Count >= Syntax[Current].ArgCount) then Execute(Current,Data) else OutOfArg := TRUE; end; ReceiveBuffer := Data.Text; finally Data.Free; end; end;
function TForm1.GetCmdToken(const StrToken: String): TCmdToken; begin Result := Low(Syntax); while ( (Result < cmdERROR) and (StrToken <> Syntax[Result].Text) ) do Inc(Result); end;
procedure TForm1.Execute(const Command: TCmdToken; Data: TStringList); var i: Integer; begin case Command of cmdNOP: ; cmdSAID: Log.Lines.Add(Data.Strings[1]+': '+Data.Strings[2]);
cmdUSER: Clients.Items.CommaText := Data.Strings[1];
else Log.Lines.Add('Unbekanntes Kommando: '+Data.Strings[0]); end; for i := 1 to Syntax[Command].ArgCount do Data.Delete(0); end;
end. |
Nette Grüße