Frage deutsch
~~~~~~~~~~~~~~~~~
Wie realisiere ich einen Chat über Nullmodemkabel?
Wie kann ich ein Chat-Programm in QB realisieren, das über ein ->
Nullmodemkabel arbeitet?
 

Question English
~~~~~~~~~~~~~~~~~
How to realize a chat via a nullmodem cable or LAN?
 
 

Antwort 1
~~~~~~~~~~~~~~~~~
[ von TT-Soft (
Webmaster*East-Power-Soft.de ) im QB-Forum, 10.3.2003 - 15.5.2003 ]
.
Wie kommuniziere ich zwischen zwei PC's? Auch das ist eine immer wiederkehrende Frage von Anfängern. Dabei ist das ganze wirklich einfach - so lange es sich um eine serielle Verbindung handelt. Mit serieller Verbindung ist die Verbindung von zwei PC's über ein handelsübliches, sogenanntes Null-Modem-Kabel gemeint. Wie das ganze dann funktioniert zeigt dieses kleine Terminalprogramm. Du schließt das Kabel an, startest das Programm auf beiden Rechnern und hast eine Art Wohnzimmer-Chat ;-)
 
Auf meiner Seite
www.east-power-soft.de unter "QB -> Tutorials -> Kommunikation" gibt es ein einfaches Beispiel für einen Wohnzimmerchat über Nullmodem Kabel. Es lautet wie folgt:
 
'============================================================================
' (p)'23/02/2003 by East-Power-Soft
'
' Hier ein kleines Beispielprogramm, welches ein
' "Minimal-Terminalprogramm" darstellt
'============================================================================
OPEN "com1: 9600,n,8,1,cs0,ds0,cd0" FOR RANDOM AS #1 ' Com öffen
DO ' Hauptschleife
b$ = INKEY$ ' Taste einlesen
IF b$ = CHR$(27) THEN EXIT DO ' Hauptschleife beenden
IF b$ <> "" THEN ' Wenn Eingabe, dann
PRINT #1, b$; ' an COM senden
PRINT b$; ' und auf Bildschirm anzeigen
END IF
WHILE NOT EOF(1) ' Schleife bis Datenende
a$ = INPUT$(1, 1) ' Ein Zeichen einlesen
PRINT a$; ' und auf Bildschirm anzeigen
WEND
LOOP
CLOSE #kanal ' Kanal schliessen
 
'---> Wenn Du das Programm auf 2 PC's laufen lässt, und diese mit einem
'---> handelsüblichen Nullmodemkabel verbindest, dann siehst Du auf dem
'---> jeweils anderen PC, was auf dem einen eingetippt wird.
 
 
 

Antwort 2
~~~~~~~~~~~~~~~~~
[ von Michael Frey ( ) per Mail, 10.10.2002 ]
.
Da kann man sich sehr gut an Microsofts Beispiel Programm TERMINAL.BAS orientieren:
 
'*****************************************************
' TERMINAL.BAS = Chat ueber Nullmodemkabel
' ============
' Dies ist das offizielle Terminalprogramm von
' Microsoft, das QuickBASIC 4.5 beiliegt.
'*****************************************************
DEFINT A-Z
DECLARE SUB Filter (InZeichKett$)
COLOR 7, 1 ' Setze Bildschirmfarbe.
CLS
Ende$ = CHR$(0) + CHR$(48) ' Von INKEY$ angegebener
' Wert, wenn Alt+b betaetigt
' wird.
' Gib Anfrage in unterster Bildschirmzeile aus und
' schalte den Cursor ein:
LOCATE 24, 1, 1
PRINT STRING$(80, "_");
LOCATE 25, 1
PRINT TAB(30); "Druecke Alt+b zum Beenden";
VIEW PRINT 1 TO 23 ' Ausgaben zwischen den Zeilen 1
' & 23.
' Eroeffne Kommunikation (1200 Baud, keine Paritaet,
' 8-Bit fuer Daten, 1 Stopbit, 256-Byte
' Eingabepuffer):
OPEN "COM1:1200,N,8,1" FOR RANDOM AS #1 LEN = 256
DO ' Hauptschleife der Datenuebertragung.
TastEingab$ = INKEY$ ' ueberpruefe Tastatur.
IF TastEingab$ = Ende$ THEN ' Verlasse die
' Schleife, wenn der
' Benutzer Alt+q
EXIT DO ' betaetigt hat.
ELSEIF TastEingab$ <> "" THEN ' Andernfalls, wenn
' der Benutzer eine
' Taste betaetigt hat,
' sende das einge-
PRINT #1, TastEingab$; ' tippte Zeichen zum
END IF ' Modem.
' ueberpruefe das Modem. Wenn Zeichen warten (EOF(1)
' ist wahr), hole diese und gib sie auf den
' Bildschirm aus:
IF NOT EOF(1) THEN
'LOC(1) gibt die Anzahl der wartenden Zeichen an:
ModemEingab$ = INPUT$(LOC(1), #1)
Filter ModemEingab$ ' Filtere Zeilenvorschbe
' und Rueckschritte aus,
PRINT ModemEingab$; ' schreibe dann.
END IF
LOOP
CLOSE ' Ende der Datenuebertragung.
CLS
END
'
' ===================== FILTER =======================
' Filtert Zeichen einer eingegebenen Zeichenkette
' ====================================================
'
SUB Filter (InZeichKett$) STATIC
' Suche nach Rueckschrittzeichen (CHR$(8)) und
' kodiere diese in CHR$(29) um (die Cursor-Taste
' nach links):
DO
RueckSchr = INSTR(InZeichKett$, CHR$(8))
IF RueckSchr THEN
MID$(InZeichKett$, RueckSchr) = CHR$(29)
END IF
LOOP WHILE RueckSchr
' Suche nach Zeilenvorschubzeichen (CHR$(10)) und
' entferne alle gefundenen:
DO
ZeilVor = INSTR(InZeichKett$, CHR$(10))
IF ZeilVor THEN
InZeichKett$ = LEFT$(InZeichKett$, ZeilVor - 1) + MID$(InZeichKett$, ZeilVor + 1)
END IF
LOOP WHILE ZeilVor
END SUB
 
Das obige Programm steht im Verzeichnis Progs\ zur Verfügung sowie online unter www.antonis.de/faq/progs/terminal.bas .
 
 
 

Antwort 3
~~~~~~~~~~~~~~~~~
[ von Weazel (
weazel77*gmx.de ) per Mail, 15.5.2003 ]
.
Ich habe vor langer Zeit mal das untenstehende Chat-Programm EASYCHAT geschrieben. Es funktioniert zwar tadellos, aber ist, weil ich es in meinen Anfänger- jahren geschrieben habe, mit GOTO- und GOSUB-Anweisungen voll.
 
'******************************************************************************
' EASYCHAT.BAS - Chat über Nullmodemkabel
' ============
' Dieses QBasic-Programm funktioniert zwar tadellos. Aber weil ich es in
' meinen Anfaengerjahren geschrieben habe, ist es voll von GOTO- und
' GOSUB-Anweisungen.
'
' *** Funktionsweise:
' Zuerst geht man in die Konfiguration und tippt dort seine Einstellungen
' ein. Dabei muss man beachten, dass beide Chatter denselben COM-Port
' und die selbe Geschwindigkeit benutzen, sonst geht es nicht.
' Danach waehlt man "Chat" an und das Programm "synchronisiert" sich mit
' dem anderen Computer. Es übertraegt dazu einfach den Nickname und die
' Farbe.
' Danach geht es in den eigentlichen Chat ueber. Waehrend der Chat läuft,
' wird ständig geprüft, ob irgendwelche Daten auf dem COM-Port einlaufen.
' Ist dies dann der Fall, wird die entsprechende Nachricht angezeigt.
'
' *** Entstehungsgeschichte:
' Ich habe EasyChat geschrieben, um das Nullmodemkabel zu
' testen, das ich von meinem Onkel geschenkt bekommen hatte und
' um die Funktionsweise des OPEN COM-Befels zu erproben...
' Das Programm ist vor 2 Jahren entstanden. Damals habe ich noch
' mit GOTO und GOSUB gearbeitet und das ist halt lange her...
' Wer Lust hat, kann das Programm ja umschreiben...
'
' (c) Weazel ( weazel77*gmx.de ), 15.5.2003
'******************************************************************************
DECLARE SUB Menue ()
DECLARE SUB Config ()
DECLARE SUB OpenCom ()
DECLARE SUB Init ()
DECLARE SUB Chat ()
DECLARE SUB Syn ()
'
DIM SHARED ComPort$, ComSpeed$, ComOpt$
DIM SHARED ActName$, ActFarbe, OthName$, OthFarbe
'
SCREEN 0
CLS
'
Menue
'
SUB Chat
'
CLS
VIEW PRINT 1 TO 25
'
COLOR 15, 1
PRINT " EASYCHAT 2000 "
COLOR 9, 1
PRINT "ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄz"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "RÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄU"
'
t = TIMER
'
Zeile = 3: Spalte = 1
'
VIEW PRINT 3 TO 25
LOCATE 24, 1: COLOR 15, 1: PRINT " "
LOCATE 24, Spalte: PRINT "_"
'
TastenAbfrage:
VIEW PRINT 1 TO 25
LOCATE 1, 1: PRINT USING "Chat-Time: ## min"; (TIMER - t) / 60
LOCATE 1, 62: PRINT "Real-Time: " + TIME$
VIEW PRINT 3 TO 25
'
IF LOC(1) <> 0 THEN GOTO TextEmpfangen
Taste$ = INKEY$
SELECT CASE Taste$
CASE CHR$(8): GOTO TextZeichenLoeschen
CASE CHR$(13): GOTO TextSenden
CASE CHR$(27): GOTO ChatBeenden
CASE IS <> "": GOTO TextErweitern
END SELECT
GOTO TastenAbfrage
'
TextSenden:
IF OutText$ = "" THEN GOTO TastenAbfrage
VIEW PRINT 3 TO 22
IF Zeile > 22 THEN Zeile = 22
LOCATE Zeile, 2: COLOR ActFarbe, 1: PRINT ActName$ + " : "; : COLOR 15, 1: PRINT OutText$
PRINT #1, OutText$
VIEW PRINT 3 TO 25
COLOR 9, 1: LOCATE Zeile, 1: PRINT "l": LOCATE Zeile, 80: PRINT "l"
OutText$ = "": Zeile = Zeile + 1: Spalte = 1
VIEW PRINT 3 TO 25
LOCATE 24, 1: COLOR 15, 1: PRINT " "
LOCATE 24, Spalte: PRINT "_"
GOTO TastenAbfrage
'
TextErweitern:
IF ASC(Taste$) < 32 THEN GOTO TastenAbfrage
IF Spalte > 60 THEN GOTO TastenAbfrage
OutText$ = OutText$ + Taste$: LOCATE 24, 1: COLOR 15, 1: PRINT OutText$
Spalte = Spalte + 1
LOCATE 24, Spalte: PRINT "_"
GOTO TastenAbfrage
'
TextZeichenLoeschen:
IF LEN(OutText$) = 0 THEN GOTO TastenAbfrage
OutText$ = MID$(OutText$, 1, LEN(OutText$) - 1)
LOCATE 24, 1: COLOR 15, 1: PRINT " "
LOCATE 24, 1: PRINT OutText$
Spalte = Spalte - 1
LOCATE 24, Spalte: PRINT "_"
GOTO TastenAbfrage
'
TextEmpfangen:
INPUT #1, InText$
IF InText$ = "QUITCHAT" THEN GOTO ChatBeenden
VIEW PRINT 3 TO 22
IF Zeile > 22 THEN Zeile = 22
LOCATE Zeile, 2: COLOR OthFarbe, 1: PRINT OthName$ + " : "; : COLOR 15, 1: PRINT InText$
VIEW PRINT 3 TO 25
COLOR 9, 1: LOCATE Zeile, 1: PRINT "l": LOCATE Zeile, 80: PRINT "l"
InText$ = "": Zeile = Zeile + 1
GOTO TastenAbfrage
'
ChatBeenden:
LOCATE 24, 1: COLOR 15, 1: PRINT "Chat beendet."
PRINT #1, "QUITCHAT"
CLOSE #1
SLEEP 2
'
END SUB
'
SUB Config
'
CLS
VIEW PRINT 1 TO 25
'
COLOR 15, 1
PRINT " EasyChat-Konfiguration "
COLOR 9, 1
PRINT "ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄz"
PRINT "l l"
PRINT "l Comport des Computers: (COM1: oder COM2:) l"
PRINT "l l"
PRINT "l l"
PRINT "l Baudrate der Verbindung: (300, 600, 1200, 2400, 4800, 9600, 19200) l"
PRINT "l l"
PRINT "l l"
PRINT "l Nickname dieses Computers: l"
PRINT "l l"
PRINT "l l"
PRINT "l Schriftfarbe des Nicknames: l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "RÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄU"
PRINT " "
'
LOCATE 22, 2
FOR I = 1 TO 15
COLOR I: PRINT I;
NEXT I
'
LOCATE 5, 3: INPUT "", ComPort$
LOCATE 8, 3: INPUT "", ComSpeed$
LOCATE 11, 3: INPUT "", ActName$
LOCATE 14, 3: INPUT "", ActFarbe
'
OPEN "EASYCHAT.CFG" FOR OUTPUT AS #1
PRINT #1, ComPort$
PRINT #1, ComSpeed$
PRINT #1, ActName$
PRINT #1, ActFarbe
CLOSE
'
END SUB
'
SUB Delay (Sekunden)
'
Start = TIMER
DO: LOOP UNTIL TIMER - Start >= Sekunden
'
END SUB
'
SUB Init
'
CLOSE
OPEN "EASYCHAT.CFG" FOR INPUT AS #1
INPUT #1, ComPort$
INPUT #1, ComSpeed$
INPUT #1, ActName$
INPUT #1, ActFarbe
CLOSE
'
END SUB
'
SUB Menue
'
MenueStart:
CLS
VIEW PRINT 1 TO 25
'
COLOR 15, 1
PRINT " EasyChat-Men "
COLOR 9, 1
PRINT "ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄz"
PRINT "l l"
PRINT "l 1. Chat starten l"
PRINT "l 2. Konfiguration l"
PRINT "l 3. Beenden l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "l l"
PRINT "RÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄU"
PRINT " "
'
MenueAbfrage:
Taste$ = INKEY$
SELECT CASE Taste$
CASE "1": GOTO ChatStarten
CASE "2": GOTO Konfiguration
CASE "3": GOTO Beenden
END SELECT
GOTO MenueAbfrage
'
ChatStarten:
Init
'
OpenCom
Syn
CLOSE
'
OpenCom
Chat
CLOSE
GOTO MenueStart
'
Konfiguration:
Config
GOTO MenueStart
'
Beenden:
CLOSE
VIEW PRINT 1 TO 25: COLOR 15, 0
CLS : END
'
END SUB
'
SUB OpenCom
'
CLOSE
OPEN ComPort$ + ComSpeed$ + ",N,8,1,BIN,CD0,CS0,DS0,OP0,RS,TB2048,RB2048" FOR RANDOM AS #1
'
END SUB
'
SUB Syn
'
CLS
PRINT "Synchronisiere Daten..."
'
Daten$ = ActName$ + STR$(ActFarbe)
'
PRINT #1, Daten$
DO
IF NameFa$ = "" THEN INPUT #1, NameFa$: EXIT DO
LOOP
PRINT #1, Daten$
'
OthName$ = MID$(NameFa$, 1, LEN(NameFa$) - 3)
OthFarbe = VAL(LEFT$(RIGHT$(NameFa$, 2), 2))
'
END SUB
 

ACHTUNG: Dieses Programm ist in der Onlineversion der FAQ leider nicht korrekt formatiert. Lade es von
www.antonis.de/faq/progs/ herunter, um in den Genuss des richtig formatierten Programms zu kommen
 
Das obige Programm steht im Verzeichnis Progs\ zur Verfügung sowie online unter www.antonis.de/faq/progs/easychat.bas ..
 
 

Antwort 4
~~~~~~~~~~~~~~~~~
[ von Karl Pircher ("Ch@rly"; ) per Mail, 15.5.2003 ]
.
Hier ein kleines Chatprogramm für eine Verbindung mit Nullmodemkabel. Habe ich in ein paar Stunden schnell zusammengezimmert, ist also noch ausbaufähig.
 
 
'*************************************************************************
' CHAT.BAS = Kleines Chatprogramm fuer eine Verbindung mit Nullmodemkabel
' ========
' Dieses Chatprogramm habe ich in ein paar Stunden schnell
' zusammengezimmert, ist also noch ausbaufähig. Wenn ihr wollt, könnte
' ich noch etwas aehnliches fuers Netzwerk machen, allerdings mit
' Datenaustausch über eine Datei, da TCP/IP unter QB nur mit speziellen
' Treibern funktioniert und das dann für die meisten uninteressant ist.
'
' Gruesse aus Suedtirol
' Ch@rly
'
' (c) Karl Pircher ("Ch@rly"; karl.pircher*gmx.net ) 15.5.2003 ]
'
'************************************************************************
DECLARE FUNCTION Recieve$ (kanal%)
DECLARE FUNCTION Send% (Rec AS STRING, kanal%)
DECLARE FUNCTION OpenCom% (Comport%, kanal%)
DECLARE SUB PrintStatus (Comport%, PortOpen%, RStatus AS ANY)
DECLARE SUB PrintSend (Rec AS STRING, char AS STRING, Rect AS ANY)
DECLARE SUB PrintRecieve (char AS STRING, Rect AS ANY)
DECLARE SUB Form (left%, Top%, HSend%, HRecieve%, HStatus%)
'
'------------------------------------------------Deklarationen
TYPE Rect
x1 AS INTEGER
y1 AS INTEGER
x2 AS INTEGER
y2 AS INTEGER
END TYPE
'
'------------------------------------------------Fehlerbehandlung
ON ERROR GOTO ErrorHandler
'
'------------------------------------------------Dimensionierungen
DEFINT A-Z ' Default alle Variablen als Integer definieren
DIM InRec AS STRING ' Einlesestring Tastatur
DIM InChar AS STRING ' Letzte Zeichen von Tastatur
DIM tmp AS STRING ' tempor„re Variable
DIM RSend AS Rect ' Koordinaten Empfangsfenster
DIM RRecieve AS Rect ' Koordinaten SendeFenster
DIM RStatus AS Rect ' Koordinaten Statusfenster
DIM SHARED fehler ' letzter aufgetretener Fehler
'
'------------------------------------------------Zuweisungen
Comport = 1 ' Nummer der Com
Top = 1 ' Oberer Rand
left = 5 ' linker Rand
HSend = 9 ' Anzahl Zeilen Sendefenster
HRecieve = 9 ' Anzahl Zeilen Empfangsfenster
HStatus = 1 ' Anzahl Zeilen Statusfenster
RSend.x1 = left + 2
RSend.x2 = 80 - (left + 1) * 2 - 1
RSend.y1 = Top + HRecieve + 3
RSend.y2 = HSend - 1
RRecieve.x1 = left + 2
RRecieve.x2 = 80 - (left + 1) * 2 - 1
RRecieve.y1 = Top + 2
RRecieve.y2 = HRecieve - 1
RStatus.x1 = left + 2
RStatus.x2 = 80 - (left + 1) * 2 - 1
RStatus.y1 = Top + HSend + HRecieve + 4
RStatus.y2 = HRecieve - 1
'
'------------------------------------------------Bildschirm
CLS
Form left, Top, HSend, HRecieve, HStatus ' Anzeige Bildschirmmaske
PrintSend "", "", RSend ' Kursor positionieren
'
'------------------------------------------------Port "ffnen
kanal = FREEFILE
PortOpen = OpenCom(Comport, kanal)
PrintStatus Comport, PortOpen, RStatus
PrintSend "", "", RSend ' Kursor positionieren
'
'------------------------------------------------Main
DO
'
'------------------------------------------------Eingabe
InChar = INKEY$
'
IF LEN(InChar) = 2 THEN ' Funktionstasten
SELECT CASE InChar
CASE CHR$(0) + CHR$(59) ' F1
Comport = 1 ' Com1 festlegen
PortOpen = OpenCom(Comport, kanal) ' Com1 "ffen
PrintStatus Comport, PortOpen, RStatus ' Status aktualisieren
PrintSend "", "", RSend ' Kursor positionieren
CASE CHR$(0) + CHR$(60) ' F2
Comport = 2 ' Com2 festlegen
PortOpen = OpenCom(Comport, kanal) ' Com2 "ffnen
PrintStatus Comport, PortOpen, RStatus' Status aktualisieren
PrintSend "", "", RSend ' Kursor positionieren
END SELECT
'
ELSE ' Andere Tasten
IF InChar <> "" THEN
SELECT CASE InChar
CASE CHR$(8) ' Backspace
IF LEN(InRec) > 0 THEN
PrintSend InRec, InChar, RSend ' Zeichen l"schen
ELSE
BEEP
END IF
CASE CHR$(13) ' Enter
s = Send(InRec, kanal) ' Zeile senden
InRec = "" ' Eingabe l"schen
PrintSend InRec, InChar, RSend ' Neue Zeile
CASE CHR$(27) ' Esc
EXIT DO
CASE ELSE
InRec = InRec + InChar ' Eingabe aktualisieren
PrintSend InRec, InChar, RSend ' und anzeigen
END SELECT
END IF
END IF
'
'------------------------------------------------Einlesen
IF PortOpen = -1 THEN ' Wenn Port ge"ffnet
tmp = Recieve(kanal) ' Daten von Com holen
IF tmp <> "" THEN ' Wenn Daten eingetroffen
PrintRecieve tmp, RRecieve ' dann anzeigen
PrintSend "", "", RSend ' Kursor wieder ins Sendfendter
END IF
END IF
LOOP
CLOSE kanal ' Kanal schliessen
SYSTEM ' und beednen
'
'------------------------------------------------Fehlerbehandlung
ErrorHandler:
fehler = ERR
RESUME NEXT
'
SUB Form (left, Top, HSend, HRecieve, HStatus)
'-----------------------------------------------
' SUB Form - Anzeige Bildschirmmaske
' =========
' Parameter:
' Left = Linker Rand in Spalten
' Top = Rand oben in Zeilen
' HSend = Hoehe Fenster Senden in Zeilen
' HRecieve = Hoehe Fenster Empfangen in Zeilen
' HStatus = H"he fenster Status in Zeilen
'-----------------------------------------------
FOR i = 0 TO Top - 1
PRINT
NEXT
'
PRINT SPACE$(left);
PRINT CHR$(218); ' Ú
PRINT STRING$(78 - 2 * left, 196); ' Ä
PRINT CHR$(191) ' z
FOR i = 1 TO HRecieve
PRINT SPACE$(left);
PRINT CHR$(179); ' l
PRINT SPACE$(78 - 2 * left);
PRINT CHR$(179) ' l
NEXT
PRINT SPACE$(left);
PRINT CHR$(195); ' A
PRINT STRING$(78 - 2 * left, 196); ' Ä
PRINT CHR$(180) ' ´
FOR i = 1 TO HSend
PRINT SPACE$(left);
PRINT CHR$(179); ' l
PRINT SPACE$(78 - 2 * left);
PRINT CHR$(179) ' l
NEXT
'
PRINT SPACE$(left);
PRINT CHR$(195); ' A
PRINT STRING$(78 - 2 * left, 196); ' Ä
PRINT CHR$(180) ' ´
FOR i = 1 TO HStatus
PRINT SPACE$(left);
PRINT CHR$(179); ' l
PRINT SPACE$(78 - 2 * left);
PRINT CHR$(179) ' l
NEXT
'
PRINT SPACE$(left);
PRINT CHR$(192); ' R
PRINT STRING$(78 - 2 * left, 196); ' Ä
PRINT CHR$(217); ' U
'
END SUB
'
FUNCTION OpenCom (Comport, kanal)
'---------------------------------------------
' FUNCTION OpenCom - Com Port oeffnen
' ================
'---------------------------------------------
fehler = 0
'
CLOSE #kanal
OPEN "com" + LTRIM$(STR$(Comport)) + ": 9600,n,8,1,cs0,ds0,cd0" FOR RANDOM AS #kanal
'
IF fehler = 0 THEN
OpenCom = -1
ELSE
OpenCom = 0
END IF
'
END FUNCTION
'
SUB PrintRecieve (printstring AS STRING, Rect AS Rect)
'--------------------------------------------------------
' SUB PrintRecieve - Anzeige e.Strings im Empfangsfenster
' ================
'--------------------------------------------------------
'
STATIC XPos
STATIC YPos
DIM char AS STRING
'
LOCATE Rect.y1 + YPos, Rect.x1 + XPos, 0
'
FOR k = 1 TO LEN(printstring)
char = MID$(printstring, k, 1)
SELECT CASE char
CASE CHR$(13)
IF YPos < Rect.y2 THEN
YPos = YPos + 1
ELSE
VIEW PRINT Rect.y1 TO Rect.y1 + Rect.y2
FOR i = 1 TO Rect.y2
PRINT
NEXT
PRINT
PRINT SPACE$(Rect.x1 - 2);
PRINT CHR$(179);
PRINT SPACE$(Rect.x2 + 1);
PRINT CHR$(179);
VIEW PRINT
END IF
XPos = 0
LOCATE Rect.y1 + YPos, Rect.x1 + XPos
CASE ELSE
PRINT char;
IF XPos < Rect.x2 THEN
XPos = XPos + 1
ELSEIF XPos = Rect.x2 THEN
IF YPos < Rect.y2 THEN
YPos = YPos + 1
ELSE
VIEW PRINT Rect.y1 TO Rect.y1 + Rect.y2
FOR i = 1 TO Rect.y2
PRINT
NEXT
PRINT
PRINT SPACE$(Rect.x1 - 2);
PRINT CHR$(179);
PRINT SPACE$(Rect.x2 + 1);
PRINT CHR$(179);
VIEW PRINT
END IF
XPos = 0
END IF
END SELECT
NEXT
'
END SUB
'
SUB PrintSend (Rec AS STRING, char AS STRING, Rect AS Rect)
'--------------------------------------------------------
' SUB PrintSend - Anzeige eines Zeichens im Sendfenster
' =============
'--------------------------------------------------------
'
STATIC XPos
STATIC YPos
'
LOCATE Rect.y1 + YPos, Rect.x1 + XPos, 1
IF char <> "" THEN
SELECT CASE char
CASE CHR$(13)
IF YPos < Rect.y2 THEN
YPos = YPos + 1
ELSE
VIEW PRINT Rect.y1 TO Rect.y1 + Rect.y2
FOR i = 1 TO Rect.y2
PRINT
NEXT
PRINT
PRINT SPACE$(Rect.x1 - 2);
PRINT CHR$(179);
PRINT SPACE$(Rect.x2 + 1);
PRINT CHR$(179);
VIEW PRINT
END IF
XPos = 0
LOCATE Rect.y1 + YPos, Rect.x1 + XPos
CASE CHR$(8)
IF XPos > 0 THEN
XPos = XPos - 1
LOCATE Rect.y1 + YPos, Rect.x1 + XPos
PRINT " ";
LOCATE Rect.y1 + YPos, Rect.x1 + XPos
Rec = LEFT$(Rec, LEN(Rec) - 1)
ELSE
BEEP
END IF
CASE ELSE
PRINT char;
IF XPos < Rect.x2 THEN
XPos = XPos + 1
ELSEIF XPos = Rect.x2 THEN
IF YPos < Rect.y2 THEN
YPos = YPos + 1
ELSE
VIEW PRINT Rect.y1 TO Rect.y1 + Rect.y2
FOR i = 1 TO Rect.y2
PRINT
NEXT
PRINT
PRINT SPACE$(Rect.x1 - 2);
PRINT CHR$(179);
PRINT SPACE$(Rect.x2 + 1);
PRINT CHR$(179);
VIEW PRINT
END IF
XPos = 0
LOCATE Rect.y1 + YPos, Rect.x1 + XPos, 1
END IF
END SELECT
END IF
'
END SUB
'
SUB PrintStatus (Comport, PortOpen, RStatus AS Rect)
'---------------------------------------------------------
' SUB PrintStatus - Anzeige Status
' ===============
'---------------------------------------------------------
'
DIM Status AS STRING
'
LOCATE RStatus.y1, RStatus.x1
Status = "F1 = Com1: F2 = Com2: ESC = Ende "
IF PortOpen = -1 THEN
Status = Status + "Parameter: Com" + LTRIM$(STR$(Comport)) + ": 9600,n,8,1 "
ELSE
Status = Status + "Fehler beim ™ffnen der Com" + LTRIM$(STR$(Comport)) + ":"
END IF
Status = LEFT$(Status + SPACE$(80), RStatus.x2 + 1)
PRINT Status
'
END SUB
'
FUNCTION Recieve$ (kanal)
'---------------------------------------------
' FUNCTION Recieve$ - Zeichen empfangen
' =================
'---------------------------------------------
'
IF NOT EOF(kanal) THEN
Recieve$ = INPUT$(LOC(kanal), kanal)
END IF
'
END FUNCTION
'
FUNCTION Send (Rec AS STRING, kanal)
'-----------------------------------------------
' FUNCTION Send - Senden der eingegeben Daten.
' =============
'-----------------------------------------------
'
PRINT #kanal, Rec
'
END FUNCTION
 
Das obige Programm steht im Verzeichnis Progs\ zur Verfügung sowie online unter www.antonis.de/faq/progs/chat.bas .
 
 

[ The QBasic-MonsterFAQ --- Start Page: www.antonis.de/faq ]