home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1988-12-22 | 5.6 KB | 173 lines |
- (*********************************************************)
- (* ReqString.mod *)
- (* Module zum einfachen Erstellen eines Stringrequests *)
- (* (C) 1988 Frank Schäfer & TOOLBOX *)
-
- IMPLEMENTATION MODULE ReqString;
-
- FROM Dos IMPORT Delay;
- FROM Strings IMPORT Length;
- FROM Graphics IMPORT jam2,Text;
- FROM Intuition IMPORT ActivateGadget,ActivationFlags,
- ActivationFlagSet,Gadget,GadgetFlags,Point,
- Border,CloseWindow,BorderPtr,IntuiTextPtr,GadgetFlagSet,
- IDCMPFlags,IDCMPFlagSet,IntuiMessage,IntuiText,
- RefreshGadgets,ScreenPtr,strGadget,StringInfo,
- WindowFlags,WindowFlagSet,WindowPtr,GadgetPtr,
- RefreshGList,StringInfoPtr;
- FROM SYSTEM IMPORT ADDRESS,ADR,INLINE,CAST;
- FROM WindowHelp2 IMPORT GADGET,SCREEN,WaitEvent,WINDOW;
-
- (*-------------------------------------------------------*)
-
- CONST MaxGadget = 20;
- Max8Zeichen = 47;
- Max9Zeichen = 38;
-
- (*-------------------------------------------------------*)
-
- PROCEDURE MakeIText (VAR IText : IntuiText;
- Text : ADDRESS;
- x,y : INTEGER);
-
- BEGIN
- WITH IText DO
- frontPen := 1; backPen := 0;
- drawMode := jam2; leftEdge := x;
- topEdge := y; iText := Text;
- iTextFont := NIL; nextText := NIL
- END
- END MakeIText;
-
- (*-------------------------------------------------------*)
-
- PROCEDURE StringGadget (VAR SGad : Gadget;
- VAR SInfo : StringInfo;
- VAR Buffer,UBuffer : STRING);
- BEGIN
- SGad.specialInfo := ADR (SInfo);
- SGad.gadgetType := strGadget;
- WITH SInfo DO
- buffer := ADR (Buffer);
- undoBuffer := ADR (UBuffer);
- bufferPos := 0; maxChars := SIZE (Buffer);
- dispPos := 0; altKeyMap := NIL
- END
- END StringGadget;
-
-
- PROCEDURE RequestString (SPtr : ScreenPtr;
- Anzahl : INTEGER;
- Texte : STRINGS;
- VAR Ergebnisse : Daten);
-
- VAR SGad : ARRAY [0..MaxGadget] OF Gadget;
- SInfos : ARRAY [0..MaxGadget] OF StringInfo;
- SInfo : StringInfoPtr;
- UBuffers : STRINGS;
- ITexte : ARRAY [0..MaxGadget] OF IntuiText;
- GPtr1,GPtr2 : GadgetPtr;
- WPtr : WindowPtr;
- WindowY,WindowX,
- Zeichen,Size,X : INTEGER;
- AFlags : ActivationFlagSet;
- Message : IntuiMessage;
- Ok : BOOLEAN;
- GadBorder : Border;
- Ecken : ARRAY [0..4] OF Point;
-
- BEGIN
- IF Anzahl < 19 THEN
- DEC (Anzahl);
- Size := CAST (INTEGER,SPtr^.font^.ySize);
- Zeichen := Max8Zeichen;
- X := 8;
- IF Size = 9 THEN
- X := 10;
- Zeichen := Max9Zeichen
- END;
- Ecken[0].x := 0; Ecken[0].y := Size + 1;
- Ecken[1].x := 200; Ecken[1].y := Size + 1;
- Ecken[2].x := 200; Ecken[2].y := (Size + 1) * 2;
- Ecken[3].x := 0; Ecken[3].y := (Size + 1) * 2;
- Ecken[4].x := 0; Ecken[4].y := Size + 1;
- WITH GadBorder DO (* Daten für den Gadgetborder *)
- leftEdge := -10;
- topEdge := -Size-2;
- frontPen := 1;
- backPen := 3;
- drawMode := jam2;
- count := 5;
- xy := ADR (Ecken);
- nextBorder := NIL
- END;
- WindowX := 0;
- FOR WindowY := 0 TO Anzahl DO (* X-Ausdehnung des *)
- (* Windows bestimmen *)
- IF Length(Texte[WindowY + 1]) * X > 376 THEN
- Texte[WindowY + 1,Zeichen] := CHR (0)
- END;
- IF (Length(Texte[WindowY + 1]) * Size) > WindowX THEN
- WindowX := Length(Texte[WindowY + 1]) * X;
- IF WindowX > 376 THEN
- WindowX := 376
- END
- END
- END;
- AFlags := ActivationFlagSet {relVerify};
- IF NOT (Ergebnisse.TextOrZahl) THEN
- INCL (AFlags,longint) (* Zahlen müssen eingegeben *)
- (* werden *)
- END;
- FOR WindowY := 0 TO Anzahl DO (* Gadgets erzeugen *)
- MakeIText (ITexte[WindowY],ADR(Texte[WindowY+1]),
- - WindowX - 20,0);
- Ergebnisse.Texte[WindowY] := "";
- UBuffers[WindowY] := "";
- GADGET (SGad[WindowY],WindowX+35,20 + WindowY *
- (Size + 3),190,Size,
- GadgetFlagSet{},AFlags,ADR(GadBorder),
- NIL,ADR(ITexte[WindowY]),WindowY + 1 );
- StringGadget (SGad[WindowY],SInfos[WindowY],
- Ergebnisse.Texte[WindowY],
- UBuffers[WindowY]);
- END;
- IF Anzahl > 0 THEN (* Pointerkette aufbauen *)
- FOR WindowY := 0 TO Anzahl-1 DO
- SGad[WindowY].nextGadget := ADR(SGad[WindowY+1])
- END
- END;
- WindowY := 40 + Anzahl * (Size + 3);
- WPtr := WINDOW (SPtr,WindowX + 250,WindowY,-1,-1,1,2,
- ADR(Texte[0]),ADR(SGad[0]),
- WindowFlagSet{noCareRefresh,activate,windowDrag},
- IDCMPFlagSet{gadgetUp,activeWindow,mouseButtons});
- GPtr1 := ADR(SGad[0]);
- INC (Anzahl); WindowY := 0;
- REPEAT
- Ok := ActivateGadget (GPtr1,WPtr,NIL);
- Delay (5);
- WaitEvent (WPtr,Message);
- GPtr2 := Message.iAddress;
- SInfo := GPtr2^.specialInfo;
- IF NOT (Ergebnisse.TextOrZahl) THEN
- Ergebnisse.Zahlen[GPtr2^.gadgetID] := SInfo^.longInt
- ELSE
- Ergebnisse.Zahlen[GPtr2^.gadgetID] := 0
- END;
- IF (GPtr1 # NIL) AND (Message.class =
- IDCMPFlagSet{gadgetUp}) THEN
- INC (WindowY);
- GPtr1 := GPtr1^.nextGadget
- END
- UNTIL (GPtr2^.gadgetID = Anzahl) AND
- (WindowY = Anzahl) AND
- (Message.class = IDCMPFlagSet{gadgetUp});
- CloseWindow (WPtr)
- END
- END RequestString;
-
- (*-------------------------------------------------------*)
-
- END ReqString.