home *** CD-ROM | disk | FTP | other *** search
- (* ----------------------------------------------------- *)
- (* DATAWIN.PAS *)
- (* *)
- (* ■ DataWindow: Verbindet Fenster mit Puffer; zum kon- *)
- (* fortablen Arbeiten stehen Scrollbalken und Spalten- *)
- (* und Zeilenanzeige zur Verfügung. So viele Methoden, *)
- (* da viele nach "Buffer" weitergeleitet werden; für *)
- (* die, die hier keine Weiterleitung haben, ist *)
- (* GetBufPtr gedacht: Es liefert den Zeiger auf das Buf*)
- (* ferobjekt, so das mit einem Aufruf wie *)
- (* DataWindow^.GetBufPtr^.SetSaveExtern (FALSE); *)
- (* gearbeitet werden kann. *)
- (* *)
- (* (c) 1991 by R.Reichert & toolbox *)
- (* ----------------------------------------------------- *)
- UNIT DataWin;
-
- INTERFACE
-
- USES Dos, Stuff, VSObj, WinVSM,
- MouKey, UBuffer, DiskBuf,
- SB, FrameWin, ActStWi;
-
- CONST
- On = TRUE;
- Off = FALSE; { Fehlermeldungen: }
- DWFileDoesntExist = 30; { File existiert nicht (Load) }
- DWCouldntLoad = 31; { Fehler beim Laden aufgetreten }
- DWCantCreateFile = 32; { F kann nicht angelegt werden }
- DWCouldntSave = 33; { Fehler beim Speichern }
- DWCantSaveBuf = 34; { Fehler in SaveBuffer }
-
- TYPE
- DataWindowPtr = ^DataWindow;
- DataWindow = OBJECT (ActiveStandWin)
-
- Buf : BufferPtr; { Buffer-Objekt }
- SBVertic, { ScrollBalken }
- SBHoriz : ScrollBarPtr;
- BufX1, BufY1, { Koordinaten des sicht- }
- BufX2, BufY2 : WORD; { baren Bufferauschnittes }
- LS, RS, { Ränder im Fenster }
- TS, BS,
- OldCurX, { alte Cursorposition }
- OldCurY : BYTE;
- SBH, SBV, { Scrollbalken gewünscht ?}
- CurPosShow, { Zeilen/Spaltenanzeige ? }
- Loading, { beim Laden ? }
- MoveCur, { Cursor analog bewegen ? }
- CurVisible : BOOLEAN; { Cursor sichtbar ? }
- ErrorCode : INTEGER; { Fehler beim Laden/Speichern }
-
- {---- neu implementierte Methoden von Vorgängern: ----}
- CONSTRUCTOR Init (MaxColumns,MaxLines,FreeHeap: WORD;
- NewVSM : WExtVSMPtr);
- CONSTRUCTOR Copy (Win : DataWindow);
- PROCEDURE Open; VIRTUAL;
- PROCEDURE SetMinLength (MXL, MYL : BYTE); VIRTUAL;
- PROCEDURE SetTitles
- (TopLine, BottomLine : STRING); VIRTUAL;
- PROCEDURE Close; VIRTUAL;
-
- {--------------- neue, eigene Methoden: --------------}
- PROCEDURE DoLineFeed; VIRTUAL;
- PROCEDURE GotoXY (x, y : WORD); VIRTUAL;
- PROCEDURE ScrollBuf (x, y : INTEGER); VIRTUAL;
- PROCEDURE SetMoveCur (MC : BOOLEAN); VIRTUAL;
- PROCEDURE SetSBVertic (SB : BOOLEAN); VIRTUAL;
- PROCEDURE SetSBHoriz (SB : BOOLEAN); VIRTUAL;
- PROCEDURE SetShowCurPos (CP : BOOLEAN); VIRTUAL;
- PROCEDURE SetSpaces (NLS,NRS,NTS,NBS:BYTE); VIRTUAL;
- {----------- für interne Zwecke gedacht: -------------}
- PROCEDURE SaveBuffer; VIRTUAL;
- PROCEDURE ShowBars; VIRTUAL;
- PROCEDURE ShowBuffer; VIRTUAL;
- PROCEDURE ShowBufPart (sy1, sy2 : WORD); VIRTUAL;
- FUNCTION GetLoadY1 : WORD; { INTERN } VIRTUAL;
- FUNCTION GetLoadY2 : WORD; { INTERN } VIRTUAL;
- FUNCTION InWindow (x, y : WORD) : BOOLEAN; VIRTUAL;
- FUNCTION WinBufXLength : WORD; VIRTUAL;
- FUNCTION WinBufYLength : WORD; VIRTUAL;
- {------- zum Abfragen der Variablen von aussen: ------}
- FUNCTION GetBufX1 : WORD; VIRTUAL;
- FUNCTION GetBufX2 : WORD; VIRTUAL;
- FUNCTION GetBufY1 : WORD; VIRTUAL;
- FUNCTION GetBufY2 : WORD; VIRTUAL;
- FUNCTION HorizScrollBar : BOOLEAN; VIRTUAL;
- FUNCTION VerticScrollBar: BOOLEAN; VIRTUAL;
- FUNCTION ShowCurPos : BOOLEAN; VIRTUAL;
- FUNCTION GetLeftSpace : BYTE; VIRTUAL;
- FUNCTION GetRightSpace : BYTE; VIRTUAL;
- FUNCTION GetTopSpace : BYTE; VIRTUAL;
- FUNCTION GetBottomSpace: BYTE; VIRTUAL;
- FUNCTION CursorVisible : BOOLEAN; VIRTUAL;
- FUNCTION GetErrorCode : INTEGER; VIRTUAL;
- FUNCTION GetMoveCur : BOOLEAN; VIRTUAL;
-
- {--------- Methoden für die Bufferbearbeitung: -------}
- PROCEDURE LoadASCII (Name : STRING;
- CutTooLong : BOOLEAN); VIRTUAL;
- PROCEDURE SaveASCII (Name : STRING); VIRTUAL;
- PROCEDURE WriteStrXY (x, y : WORD;
- str : STRING); VIRTUAL;
- PROCEDURE WriteStr (Str : STRING); VIRTUAL;
- PROCEDURE InsLines (y, No : WORD); VIRTUAL;
- PROCEDURE CopyLine (Source, Dest : WORD); VIRTUAL;
- PROCEDURE DelLines (y, No : WORD); VIRTUAL;
- PROCEDURE ChangeColor
- (cx1, cy1, cx2, cy2 : WORD;
- NewCol, NewBack : BYTE); VIRTUAL;
- PROCEDURE SetBufAttr (Attr : BYTE); VIRTUAL;
- PROCEDURE SetMaxLines (NewML : INTEGER); VIRTUAL;
- PROCEDURE SetColumns (Cols : WORD); VIRTUAL;
-
- FUNCTION ConvertLine (y : WORD) : STRING; VIRTUAL;
- FUNCTION LineLength (y : WORD) : WORD; VIRTUAL;
- FUNCTION GetCurX : WORD; VIRTUAL;
- FUNCTION GetCurY : WORD; VIRTUAL;
- FUNCTION GetLines : WORD; VIRTUAL;
- FUNCTION GetColumns : WORD; VIRTUAL;
- FUNCTION GetMaxLines : WORD; VIRTUAL;
- FUNCTION GetMaxColumns : WORD; VIRTUAL;
- FUNCTION GetBufAttr : BYTE; VIRTUAL;
- FUNCTION GetBufPtr : DiskBufferPtr; VIRTUAL;
- DESTRUCTOR Done; VIRTUAL;
- END;
-
- IMPLEMENTATION
-
- (* ----------------------------------------------------- *)
- (* Initialisiert Objekt, dafür braucht es Speicher für *)
- (* ScrollBalken und BufferObj. Im Fehlerfalle wird Fail *)
- (* aufgerufen. MaxColumns und MaxLines sind für das Buf- *)
- (* ferObjekt verbindlich, dh diese Werte gelten bei der *)
- (* weiteren Arbeit mit DataWindow (MaxLines im Zweifels- *)
- (* fall lieber sehr gross, MaxColumns nicht allzu gross *)
- (* wählen). FreeHeap gibt den Speicher an, der freige- *)
- (* lassen werden soll. *)
- (* ----------------------------------------------------- *)
- CONSTRUCTOR DataWindow.Init
- (MaxColumns, MaxLines, FreeHeap : WORD;
- NewVSM : WExtVSMPtr);
- BEGIN
- IF ActiveStandWin.Init (NewVSM) THEN BEGIN
- CurVisible := TRUE; SBH := TRUE; SBV := TRUE;
- CurPosShow := TRUE;
- LS := 0; RS := 0; TS := 0; BS := 0;
- IF MaxColumns<VSM^.GetXLength THEN
- MaxColumns := VSM^.GetXLength-2;
- IF MaxLines<VSM^.GetYLength THEN
- MaxLines := VSM^.GetYLength;
- Buf := New (DiskBufferPtr,
- Init (MaxColumns, MaxLines,
- VSM^.GetYLength, FreeHeap));
- SBVertic := New (VertScrollBarPtr, Init (VSM));
- SBHoriz := New (HorizScrollBarPtr, Init (VSM));
- IF (SBVertic<>NIL) AND
- (SBHoriz<>NIL) AND
- (Buf<>NIL) THEN BEGIN
- SetMoveCur (TRUE);
- SetSaveWinContent (FALSE);
- BufX1 := 1; BufX2 := WinBufXLength;
- BufY1 := 1; BufY2 := WinBufYLength;
- ErrorCode := 0; Loading := FALSE;
- END ELSE
- Fail;
- END ELSE
- Fail;
- END;
-
- CONSTRUCTOR DataWindow.Copy (Win : DataWindow);
- BEGIN
- IF (Win.VSM<>NIL) AND
- (Win.SBVertic<>NIL) AND
- (Win.SBHoriz<>NIL) AND
- (Win.Buf<>NIL) THEN
- Self := Win
- ELSE
- Fail
- END;
-
- (* ----------------------------------------------------- *)
- (* Öffnet das Fenster, zeigt den Buffer sowie die Posi- *)
- (* tion des Buffercursors auf dem Scrollbalken an, falls *)
- (* Active TRUE ist. *)
- (* ----------------------------------------------------- *)
- PROCEDURE DataWindow.Open;
- VAR MouVis : BOOLEAN;
- BEGIN
- IF NOT Opened THEN BEGIN
- ActiveStandWin.Open;
- IF Opened THEN BEGIN
- BufX2 := Pred (BufX1 + WinBufXLength);
- BufY2 := Pred (BufY1 + WinBufYLength);
- IF BufX2>Buf^.GetColumns THEN BEGIN
- BufX2 := Buf^.GetColumns;
- BufX1 := Succ (BufX2 - WinBufXLength);
- END;
- IF BufY2>Buf^.GetLines THEN BEGIN
- BufY2 := Buf^.GetLines;
- BufY1 := Succ (BufY2 - WinBufYLength);
- END;
- WITH VSM^ DO BEGIN { Ränder mit Leerzeichen füllen:}
- MouVis := Mouse^.GetVisible;
- Mouse^.Hide;
- IF LS>0 THEN FillPart (Succ (x1), Succ (y1),
- x1+LS, Pred (y2), 7, ' ');
- IF RS>0 THEN FillPart (x2-RS, Succ (y1),
- Pred (x2), Pred (y2),
- 7, ' ');
- IF TS>0 THEN FillPart (Succ (x1), Succ (y1),
- Pred (x2), y1+TS, 7, ' ');
- IF BS>0 THEN FillPart (Succ (x1), Pred (y2),
- Pred (x2), y2-BS,
- 7, ' ');
- IF MouVis THEN
- Mouse^.Show;
- END;
- OldCurX := VSM^.WhereX;
- OldCurY := VSM^.WhereY;
- DiskBufferPtr (Buf)^.LoadPart (GetLoadY1, GetLoadY2);
- ShowBuffer;
- IF Active AND NOT Changing THEN BEGIN
- SBVertic^.SetXY (x2, Succ (y1), x2, Pred (y2));
- SBVertic^.SetMaxPos (Buf^.GetLines, Buf^.GetY);
- IF SBV THEN SBVertic^.Show;
- IF CurPosShow THEN
- SBHoriz^.SetXY (x1+15, y2, x2-2, y2)
- ELSE
- SBHoriz^.SetXY (x1+2, y2, x2-2, y2);
- SBHoriz^.SetMaxPos (Buf^.GetColumns, Buf^.GetX);
- IF SBH THEN SBHoriz^.Show;
- ShowBars;
- IF InWindow (Buf^.GetX, Buf^.GetY) THEN BEGIN
- GotoXY (Buf^.GetX, Buf^.GetY);
- END ELSE
- HideCursor;
- END;
- END;
- END;
- END;
-
- PROCEDURE DataWindow.SetMinLength (MXL, MYL : BYTE);
- BEGIN
- IF MXL<25 THEN MXL := 25; { wegen Scrollbalken und }
- IF MYL<4 THEN MYL := 4; { Curpos-Anzeige }
- ActiveStandWin.SetMinLength (MXL, MYL);
- END;
-
- PROCEDURE DataWindow.SetTitles
- (TopLine, BottomLine : STRING);
- BEGIN
- ActiveStandWin.SetTitles (TopLine, '');
- { Fusszeile darf wegen des Scrollbalken keine
- mehr existieren }
- END;
-
- PROCEDURE DataWindow.Close;
- BEGIN
- ActiveStandWin.Close;
- IF ReturnCode=0 THEN BEGIN
- VSM^.GotoXY (OldCurX, OldCurY);
- IF NOT Changing THEN
- ShowCursor;
- END;
- END;
-
- (* ----------------------------------------------------- *)
- (* Macht einen Zeilenvorschub, entspricht "Writeln;" von *)
- (* Turbo Pascal oder einem "WriteStr ('');" von DataWin- *)
- (* dow. *)
- (* ----------------------------------------------------- *)
- PROCEDURE DataWindow.DoLineFeed;
- VAR LF : BOOLEAN;
- BEGIN
- LF := Buf^.GetLineFeed;
- Buf^.SetLineFeed (FALSE);
- WriteStr ('');
- Buf^.SetLineFeed (LF);
- END;
-
- (* ----------------------------------------------------- *)
- (* Setzt den Buffercursor an x/y. Wenn nötig, wird ge- *)
- (* scrollt (siehe unten). *)
- (* ----------------------------------------------------- *)
- PROCEDURE DataWindow.GotoXY (x, y : WORD);
- VAR ScrX, ScrY : INTEGER;
- BEGIN
- IF Opened AND Active THEN BEGIN
- {--------------- eventuell x/y korrigieren -----------}
- IF (x > Buf^.GetColumns) AND
- (y<Buf^.GetLines) THEN BEGIN
- x := 1; Inc (y);
- END;
- IF (x<1) AND (y>1) THEN BEGIN
- x := Buf^.GetColumns; Dec (y);
- END;
- {------------------ ausserhalb Fensters ? ------------}
- IF NOT InWindow (x, y) THEN BEGIN
- ScrX := 0; ScrY := 0;
- IF x > BufX2 THEN ScrX := x - BufX2;
- IF x < BufX1 THEN ScrX := INTEGER (x - BufX1);
- IF y > BufY2 THEN ScrY := y - BufY2;
- IF y < BufY1 THEN ScrY := INTEGER (y - BufY1);
- IF GetMoveCur THEN BEGIN { analoge Bewegung ? }
- Buf^.SetBufCursor (x, y);
- ScrollBuf (ScrX, ScrY); { ja, scrollen }
- { ScrollBuf ruft seinerseits GotoXY auf, aber
- dieser Teil wird nicht mehr durchlaufen,
- sondern der untere, da dann der Cursor inner-
- halb des Ausschnittes ist. Daher wird hier der
- Cursor nicht gesetzt. }
- END ELSE
- HideCursor; { nein, Cursor "verstecken" }
- END ELSE BEGIN
- {---------------- Cursor innerhalb Fenster -----------}
- ShowCursor;
- Buf^.SetBufCursor (x, y);
- VSM^.GotoXY (Succ ( BYTE(x1+LS+x-BufX1)),
- Succ ( BYTE(y1+TS+y-BufY1)));
- END;
- ShowBars;
- END;
- END;
-
- (* ----------------------------------------------------- *)
- (* Scrollt den sichtbaren Bufferausschnitt um x/y und *)
- (* setzt den Cursor neu. *)
- (* ----------------------------------------------------- *)
- PROCEDURE DataWindow.ScrollBuf (x, y : INTEGER);
- BEGIN
- IF Opened AND Active THEN BEGIN
- IF BufX1+x < 1 THEN x := -Pred (BufX1);
- IF BufX2+x > Buf^.GetColumns THEN
- x := Buf^.GetColumns-BufX2;
- IF BufY1+y < 1 THEN y := -Pred (BufY1);
- IF BufY2+y > Buf^.GetLines THEN
- y := Buf^.GetLines-BufY2;
- IF (x=0) AND (y=0) THEN
- x := 0;
- IF (x<>0) OR (y<>0) THEN BEGIN
- Inc (BufX1, x); Inc (BufX2, x);
- Inc (BufY1, y); Inc (BufY2, y);
- IF DiskBufferPtr (Buf)^.GetAllSaved THEN
- DiskBufferPtr (Buf)^.LoadPart (GetLoadY1,
- GetLoadY2);
- ShowBuffer;
- GotoXY (Buf^.GetX, Buf^.GetY);
- END;
- END;
- END;
-
- PROCEDURE DataWindow.SetMoveCur (MC : BOOLEAN);
- BEGIN
- MoveCur := MC;
- Buf^.SetMoveCursor (MoveCur);
- END;
-
- PROCEDURE DataWindow.SetSBVertic (SB : BOOLEAN);
- BEGIN
- IF NOT Opened THEN SBV := SB;
- END;
-
- PROCEDURE DataWindow.SetSBHoriz (SB : BOOLEAN);
- BEGIN
- IF NOT Opened THEN SBH := SB;
- END;
-
- PROCEDURE DataWindow.SetShowCurPos (CP : BOOLEAN);
- BEGIN
- IF NOT Opened THEN CurPosShow := CP;
- END;
-
- PROCEDURE DataWindow.SetSpaces (NLS,NRS,NTS,NBS:BYTE);
- BEGIN
- IF NOT Opened THEN BEGIN
- LS := NLS; RS := NRS; TS := NTS; BS := NBS;
- IF LS>5 THEN LS := 5;
- IF RS>5 THEN RS := 5;
- IF TS>2 THEN TS := 1;
- IF BS>1 THEN BS := 1;
- END;
- END;
-
- (* ----------------------------------------------------- *)
- (* Speichert den gesamten (!) Buffer auf Diskette und *)
- (* löscht ihn aus dem Speicher. *)
- (* ----------------------------------------------------- *)
- PROCEDURE DataWindow.SaveBuffer;
- BEGIN
- DiskBufferPtr (Buf)^.CleanMem;
- IF Buf^.GetErrorL1<>0 THEN
- SetReturnCode (DWCantSaveBuf);
- END;
-
- (* ----------------------------------------------------- *)
- (* Gibt die Cursorposition auf dem Scrollbalken sowie im *)
- (* unteren Fensterrand aus. *)
- (* ----------------------------------------------------- *)
- PROCEDURE DataWindow.ShowBars;
- VAR s1, s2 : STRING; MouVis : BOOLEAN;
- BEGIN
- IF Opened AND Active THEN BEGIN
- IF NOT Loading THEN BEGIN
- IF ShowCurPos THEN BEGIN
- MouVis := Mouse^.GetVisible;
- Mouse^.Hide;
- VSM^.FillPart (x1+3, y2, x1+13, y2,
- FrCol, Frames [Frame, 5]);
- System.Str (Buf^.GetX, s1);
- System.Str (Buf^.GetY, s2);
- VSM^.WriteStr (x1+8-Length (s1), y2,
- FrCol, s1+':'+s2);
- IF MouVis THEN
- Mouse^.Show;
- END;
- IF SBV THEN
- SBVertic^.ChangePos (Buf^.GetLines, BufY1);
- IF SBH THEN
- SBHoriz^.ChangePos (Buf^.GetColumns, BufX1);
- END;
- END;
- END;
-
- PROCEDURE DataWindow.ShowBuffer;
- BEGIN
- ShowBufPart (BufY1, BufY2); { ganzen Puffer anzeigen }
- END;
-
- (* ----------------------------------------------------- *)
- (* Pufferbereich sy1-sy2 anzeigen. Bedingungen: *)
- (* sy1>=BufY1, sy2<=BufY2, sy1<=sy2. *)
- (* ----------------------------------------------------- *)
- PROCEDURE DataWindow.ShowBufPart (sy1, sy2 : WORD);
- VAR i : WORD; MouVis : BOOLEAN;
- BEGIN
- IF Opened AND Active THEN BEGIN
- MouVis := Mouse^.GetVisible;
- Mouse^.Hide;
- FOR i := sy1 TO sy2 DO
- System.Move (Buf^.GetLinePtr (i)^[BufX1],
- VSM^.GetPartPtr (Succ (x1+LS),
- Succ (y1+TS)+i-BufY1)^,
- WinBufXLength*2);
- IF MouVis THEN
- Mouse^.Show;
- END;
- END;
-
- FUNCTION DataWindow.GetLoadY1 : WORD;
- VAR ly1 : WORD;
- BEGIN { für Berechnung, von wo bis wo Puffer geladen }
- Ly1 := BufY1-(VSM^.GetYLength-(BufY2-BufY1)) DIV 2;
- IF Ly1>BufY1 THEN Ly1 := BufY1;
- GetLoadY1 := Ly1; { werden soll }
- END;
-
- FUNCTION DataWindow.GetLoadY2 : WORD;
- VAR Ly2 : WORD;
- BEGIN
- Ly2 := BufY2+(VSM^.GetYLength-(BufY2-BufY1)) DIV 2;
- IF Ly2<BufY2 THEN Ly2 := BufY2;
- GetLoadY2 := Ly2;
- END;
-
- FUNCTION DataWindow.InWindow (x, y : WORD) : BOOLEAN;
- BEGIN
- IF (x>=BufX1) AND (x<=BufX2) AND
- (y>=BufY1) AND (y<=BufY2) THEN
- InWindow := TRUE { x und y im Fensterpufferausschnitt }
- ELSE
- InWindow := FALSE;
- END;
-
- FUNCTION DataWindow.WinBufXLength : WORD;
- BEGIN { Anzahl Pufferspalten im Fenster }
- WinBufXLength := Pred (x2-x1-RS-LS);
- END;
-
- FUNCTION DataWindow.WinBufYLength : WORD;
- BEGIN { Anzahl Pufferzeilen im Fenster }
- WinBufYLength := Pred (y2-y1-TS-BS);
- END;
-
- FUNCTION DataWindow.GetBufX1 : WORD;
- BEGIN
- GetBufX1 := BufX1;
- END;
-
- FUNCTION DataWindow.GetBufX2 : WORD;
- BEGIN
- GetBufX2 := BufX2;
- END;
-
- FUNCTION DataWindow.GetBufY1 : WORD;
- BEGIN
- GetBufY1 := BufY1;
- END;
-
- FUNCTION DataWindow.GetBufY2 : WORD;
- BEGIN
- GetBufY2 := BufY2;
- END;
-
- FUNCTION DataWindow.HorizScrollBar : BOOLEAN;
- BEGIN
- HorizScrollBar := SBH;
- END;
-
- FUNCTION DataWindow.VerticScrollBar : BOOLEAN;
- BEGIN
- VerticScrollBar := SBV;
- END;
-
- FUNCTION DataWindow.ShowCurPos : BOOLEAN;
- BEGIN
- ShowCurPos := CurPosShow;
- END;
-
- FUNCTION DataWindow.GetLeftSpace : BYTE;
- BEGIN
- GetLeftSpace := LS;
- END;
-
- FUNCTION DataWindow.GetRightSpace : BYTE;
- BEGIN
- GetRightSpace := RS;
- END;
-
- FUNCTION DataWindow.GetTopSpace : BYTE;
- BEGIN
- GetTopSpace := TS;
- END;
-
- FUNCTION DataWindow.GetBottomSpace : BYTE;
- BEGIN
- GetBottomSpace := BS;
- END;
-
- FUNCTION DataWindow.CursorVisible : BOOLEAN;
- BEGIN
- CursorVisible := CurVisible;
- END;
-
- FUNCTION DataWindow.GetErrorCode : INTEGER;
- BEGIN
- GetErrorCode := ErrorCode; ErrorCode := 0;
- END;
-
- FUNCTION DataWindow.GetMoveCur : BOOLEAN;
- BEGIN
- IF Buf^.GetMoveCursor <> MoveCur THEN
- MoveCur := Buf^.GetMoveCursor;
- GetMoveCur := MoveCur;
- END;
-
- (* ----------------------------------------------------- *)
- (* Laden einer ASCII-Datei. Tritt dabei ein Fehler auf, *)
- (* so wird der ReturnCode entsprechend gesetzt. Was für *)
- (* Fehler vorlag, kann mit GetErrorCode abgefragt werden.*)
- (* ----------------------------------------------------- *)
- PROCEDURE DataWindow.LoadASCII (Name : STRING;
- CutTooLong : BOOLEAN);
- CONST
- TempBuf : DiskBuffer = ();
- VAR
- t : TEXT;
- i : WORD;
- s : STRING;
- BEGIN
- {$I-}
- System.Assign (t, Name);
- System.Reset (t);
- {$I+}
- ErrorCode := System.IoResult;
- IF ErrorCode=0 THEN BEGIN
- GotoXY (1, 1);
- DelLines (Succ (VSM^.GetYLength),
- Buf^.GetLines-VSM^.GetYLength);
- FOR i := 1 TO VSM^.GetYLength DO
- Buf^.GetNewLine (Buf^.GetAttr, Buf^.GetLinePtr (i)^);
- TempBuf := DiskBufferPtr (Buf)^;
- i := 1; ErrorCode := 0;
- Buf^.SetKillWriting (FALSE);
- Buf^.SetKillRest (FALSE);
- Buf^.SetLineFeed (FALSE);
- SetMoveCur (FALSE);
- Loading := TRUE;
- WHILE (i<=Buf^.GetMaxLines) AND
- (ErrorCode=0) AND NOT System.EoF (t) DO BEGIN
- {$I-}
- System.ReadLn (t, s);
- {$I+}
- ErrorCode := System.IoResult;
- IF (Length (s)>Buf^.GetColumns) AND (CutTooLong) THEN
- s[0] := Chr (Buf^.GetColumns);
- WriteStrXY (1, i, s);
- Inc (i);
- IF (DiskBufferPtr (Buf)^.GetDosErr<>0) AND
- (ErrorCode=0) THEN
- ErrorCode := DiskBufferPtr (Buf)^.GetDosErr;
- END;
- Buf^.SetKillWriting (TempBuf.KillWrite);
- Buf^.SetKillRest (TempBuf.KillLineRest);
- Buf^.SetLineFeed (TempBuf.LineFeed);
- SetMoveCur (TempBuf.MoveBufCur);
- Loading := FALSE;
- ShowBuffer;
- {$I-}
- System.Close (t);
- {$I+}
- ErrorCode := System.IoResult;
- IF (ErrorCode<>0) THEN
- SetReturnCode (DWCouldntLoad);
- END ELSE
- SetReturnCode (DWFileDoesntExist);
- END;
-
- (* ----------------------------------------------------- *)
- (* Speichern des Bufferinhalts in eine ASCII-Datei. Sind *)
- (* die Bufferzeilen länger als 255 Zeichen, so gehen die *)
- (* nach dem 255. verloren. Falls Fehler, analog zu Load. *)
- (* ----------------------------------------------------- *)
- PROCEDURE DataWindow.SaveASCII (Name : STRING);
- VAR
- t : TEXT;
- i : WORD;
- s : STRING;
- BEGIN
- {$I-}
- System.Assign (t, Name);
- System.ReWrite (t);
- {$I+}
- ErrorCode := System.IoResult;
- IF ErrorCode=0 THEN BEGIN
- i := 1;
- WHILE (i<=Buf^.GetLines) AND (ErrorCode=0) DO BEGIN
- s := Buf^.Convert2Str (i);
- {$I-}
- System.WriteLn (t, s);
- {$I+}
- ErrorCode := System.IoResult; Inc (i);
- IF (DiskBufferPtr (Buf)^.GetDosErr<>0) AND
- (ErrorCode=0) THEN
- ErrorCode := DiskBufferPtr (Buf)^.GetDosErr;
- END;
- {$I-}
- System.Close (t);
- {$I+}
- ErrorCode := IoResult;
- IF ErrorCode<>0 THEN
- SetReturnCode (DWCouldntSave);
- END ELSE
- SetReturnCode (DWCantCreateFile);
- END;
-
- PROCEDURE DataWindow.WriteStrXY (x,y : WORD; str : STRING);
- BEGIN
- Buf^.WriteStrXY (x, y, Str);
- IF InWindow (BufX1, y) AND
- InWindow (BufX1, Buf^.GetY) AND
- NOT Loading THEN
- ShowBufPart (y, Buf^.GetY);
- IF NOT Loading THEN
- GotoXY (Buf^.GetX, Buf^.GetY);
- END;
-
- PROCEDURE DataWindow.WriteStr (Str : STRING);
- BEGIN
- WriteStrXY (Buf^.GetX, Buf^.GetY, Str);
- END;
-
- PROCEDURE DataWindow.InsLines (y, No : WORD);
- BEGIN
- Buf^.InsLines (y, No);
- IF InWindow (BufX1, y) THEN
- ShowBufPart (y, BufY2);
- END;
-
- PROCEDURE DataWindow.CopyLine (Source, Dest : WORD);
- BEGIN
- Buf^.CopyLine (Source, Dest);
- IF ((Dest>=BufY1) AND (Dest<=BufY2)) THEN
- ShowBufPart (Dest, Dest);
- END;
-
- PROCEDURE DataWindow.DelLines (y, No : WORD);
- BEGIN
- Buf^.DelLines (y, No);
- IF BufY2>Buf^.GetLines THEN BEGIN
- ScrollBuf (0, Buf^.GetLines-BufY2)
- END ELSE
- IF InWindow (BufX1, y) THEN
- ShowBufPart (y, BufY2);
- END;
-
- PROCEDURE DataWindow.ChangeColor (cx1, cy1, cx2, cy2: WORD;
- NewCol, NewBack : BYTE);
- BEGIN
- Buf^.ChangeColor (cx1, cy1, cx2, cy2,
- NewCol, NewBack);
- IF InWindow (BufX1, cy1) AND
- InWindow (BufX1, cy2) THEN
- ShowBufPart (cy1, cy2)
- ELSE
- IF InWindow (BufX1, cy1) THEN
- ShowBufPart (cy1, BufY2)
- ELSE
- IF InWindow (BufX1, cy2) THEN
- ShowBufPart (BufY1, cy2);
- END;
-
- PROCEDURE DataWindow.SetBufAttr (Attr : BYTE);
- BEGIN
- Buf^.SetAttr (Attr);
- END;
-
- PROCEDURE DataWindow.SetMaxLines (NewML : INTEGER);
- BEGIN
- Buf^.SetMaxLines (NewML);
- END;
-
- (* ----------------------------------------------------- *)
- (* Setzt die aktuelle Zeilenlänge. ACHTUNG: Dabei können *)
- (* auch schon vorhandene Zeilen "gekürzt" werden ! *)
- (* ----------------------------------------------------- *)
- PROCEDURE DataWindow.SetColumns (Cols : WORD);
- BEGIN
- Buf^.SetColumns (Cols);
- END;
-
- FUNCTION DataWindow.ConvertLine (y : WORD) : STRING;
- BEGIN
- ConvertLine := Buf^.Convert2Str (y);
- END;
-
- FUNCTION DataWindow.LineLength (y : WORD) : WORD;
- BEGIN
- LineLength := Buf^.GetLineLength (y);
- END;
-
- FUNCTION DataWindow.GetCurX : WORD;
- BEGIN
- GetCurX := Buf^.GetX;
- END;
-
- FUNCTION DataWindow.GetCurY : WORD;
- BEGIN
- GetCurY := Buf^.GetY;
- END;
-
- FUNCTION DataWindow.GetLines : WORD;
- BEGIN
- GetLines := Buf^.GetLines;
- END;
-
- FUNCTION DataWindow.GetColumns : WORD;
- BEGIN
- GetColumns:= Buf^.GetColumns;
- END;
-
- FUNCTION DataWindow.GetMaxLines : WORD;
- BEGIN
- GetMaxLines := Buf^.GetMaxLines;
- END;
-
- FUNCTION DataWindow.GetMaxColumns : WORD;
- BEGIN
- GetMaxColumns := Buf^.GetMaxColumns;
- END;
-
- FUNCTION DataWindow.GetBufAttr : BYTE;
- BEGIN
- GetBufAttr := Buf^.GetAttr;
- END;
-
- FUNCTION DataWindow.GetBufPtr : DiskBufferPtr;
- BEGIN
- GetBufPtr := DiskBufferPtr (Buf);
- END;
-
- DESTRUCTOR DataWindow.Done;
- BEGIN
- ActiveStandWin.Done;
- Dispose (SBHoriz, Done);
- Dispose (SBVertic, Done);
- Dispose (Buf, Done);
- END;
-
- END.
- (* ----------------------------------------------------- *)
- (* Ende von DATAWIN.PAS *)
- (* ----------------------------------------------------- *)