home *** CD-ROM | disk | FTP | other *** search
- (*========================================================*)
- (* IPXTESTD.PAS *)
- (* (C) 1993 G. Blumert & DMV-Verlag *)
- (*--------------------------------------------------------*)
- (* Compiler: *)
- (* Turbo-/Borland Pascal fⁿr Windows *)
- (* Demo-Anwendung zur Demonstration einer Netzwerkan- *)
- (* wendung. *)
- (* Programm in ein Netzwerkverzeichnis kopieren und von *)
- (* verschiedenen Arbeitsstationen aus aufrufen *)
- (* Setzt das Vorhandensein eines Novell-Netzwerks voraus! *)
- (* LΣuft nicht im Real-Mode! *)
- (*========================================================*)
-
- PROGRAM IPXTest;
- {$X+,B-}
- {$R IPXTEST.RES}
- USES
- MyWinDos, WinDos, IPX, NetLog, {$IFDEF Ver70} Objects,
- OWindows, (* Oh-Borland *) {$ELSE} WObjects, {$ENDIF}
- Strings, WinProcs, WinTypes, DPMI;
-
- 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; (* Nachricht an andere Fenster *)
-
- (* Wenn TRUE, wird gerade die Message wm_ActivateApp *)
- (* bearbeitet. *)
- (* Der Aufruf von MessageBox wⁿrde in diesem Fall in *)
- (* eine Endlosschleife fⁿhren. *)
- IsLoggedOut: BOOLEAN = FALSE;
-
- TYPE
- pIPXApp = ^tIPXApp;
- tIPXApp = OBJECT(tApplication)
- CONSTRUCTOR Init(aName: pChar);
- PROCEDURE InitApplication; VIRTUAL;
- PROCEDURE InitMainWindow; VIRTUAL;
- PRIVATE
- FirstInstance: BOOLEAN;(* Programm schon im Speicher? *)
- END;
-
- pIPXMDIWin = ^tIPXMDIWin;
- tIPXMDIWin = OBJECT(tMDIWindow)
- LogColl : pLogColl;
- (* Liste der Fenster, die IPX nutzen *)
- CONSTRUCTOR Init;
- DESTRUCTOR Done; VIRTUAL;
- PROCEDURE SetupWindow; VIRTUAL;
- PROCEDURE NewChild(aFileNum: INTEGER);
- PROCEDURE cmNewFile1(VAR Msg: tMessage);
- VIRTUAL cm_First+cm_NewFile1;
- PROCEDURE cmNewFile2(VAR Msg: tMessage);
- VIRTUAL cm_First+cm_NewFile2;
- PROCEDURE cmNewFile3(VAR Msg: tMessage);
- VIRTUAL cm_First+cm_NewFile3;
- PROCEDURE wmActivateApp(VAR Msg: tMessage);
- VIRTUAL wm_First+wm_ActivateApp;
- PRIVATE
- WinNum: INTEGER;
- FirstActivation: BOOLEAN;
- END;
-
- pIPXWin = ^tIPXWin; (* Demo-Fenster *)
- tIPXWin = OBJECT(tWindow)
- UserColl: pUserColl;
- WinNum : INTEGER;
- FileNum: INTEGER;
- IsActive: BOOLEAN;
- CONSTRUCTOR Init(aNumber: INTEGER; aFileNum: LongInt);
- FUNCTION CanClose: BOOLEAN; VIRTUAL;
- PROCEDURE wmCommandReceived(VAR Msg: tMessage);
- VIRTUAL wm_CommandReceived;
- PROCEDURE wmLoggedIn(VAR Msg: tMessage);
- VIRTUAL wm_LoggedIn;
- PROCEDURE wmLoggedOut(VAR Msg: tMessage);
- VIRTUAL wm_LoggedOut;
- PROCEDURE cmSendCommand(VAR Msg: tMessage);
- VIRTUAL cm_First+cm_SendCommand;
- END;
-
- CONSTRUCTOR tIPXWin.Init(aNumber: INTEGER;
- aFileNum: LongInt);
- VAR
- fName : PathStr;
- fName0 : ARRAY[0..fsPathName+20] OF CHAR;
- WinNumStr: STRING[4];
- (* Reicht fⁿr Nummern bis 9999 - das sollte reichen *)
- BEGIN
- Str(aNumber, WinNumStr);
- fName := ParamStr(0);
- WHILE fName[Length(fName)] <> '\' DO Dec(fName[0]);
- fName := fName + 'IPXTEST.LG' + CHAR(aFileNum + Ord('0'));
- tWindow.Init(Application^.MainWindow,
- StrPCopy(fName0, 'Fenster ' + WinNumStr +
- ' - ' + fName));
- FileNum := aFileNum;
- WinNum := aNumber;
- (* Wenn das Einloggen nicht klappt, Fenster ungⁿltig *)
- (* machen *)
- UserColl :=
- pIPXMDIWin(Application^.MainWindow)^.LogColl^.LogIn(
- fName, @Self);
- IF UserColl = NIL THEN Status := em_InvalidWindow;
- IsActive := Status <> em_InvalidWindow
- END;
-
- (* 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.CanClose: BOOLEAN;
- VAR
- Msg: ARRAY[0..50] OF CHAR;
- BEGIN
- IF NOT pIPXMDIWin(
- Application^.MainWindow)^.LogColl^.LogOut(@Self)
- THEN BEGIN
- wvSprintF(Msg,
- 'Fenster %d:'#13'Datei %d konnte nicht ' +
- 'ausloggen!',
- WinNum);
- MessageBox(GetFocus, Msg, 'Fehler',
- mb_OK OR mb_IconExclamation);
- CanClose := FALSE
- END ELSE BEGIN
- CanClose := TRUE;
- IsActive := FALSE
- END
- END;
-
- PROCEDURE tIPXWin.wmCommandReceived(VAR Msg: tMessage);
- VAR
- MsgStr: ARRAY[0..50] OF CHAR;
- BEGIN
- wvSprintF(MsgStr,
- 'Fenster %d:'#13'Datei %d wurde bearbeitet!',
- WinNum);
- MessageBox(GetFocus, MsgStr, 'Achtung',
- mb_OK OR mb_IconInformation);
- Msg.Result := -1;
- BuffColl^.ClearPacket(POINTER(Msg.lParam))
- END;
-
- PROCEDURE tIPXWin.wmLoggedIn(VAR Msg: tMessage);
- VAR
- MsgStr: ARRAY[0..50] OF CHAR;
- BEGIN
- UserColl^.AddUser(PIPX_Packet(Msg.lParam));
- IF NOT IsLoggedOut THEN BEGIN
- wvSprintF(MsgStr,
- 'Fenster %d:'#13'Datei %d hat einen ' +
- 'weiteren Nutzer', WinNum);
- MessageBox(0, MsgStr, 'Achtung',
- mb_OK OR mb_IconInformation
- OR mb_SystemModal)
- END;
- Msg.Result := -1;
- BuffColl^.ClearPacket(POINTER(Msg.lParam))
- END;
-
- PROCEDURE tIPXWin.wmLoggedOut(VAR Msg: tMessage);
- VAR
- MsgStr: ARRAY[0..50] OF CHAR;
- BEGIN
- UserColl^.DeleteUser(PIPX_Packet(Msg.lParam));
- IF NOT IsLoggedOut THEN BEGIN
- wvSprintF(MsgStr, 'Fenster %d:'#13'Datei %d hat ' +
- 'einen Nutzer weniger!', WinNum);
- MessageBox(0, MsgStr, 'Achtung',
- mb_OK OR mb_IconInformation);
- END;
- Msg.Result := -1;
- BuffColl^.ClearPacket(POINTER(Msg.lParam))
- END;
-
- PROCEDURE tIPXWin.cmSendCommand(VAR Msg: tMessage);
- BEGIN
- UserColl^.SendCommand(wm_CommandReceived, NIL)
- END;
-
- CONSTRUCTOR tIPXMDIWin.Init;
- BEGIN
- tMDIWindow.Init('IPX-Demo',
- LoadMenu(hInstance, 'DemoMenu'));
- ChildMenuPos := 2;
- WinNum := 1; (* Erste zu vergebende Fensternummer = 1 *)
- LogColl := New(pLogColl, Init);
- IF LogColl = NIL THEN BEGIN
- Status := em_InvalidWindow;
- PostQuitMessage(1)
- END;
- FirstActivation := TRUE
- END;
-
- DESTRUCTOR tIPXMDIWin.Done;
- BEGIN
- IF LogColl <> NIL THEN BEGIN
- Dispose(LogColl, Done);
- LogColl := NIL
- END;
- tMDIWindow.Done
- END;
-
- PROCEDURE tIPXMDIWin.SetupWindow;
- VAR
- i: INTEGER;
- BEGIN
- tMDIWindow.SetupWindow;
- FOR i := 1 TO 3 DO NewChild(i)
- END;
-
- PROCEDURE tIPXMDIWin.NewChild(aFileNum: INTEGER);
- BEGIN
- Application^.MakeWindow(New(pIPXWin,
- Init(WinNum, aFileNum)));
- Inc(WinNum)
- END;
-
- PROCEDURE tIPXMDIWin.cmNewFile1(VAR Msg: tMessage);
- BEGIN
- NewChild(1)
- END;
-
- PROCEDURE tIPXMDIWin.cmNewFile2(VAR Msg: tMessage);
- BEGIN
- NewChild(2)
- END;
-
- PROCEDURE tIPXMDIWin.cmNewFile3(VAR Msg: tMessage);
- BEGIN
- NewChild(3)
- END;
-
- (* Inaktiviert das Programm, insbesondere die *)
- (* ListenForPacket-Routine, wenn ein Taskwechsel *)
- (* vorgenommen wird. Ist ein DOS-Fenster aktiv, glitscht *)
- (* der Rechner sonst bei Empfang eine Packets ab. *)
- (* Es darf nicht MessageBox aufgerufen werden, um das *)
- (* Ausloggen anzuzeigen. Dann wⁿrde die Anwendung nΣmlich *)
- (* wieder aktiviert und unschlie▀end deaktiviert, mit *)
- (* den entsprechenden wm_ActivateApp-Messages, und zwar *)
- (* so lange, bis der Anwender den Reset-Schalter gefunden *)
- (* hat. *)
- (* Bei erneuter Aktivierung mu▀ ⁿberprⁿft werden, ob die *)
- (* von den Fenstern dargestellten Daten noch gⁿltig sind. *)
- (* Bei Auftreten von Fehlern sollte PostMessage *)
- (* aufgerufen werden, so da▀ "bei Gelegenheit" eine *)
- (* Meldung angezeigt wird. *)
-
- PROCEDURE tIPXMDIWin.wmActivateApp(VAR Msg: tMessage);
-
- PROCEDURE DoLogOut(Item: pUserColl); FAR;
- BEGIN
- Item^.LogOut;
- Item^.FreeAll
- END;
-
- PROCEDURE DoLogIn(Item: pUserColl); FAR;
- BEGIN
- WITH Item^ DO LogIn(Parent,FileName^)
- END;
-
- BEGIN
- IF Msg.wParam = 0 THEN BEGIN
- IF LogColl <> NIL THEN BEGIN (* Anwendung wird *)
- IsLoggedOut := TRUE; (* deaktiviert *)
- LogColl^.ForEach(@DoLogOut);
- LogColl^.StopListening;
- DefWndProc(Msg)
- END;
- END ELSE BEGIN
- DefWndProc(Msg);
- IF NOT FirstActivation THEN BEGIN
- (* die erste wm_ActivateApp - Meldung *)
- LogColl^.StartListening; (* ignorieren *)
- LogColl^.ForEach(@DoLogIn);
- IsLoggedOut := FALSE
- END ELSE FirstActivation := FALSE
- END
- END;
-
- CONSTRUCTOR tIPXApp.Init(aName: pChar);
- BEGIN
- tApplication.Init(aName);
- FirstInstance := FALSE
- END;
-
- (* Wird nur von der ersten Instanz einer Anwendung *)
- (* aufgerufen *)
- PROCEDURE tIPXApp.InitApplication;
- BEGIN FirstInstance := TRUE END;
-
- PROCEDURE tIPXApp.InitMainWindow;
- BEGIN
- IF GetWinFlags AND wf_PMode = 0 THEN
- (* Kurz und schmerzlos *)
- FatalAppExit(0,
- 'Diese Anwendung lΣuft nicht im Real-Modus!');
- IF NOT FirstInstance THEN
- FatalAppExit(0,
- 'Diese Anwendung darf nur einmal gestartet werden!')
- ELSE
- MainWindow := New(pIPXMDIWin,Init)
- END;
-
- VAR
- TestApp: tIPXApp;
- BEGIN
- IF TestApp.Init('IPX-Demo') THEN TestApp.Run;
- TestApp.Done;
- END.
-