home *** CD-ROM | disk | FTP | other *** search
- (*========================================================*)
- (* IPXTESTD.PAS *)
- (* (C) 1993 G. Blumert & DMV-Verlag *)
- (*--------------------------------------------------------*)
- (* Compiler: *)
- (* Turbo-Pascal 6.0 *)
- (* Demo-Anwendung zur Demonstration einer Netzwerkan- *)
- (* wendung. *)
- (* Programm in ein Netzwerkverzeichnis kopieren und von *)
- (* verschiedenen Arbeitsstationen aus aufrufen *)
- (* Achtung: Das Programm läuft unter Windows nur exklusiv *)
- (* als Vollbild! *)
- (* Setzt das Vorhandensein eines Novell-Netzwerks voraus! *)
- (*========================================================*)
-
- PROGRAM IPXTest;
- {$X+}
- USES
- App, Dos, IPX, NetLog, Objects, Views, Drivers, Memory,
- MsgBox, Menus;
-
- TYPE
- pIPXApp = ^tIPXApp;
- tIPXApp = OBJECT(tApplication)
- LogColl : pLogColl; (* Liste der Fenster, *)
- (* die IPX nutzen *)
- CONSTRUCTOR Init;
- DESTRUCTOR Done; VIRTUAL;
-
- (* TRUE, wenn Programm unter Windows läuft *)
- FUNCTION RunsUnderWindows: BOOLEAN;
- PROCEDURE InitMenuBar; VIRTUAL;
- PROCEDURE GetEvent(VAR Event: tEvent); VIRTUAL;
- PROCEDURE HandleEvent(VAR Event: tEvent); VIRTUAL;
-
- (* Öffnet ein neues Fenster für die angegebene *)
- (* Dateinummer *)
- PROCEDURE InsertWindow(aFileNum: LongInt);
-
- PRIVATE
- (* Hier steht die nächste zu vergebende Fensternummer *)
- WinNum : INTEGER;
-
- END;
-
- pIPXWin = ^tIPXWin; (* Demo-Fenster *)
- tIPXWin = OBJECT(tWindow)
- UserColl: PUserColl;
- WinNum : LongInt; (* Vereinfacht die Sache für *)
- (* FormatStr bzw. MsgBox *)
- FileNum: LongInt; (* LongInt auch wegen der *)
- (* FormatStr-Routine *)
- IsValid: BOOLEAN;
- CONSTRUCTOR Init(aNumber: INTEGER; aFileNum: LongInt);
- FUNCTION Valid(Command: WORD): BOOLEAN; VIRTUAL;
- PROCEDURE HandleEvent(VAR Event: tEvent); VIRTUAL;
- END;
-
- CONST
- cm_NewFile1 = 1001; (* Fenster für Datei 1 öffnen *)
- cm_NewFile2 = 1002; (* Fenster für Datei 2 öffnen *)
- cm_NewFile3 = 1003; (* Fenster für Datei 3 öffnen *)
- cm_SendCommand = 1004;
-
- CONSTRUCTOR tIPXWin.Init(aNumber: INTEGER;
- aFileNum: LongInt);
- VAR
- r : tRect;
- fName: PathStr;
- BEGIN
- fName := ParamStr(0);
- WHILE fName[Length(fName)] <> '\' DO Dec(fName[0]);
- fName := fName + 'IPXTEST.LG' + CHAR(aFileNum + Ord('0'));
- DeskTop^.GetExtent(r);
- tWindow.Init(r, fName, aNumber);
- FileNum := aFileNum;
- WinNum := aNumber;
- Options := Options OR ofTileable;
- (* Wenn das einloggen nicht klappt, Fenster ungültig *)
- (* machen *)
- UserColl := pIPXApp(Application)^.LogColl^.LogIn(fName,
- @Self);
- IsValid := UserColl <> NIL
- END;
-
- (* Beim Initialisieren wird geprüft, ob das Einloggen *)
- (* erfolgreich war. Das Schließen wird nur nach *)
- (* erfolgreichem Ausloggen gestattet - was zwar fatal *)
- (* ist, wenn der Server abgeschmiert ist, aber dann sind *)
- (* die Daten ja sowieso beim Teufel . . . *)
- FUNCTION tIPXWin.Valid(Command: WORD): BOOLEAN;
- BEGIN
- Valid := TRUE;
- IF Command = cmValid THEN Valid := IsValid ELSE
- IF Command = cmClose THEN
- IF NOT pIPXApp(Application)^.LogColl^.LogOut(@Self) THEN
- BEGIN
- MessageBox(^c'Fenster %d:'#13'Datei %d konnte nicht ' +
- 'ausloggen!',
- @WinNum,
- mfInformation OR mfOkButton);
- Valid := FALSE;
- END
- END;
-
- PROCEDURE tIPXWin.HandleEvent(VAR Event: tEvent);
- VAR
- WinID: pIPX_WindowID;
-
- FUNCTION IsIPXCommand(aCommand: WORD): BOOLEAN;
- BEGIN
- IsIPXCommand := (aCommand = wm_CommandReceived) OR
- (aCommand = wm_LoggedIn) OR
- (aCommand = wm_LoggedOut)
- END;
-
- BEGIN
- tWindow.HandleEvent(Event);
-
- IF (Event.What = evCommand) AND
- (Event.Command = cm_SendCommand) THEN BEGIN
- UserColl^.SendCommand(wm_CommandReceived,NIL);
- ClearEvent(Event)
-
- END ELSE IF (Event.What = evBroadcast) AND
- IsIPXCommand(Event.Command) AND
- (pIPX_Packet(Event.InfoPtr)^.Data.DestWin = @Self)
- THEN BEGIN
- CASE Event.Command OF
- wm_CommandReceived:
- MessageBox(^c'Fenster %d:'#13'Datei %d' +
- ' wurde bearbeitet!', @WinNum,
- mfInformation OR mfOkButton);
- wm_LoggedIn:
- BEGIN
- UserColl^.AddUser(Event.InfoPtr);
- MessageBox('Fenster %d:'#13+
- 'Datei %d hat einen weiteren Nutzer',
- @WinNum, mfInformation OR mfOkButton);
- END;
- wm_LoggedOut:
- BEGIN
- UserColl^.DeleteUser(Event.InfoPtr);
- MessageBox(^c'Fenster %d:'#13^c +
- 'Datei %d hat einen Nutzer weniger',
- @WinNum, mfInformation OR mfOkButton);
- END
-
- ELSE Exit END;
-
- BuffColl^.ClearPacket(Event.InfoPtr);(* !! Wichtig !! *)
- ClearEvent(Event); (* Unbedingt diese Reihenfolge! *)
- END;
- END;
-
- CONSTRUCTOR tIPXApp.Init;
- VAR
- r: tRect;
- i: INTEGER;
-
- (* Leert den Tastaturpuffer und wartet dann auf eine *)
- (* Taste *)
- FUNCTION GetKey: CHAR; ASSEMBLER;
- ASM
- @Nochmal:
- MOV AH, 1 (* Funkt. $01 - Prüfe Tastaturpuffer *)
- INT 16H (* Tastatur-Interrupt *)
- JZ @leer (* Zeichen vorhanden? *)
- MOV AH, 0 (* Dann Funkt. $$00 aufrufen - *)
- (* Zeichen lesen *)
- INT 16H (* Tastatur-Interrupt *)
- JMP @Nochmal (* Noch mehr Zeichen im Puffer ? *)
- @leer:
- MOV AH, 0
- INT 16H (* Rückgabe: AH ScanCode, AL Tastencode *)
- END;
-
- BEGIN
- IF NOT InitIPX THEN BEGIN (* !! Wichtig !! *)
- PrintStr('IPX nicht geladen!'#13#10);
- Halt(1)
- END;
- IF RunsUnderWindows THEN BEGIN (* !! Auch wichtig !! *)
- PrintStr('Programm muß exklusiv als Vollbild laufen!' +
- #13#10);
- PrintStr('Wenn nicht, dann ist gleich der Griff zum ' +
- 'Reset-Schalter fällig!'#13#10+
- 'Abbruch mit <Esc>, mit jeder Taste Programm' +
- ' starten . . .');
- IF GetKey = #27 THEN Halt(2);
- ASM
- MOV AX, 1681H (* Begin critical section *)
- INT 2FH (* Verhinder Taskwechsel *)
- END;
- END;
- tApplication.Init;
- WinNum := 1; (* 1. zu vergebende Fensternummer *)
- LogColl := New(PLogColl,Init);
- IF LogColl = NIL THEN Fail; (* Speicher reservieren *)
- DeskTop^.GetExtent(r);
- FOR i := 1 TO 3 DO InsertWindow(i); (* Fenster einfügen *)
- DeskTop^.Tile(r);
- END;
-
- DESTRUCTOR tIPXApp.Done;
- BEGIN
- IF LogColl <> NIL THEN Dispose(LogColl,Done);
- IF RunsUnderWindows THEN ASM
- MOV AX, 1682H; (* End critical section *)
- INT 2FH
- END;
- tApplication.Done
- END;
-
- (* Windows setzt bei der Initialisierung die *)
- (* Umgebungsvariable WINDIR. Allerdings, immer in Klein- *)
- (* buchstaben. *)
- (* Die Funktion GetEnv hingegen wandelt den übergebenen *)
- (* Variablennamen in Großbuchstaben um - und findet dann *)
- (* das klein geschriebene windir nicht. *)
- (* Daher muß man jeden Eintrag "zu Fuß" prüfen *)
- FUNCTION tIPXApp.RunsUnderWindows: BOOLEAN;
- VAR
- j: INTEGER;
-
- {$IFDEF Ver70}
- FUNCTION ToUpper(CONST s: STRING): STRING;
- {$ELSE}
- FUNCTION ToUpper(s: STRING): STRING;
- {$ENDIF}
- VAR
- i: BYTE;
- BEGIN
- FOR i := 1 TO Length(s) DO s[i] := UpCase(s[i]);
- ToUpper := s
- END;
-
- BEGIN
- RunsUnderWindows := FALSE;
- FOR j := 1 TO EnvCount DO
- IF Pos('WINDIR=', ToUpper(EnvStr(j))) = 1 THEN
- RunsUnderWindows := TRUE
- END;
-
-
- PROCEDURE tIPXApp.InitMenuBar;
- VAR
- r: tRect;
- BEGIN
- DeskTop^.GetExtent(r);
- r.B.Y := Succ(r.A.Y);
- MenuBar := New(pMenuBar, Init(r, NewMenu(
- NewSubMenu('~D~atei', hcNoContext, NewMenu(
- NewItem('Datei ~1~', '', kbNoKey,cm_NewFile1, 0,
- NewItem('Datei ~2~', '', kbNoKey,cm_NewFile2, 0,
- NewItem('Datei ~3~', '', kbNoKey,cm_NewFile3, 0,
- NewLine(
- NewItem('E~x~it', 'Alt-X', kbAltX, cmQuit, 0,
- NIL)))))),
- NewSubMenu('~N~etzwerk', hcNoContext, NewMenu(
- NewItem('~N~achricht abschicken', 'F2', kbF2,
- cm_SendCommand, hcNoContext,
- NIL)),
- NewSubMenu('~F~enster', hcNoContext, NewMenu(
- NewItem('~B~ewegen', 'STRG+F5', kbCtrlF5, cmResize, 0,
- NewItem('~Z~oom', 'F5', kbF5,cmZoom, hcNoContext,
- NewItem('~T~ile', '', kbNoKey, cmTile, hcNoContext,
- NewItem('~C~ascade', '', kbNoKey, cmCascade, 0,
- NewItem('~V~origes', 'STRG+F6', kbCtrlF6, cmPrev, 0,
- NewItem('~N~ächstes', 'F6', kbF6, cmNext, hcNoContext,
- NewItem('~S~chließen', 'ALT+F3', kbAltF3, cmClose, 0,
- NIL)))))))),
- NIL))))))
- END;
-
- (* Wenn ein Paket angekommen ist, dieses weiterreichen, *)
- (* sonst normale Event-Behandlung *)
- PROCEDURE tIPXApp.GetEvent(VAR Event: tEvent);
- BEGIN
- WITH BuffColl^ DO
- IF (NOT PacketAvailable) THEN
- tApplication.GetEvent(Event)
- ELSE BEGIN
- WITH Event DO BEGIN
- InfoPtr := GetPacket;
- What := evBroadcast;
- Event.Command :=
- pIPX_Packet(Event.InfoPtr)^.Data.Command;
- END;
- END;
- END;
-
- PROCEDURE tIPXApp.HandleEvent(VAR Event: tEvent);
- VAR
- WinID : pIPX_WindowID;
- UserColl : PUserColl;
- TheParent: pView;
- r : tRect;
-
- PROCEDURE CloseAll(Item: pView); FAR;
- BEGIN
- Message(Item,evCommand,cmClose,NIL)
- END;
-
- BEGIN
-
- (* Es ist wichtig, daß die Fenster alle einzeln *)
- (* ordentlich geschlossen werden. Anderenfalls bleiben *)
- (* eventuell LOG-Dateien zurück! *)
-
- IF (Event.Command = cmQuit) THEN
- DeskTop^.ForEach(@CloseAll);
-
- (* Hier kann man jetzt, wenn es beim Schließen der *)
- (* Fenster zu einem Fehler kommt, ClearEvent aufrufen, um *)
- (* das Programm doch nicht zu beenden *)
-
- tApplication.HandleEvent(Event);
- IF Event.What = evCommand THEN BEGIN
- CASE Event.Command OF
- cmTile: BEGIN
- DeskTop^.GetExtent(r);
- DeskTop^.Tile(r)
- END;
- cmCascade: BEGIN
- DeskTop^.GetExtent(r);
- DeskTop^.Cascade(r)
- END;
- cm_NewFile1: InsertWindow(1);
- cm_NewFile2: InsertWindow(2);
- cm_NewFile3: InsertWindow(3);
- ELSE Exit END;
- ClearEvent(Event)
- END
- END;
-
- PROCEDURE tIPXApp.InsertWindow(aFileNum: LongInt);
- BEGIN
- DeskTop^.Insert(ValidView(New(pIPXWin, Init(WinNum,
- aFileNum))));
- Inc(WinNum)
- END;
-
- VAR TestApp: tIPXApp;
- BEGIN
- IF TestApp.Init THEN TestApp.Run;
- TestApp.Done;
- END.
-
- (*========================================================*)
- (* Ende von IPXTESTD.PAS *)
-