{ > Otherwise, how could I tell the difference between the local users input > and the remote users input??? If I knew that I guess I could Write my > own chat Procedure. Well, I definately agree With you there.. Here's some ugly code I put into my doors, it's a chat Procedure, not With all the features I'd like, but it works, anyway.. (BTW, I'm working on a split screen version now, but that'll take some time as I'm very busy these days..) This is a dump from part of my SYSKEY.INC include File.. } {$F+} (* This include File is where you will take actions you define when trapped keys such as ALT-keys, Function-keys, etc., are pressed. You will need to setup your Procedures here which in turn may call other Procedures within your code or you may do all you need to do right here. For example, if you wanted to trap For ALT-C being pressed on the local keyboard and then call the Procedure CHAT: Your main block of code might look like this: begin {main} ASSIGN(Output,'') ; REWrite(Output) ; SysopKey[1] := #0 + #46 ; {define ALT-C as one of twenty keys } {to trap } SysopProc[1] := ALT_C ; {define Procedure as defined here } SysopKey ; {setup For Far call to this File } end ; Now, whenever ALT-C is pressed, the following Procedure will be called: Procedure ALT_C ; begin CHAT ; {call Procedure CHAT which is located } end ; {within your Program's code } *) (* The following Procedures are called when up/down arrows are pressed provided they are defined using SysopKey[] and SysopProc[] within the main Program code *) Procedure end_Chat; begin Chatended := True; { Do some other stuff here if you'd like } end; Procedure Chat; Const FKeyCode = #0; Space = ' '; Hyphen = '-'; BackSpace = ^H; CarriageReturn = ^M; MaxWordLineLength = 80; Var WordLine : String[MaxWordLineLength]; Index1 : Byte; Index2 : Byte; InputChar : Char; F : Text; Label Get_Char; begin {WordWrap} If LocalKey Then SetColor(0,14,0) Else SetColor(0,3,0); UserKeysOn := False; WordLine := ''; Index1 := 0; Index2 := 0; InputChar := Space; ClearScreen; Display(0,3,0,''); Display(0,12,0,'Sysop Entering Chat Mode: '); InputChar := GetChar; If LocalKey Then SetColor(0,14,0) Else SetColor(0,3,0); InactiveVal := 0; While (NOT Chatended) do begin If LocalKey Then SetColor(0,14,0) Else SetColor(0,3,0); Case InputChar OF BackSpace: {Write destructive backspace & remove Char from WordLine} begin If LocalKey Then SetColor(0,14,0) Else SetColor(0,3,0); sDisplay(0,7,0,BackSpace+Space+BackSpace); DELETE(WordLine,(LENGTH(WordLine) - 1),1) end else {InputChar contains a valid Char, so deal With it} begin If ( InPutChar = Chr(13) ) Then begin If LocalKey Then Display(0,14,0,InputChar) Else Display(0,3,0,InputChar); end Else begin If LocalKey Then sDisplay(0,14,0,InputChar) Else sDisplay(0,3,0,InputChar); end; If InputChar <> Chr(13) Then WordLine := (WordLine + InputChar) Else WordLine := ''; if (LENGTH(WordLine) >= (MaxWordLineLength - 1)) then {we have to do a Word-wrap} begin Index1 := (MaxWordLineLength - 1); While ((WordLine[Index1] <> Space) and (WordLine[Index1] <> Hyphen) and (Index1 <> 0)) DO Index1 := (Index1 - 1); if (Index1 = 0) {whoah, no space was found to split line!} then Index1 := (MaxWordLineLength - 1); {forces split} DELETE(WordLine, 1, Index1); For Index2 := 1 to LENGTH(WordLine) DO sDisplay(0, 7, 0, BackSpace + Space + BackSpace); Display(0,3,0,''); If InPutChar = Chr(13) then begin If LocalKey Then Display(0,14,0,WordLine) Else Display(0,3,0,WordLine); end Else begin If LocalKey Then sDisplay(0,14,0,WordLine) Else sDisplay(0,3,0,WordLine); end; end end end; {CASE InputChar} {Get next key from user.} Get_Char: begin InputChar := GetChar; If ( WordLine = '' ) and ( InputChar = Chr(13) ) Then begin Display(0,3,0,''); Goto Get_Char; end; end; end; {WHILE ( not (Chatended) )} Display(0, 12, 0, 'Sysop Left Chat Mode.'); If (NOT Registered) Then DisplayLoc(0, 7, 0, 'þ If you find this Program of value, please register.'); Delay(2500); Display(0, 15, 0, 'Press ( '+#17+'ÄÄÙ ) to Continue . . .'); ClearScreen; Chatended := False; InactiveVal := 30; UserKeysOn := True; end; { There.. let me know if you need any clarification.. (BTW, you need global Variables Chatended and Registered as Booleans in the main program.. }