home *** CD-ROM | disk | FTP | other *** search
- '*-------------------------------------------------------*
- '* DIRWIN.BAS *
- '*-------------------------------------------------------*
- '* Version: 1.12/PB *
- '* Sprache: Basic *
- '* Compiler: PowerBASIC V. 2.0 *
- '* Autor: J. Braun *
- '* Copyright: TOOLBOX im DMV-Verlag *
- '* letzte Änderungen: 22.8.90 *
- '*-------------------------------------------------------*
- '* Stellt ein Bildschirmfenster zur Verfügung, in dem *
- '* die Einträge des angewählten Verzeichnisses mit einem *
- '* Auswahlbalken angewählt und mit <RETURN> übernommen *
- '* werden können. Verzeichnis- und Laufwerkswechsel sind *
- '* möglich. Die Zahl der Platten/Diskettenlaufwerke wird *
- '* überprüft. Die Unit arbeitet äquivalent zur Turbo *
- '* Pascal Unit DIRWIN(.PAS) ohne die Implementation der *
- '* Huckepack-Routinen (kein Zugriff auf 'Paramstr(0)'!) *
- '* *
- '* FindFirst(), FindNext() und GetCurrDrive$ (c) 1989 *
- '* W. Rinke & TOOLBOX (TOOLBOX 10/89 und 11/89). Konver- *
- '* tiert von Quick Basic nach PowerBASIC von J. Braun. *
- '* *
- '* NICHT GEEIGNET FÜR TURBO BASIC (STRSEG/STRPTR-FUNKT.) *
- '*-------------------------------------------------------*
-
- $COMPILE UNIT
- $ERROR ALL -
- $STACK 32766
- $CPU 8086
- $DEBUG MAP -
- $EVENT -
- $LIB ALL -
- $FLOAT EMULATE
- $OPTION AUTODIM -
- $OPTION CNTLBREAK -
- $SOUND 0
- $COM 0
-
- DEFINT A-Z
-
- %Normal = 0
- %ReadOnly = 1
- %Hidden = 2
- %SysFile = 4
- %VolumeID = 8
- %Directory = 16
- %Archive = 32
- %AnyFile = 63
-
- %MaxDirs = 512
-
- %Flags = 0
- %AX = 1
- %BX = 2
- %CX = 3
- %DX = 4
- %SI = 5
- %DI = 6
- %BP = 7
- %DS = 8
- %ES = 9
-
- %MessFore = 14
- %MessBack = 0
- %WinFore = 7
- %WinBack = 0
- %BarFore = 0
- %BarBack = 7
- %shade = 177
-
- %MaxEntryLength = 12
-
- %TRUE = -1
- %FALSE = 0
-
- DIM DirArray$ [1 : %MaxDirs]
- DIM FrameArray$[1 : 10]
-
- SUB InitDirWin(cfg$) PUBLIC
- ' Initialisierung der Unit. Nur einmal im
- ' Hauptprogramm aufrufen.
- SHARED FrameArray$[], ArrayNum%, MessFore%, MessBack%
- SHARED WinFore%, WinBack%, BarFore%, BarBack%, shade%
- SHARED OrgAttribute%, BIOSCursor%, GetFMask$, ConfigFile$
- SHARED initialized%, DriveCount%, floppies%, OwnName$
- SHARED DriveStr1$, DriveStr2$, ESCBack$, NoDriveB$
- SHARED CFGFile$
- IF cfg$ <> "" THEN ConfigFile$ = cfg$
- IF NOT initialized% THEN
- MessFore% = %MessFore
- MessBack% = %MessBack
- WinFore% = %WinFore
- WinBack% = %WinBack
- BarFore% = %BarFore
- BarBack% = %BarBack
- shade% = %shade
- DEF SEG = &H40
- BIOSCursor% = PEEKI(&H60)
- DEF SEG
- GetFMask$ = ""
- initialized% = %TRUE
- x% = POS(x%)
- y% = CSRLIN
- OrgAttribute% = SCREEN(y%, x%, 1)
- FrameArray$[1] = "╔╗╚╝║═╡╞"
- FrameArray$[2] = "┌┐└┘│─┤├"
- FrameArray$[3] = "╒╕╘╛│═╡╞"
- FrameArray$[4] = "╓╖╙╜║─┤├"
- FrameArray$[5] = STRING$(8, 176)
- FrameArray$[6] = STRING$(8, 177)
- FrameArray$[7] = STRING$(8, 178)
- FrameArray$[8] = STRING$(8, 219)
- FrameArray$[9] = STRING$(8, 254)
- FrameArray$[10] = SPACE$(8)
- ArrayNum% = 1
- DriveCount% = GetDrives%
- floppies% = GetFloppy%
- DriveStr1$ = "≡≡ [ "
- DriveStr2$ = ": ] ≡≡"
- ESCBack$ = "<ESC>"
- NoDriveB$ = "≡≡ [ ≡≡ ] ≡≡"
- CALL GetDir(0, CFGFile$)
- IF RIGHT$(CFGFile$, 1) = "\" THEN
- CFGFile$ = CFGFile$ + Configfile$
- ELSE
- CFGFile$ = CFGFile$ + "\" + Configfile$
- END IF
- IF ConfigFile$ = "" THEN ConfigFile$ = "CONFIG.DAT"
- ON ERROR GOTO NoConfigFile
- x% = FREEFILE
- OPEN "I", x%, CFGFile$
- INPUT #x%, ArrayNum%, MessFore%, MessBack%, _
- WinFore%, WinBack%, BarFore%, _
- BarBack%, shade%, GetFMask$
- CLOSE x%
- ON ERROR GOTO 0
- IF ArrayNum% = 0 THEN ArrayNum% = 1
- IF MessFore% = 0 AND MessBack% = 0 THEN
- MessFore% = %MessFore
- MessBack% = %MessBack
- END IF
- IF WinFore% = 0 AND WinBack% = 0 THEN
- WinFore% = %WinFore
- WinBack% = %WinBack
- END IF
- IF BarFore% = 0 AND BarBack% = 0 THEN
- BarFore% = %BarFore
- BarBack% = %BarBack
- END IF
- IF shade% = 0 THEN shade% = %shade
- END IF
- EXIT SUB
- NoConfigFile:
- RESUME StdOption
- StdOption:
- ON ERROR GOTO 0
- END SUB
-
- SUB BarColor
- ' Setzen der Farbe des Auswahlbalkens
- SHARED BarFore%, BarBack%
- IF BarFore% <= 0 AND BarBack% <= 0 THEN
- BarFore% = %BarFore
- BackBack%= %BarBack
- END IF
- COLOR BarFore%, BarBack%
- END SUB
-
- SUB ChangeActDir
- ' Wechseln des aktuellen Verzeichnisses
- ' zum ausgewählten Verzeichnis
- SHARED PathString$
- LOCAL ChangeDir$, Filename$, FileExt$
- CALL FSplit(PathString$, ChangeDir$, Filename$, FileExt$)
- ChangeDir$ = LEFT$(ChangeDir$, LEN(ChangeDir$) - 1)
- IF LEN(ChangeDir$) = 2 THEN
- IF LEFT$(ChangeDir$, 1) >= "A" AND _
- LEFT$(ChangeDir$, 1) <= "Z" THEN
- IF MID$(ChangeDir$, 2, 1) = ":" THEN
- ChangeDir$ = ChangeDir$ + "\"
- END IF
- END IF
- END IF
- ON ERROR GOTO No.Change
- CHDIR ChangeDir$
- ON ERROR GOTO 0
- EXIT SUB
- No.Change:
- RESUME Changed.Dir
- Changed.Dir:
- ON ERROR GOTO 0
- END SUB
-
- FUNCTION Dec%(innum%, minnum%, maxnum%)
- ' Verkleinern einer Zahl bis zum anzugebenden
- ' Minimalwert und dann Sprung zum anzugebenen
- ' Maximalwert immer im Kreis herum.
- DECR innum%
- IF innum% < minnum% THEN innum% = maxnum%
- Dec% = innum%
- END FUNCTION
-
- FUNCTION Inc%(innum%, maxnum%, minnum%)
- ' Vergrößern einer Zahl bis zum anzugebenden
- ' anzugebenden Maximalwert und dann Sprung
- ' zum anzugebenden Minimalwert im Kreis herum
- INCR innum%
- IF innum% > maxnum% THEN innum% = minnum%
- Inc% = innum%
- END FUNCTION
-
- SUB MenuColorDisplay
- ' Unterprogramm für ChangeMenuColors
- SHARED FrameArray$[], ArrayNum%, MessFore%
- SHARED MessBack%, WinFore%, WinBack%, BarFore%
- SHARED BarBack%, shade%, OrgAttribute%
- SHARED OldWinBack%, OldWinFore%
- LOCAL CtrlX$
- CtrlX$ = CHR$(24)
- CALL MessageColor
- LOCATE 8, 9
- PRINT " Hilfsmeldungen [ F1/";
- PRINT CHR$(24); "F1: Vordergrund, F2/";
- PRINT CHR$(24); "F2 Hintergrund ] ";
- CALL WindowColor
- LOCATE 9, 9
- PRINT " Bildschirmfenster [ F3/";
- PRINT CtrlX$; "F3: Vordergrund, F4/";
- PRINT CtrlX$; "F4 Hintergrund ] ";
- CALL BarColor
- LOCATE 10, 9
- PRINT " Auswahlbalken [ F5/"; CtrlX$;
- PRINT "F5: Vordergrund, F6/";
- PRINT CtrlX$; "F6 Hintergrund ] ";
- COLOR OldWinFore%, OldWinBack%
- LOCATE 12, 12
- PRINT " Art des Fensterrahmens ";
- PRINT " [ Ändern mit F7/F8 ] : '";
- PRINT LEFT$(FrameArray$[ArrayNum%], 4); "'";
- LOCATE 13, 12
- PRINT " Aktuelles Schattenzeichen ";
- PRINT "[ Ändern mit F9/F10 ]: '";
- CALL TextAttr(OrgAttribute%)
- PRINT STRING$(4, shade%);
- COLOR OldWinFore%, OldWinBack%
- PRINT "'";
- LOCATE 16, 6
- PRINT " Ändern Sie die aktuellen Werte mit";
- PRINT " den angezeigten Funktionstasten.";
- LOCATE 17, 6
- PRINT " Übernahme ohne Speichern: <ESC>, ";
- PRINT " Übernahme mit Speichern: <";
- PRINT CHR$(17); "───┘>";
- END SUB
-
- SUB ChangeMenuColors(GetFileMask$)
- ' Änderung und evtl. Abspeichern der
- ' Fensterfarben und des Rahmens
- SHARED FrameArray$[], ArrayNum%, MessFore%
- SHARED MessBack%, WinFore%, WinBack%
- SHARED BarFore%, BarBack%, shade%
- SHARED OldWinFore%, OldWinBack%
- LOCAL chh$, ch$, count%
- CALL Save.Screen
- OldWinBack% = WinBack%
- OldWinFore% = WinFore%
- CALL Frame(1, 5, 80, 19, " Ändern der Anzeigen ")
- CALL MenuColorDisplay
- DO
- DO
- DO
- chh$ = ""
- ch$ = INKEY$
- IF (LEFT$(ch$, 1) = CHR$(0) AND LEN(ch$) = 2) THEN
- chh$ = RIGHT$(ch$, 1)
- ch$ = CHR$(0)
- END IF
- LOOP UNTIL ch$ <> ""
- IF ch$ = CHR$(24) THEN CALL Stopp
- LOOP UNTIL ch$ = CHR$(13) OR ch$ = CHR$(27) _
- OR (ch$ = CHR$(0) AND chh$ <> "")
- SELECT CASE ch$
- CASE CHR$(0)
- SELECT CASE chh$
- CASE "-" : CALL Stopp
- CASE ";"
- MessFore% = Inc%(Messfore%, 15, 0)
- CASE "T"
- MessFore% = Dec%(MessFore%, 0, 15)
- CASE "<"
- MessBack% = Inc%(MessBack%, 7, 0)
- CASE "U"
- MessBack% = Dec%(MessBack%, 0, 7)
- CASE "="
- WinFore% = Inc%(WinFore%, 15, 0)
- CASE "V"
- WinFore% = Dec%(WinFore%, 0, 15)
- CASE ">"
- WinBack% = Inc%(WinBack%, 7, 0)
- CASE "W"
- WinBack% = Dec%(WinBack%, 0, 7)
- CASE "?"
- BarFore% = Inc%(Barfore%, 15, 0)
- CASE "X"
- BarFore% = Dec%(BarFore%, 0, 15)
- CASE "@"
- BarBack% = Inc%(BarBack%, 15, 0)
- CASE "Y"
- BarBack% = Dec%(BarBack%, 0, 15)
- CASE "A"
- ArrayNum% = Inc%(ArrayNum%, 10, 1)
- CASE "B"
- ArrayNum% = Dec%(ArrayNum%, 1, 10)
- CASE "C"
- SELECT CASE shade%
- CASE 32: shade% = 176
- CASE 176, 177: INCR shade%
- CASE 178: shade% = 219
- CASE ELSE: shade% = 32
- END SELECT
- CASE "D"
- SELECT CASE shade%
- CASE 219: shade% = 178
- CASE 177, 178: DECR shade%
- CASE 176: shade% = 32
- CASE ELSE: shade% = 219
- END SELECT
- CASE ELSE: CALL ErrorBeep
- END SELECT
- CASE CHR$(27), CHR$(13)
- CASE ELSE: CALL ErrorBeep
- END SELECT
- CALL MenuColorDisplay
- LOOP UNTIL ch$ = CHR$(13) OR ch$ = CHR$(27)
- IF ch$ = CHR$(13) THEN
- CALL Frame(40, 19, 72, 22, "")
- CALL MessageColor
- LOCATE 20, 42
- PRINT " Werte werden gespeichert ";
- CALL SaveConfig(ArrayNum%, MessFore%, MessBack%, _
- WinFore%, WinBack%, BarFore%, _
- BarBack%, shade%, GetFileMask$)
- END IF
- CALL Restore.Screen
- END SUB
-
- SUB ChangeOrgDir
- ' Wechseln zum ursprüngl. Verzeichnis
- SHARED OrgDirectory$
- CHDIR OrgDirectory$
- END SUB
-
- FUNCTION LINSTR% (instring$, testString$)
- ' INSTR gibt das erste Auftreten des Suchstrings
- ' im Hauptstring zurück, LINSTR% das letzte Auf-
- ' treten im Hauptstring
- LOCAL i%, testvar%
- testvar% = 0
- FOR i% = 1 TO LEN(instring$) + 1 - LEN(testString$)
- IF MID$(instring$, i%, LEN(testString$)) = testString$ THEN
- testvar% = i%
- END IF
- NEXT i%
- LINSTR% = testvar%
- END FUNCTION
-
- SUB DirWindow
- ' Bildschirmfenster für Dateiauswahl aufbauen
- SHARED PathString$, FrameArray$[], ArrayNum%
- SHARED first%, dmax%, last%, DriveStr1$, DriveStr2$
- LOCAL count%, drive%, x%, p%, displaystr$
- DisplayStr$ = " " + PathString$ + " "
- LOCATE 9, 10
- CALL WindowColor
- PRINT LEFT$(FrameArray$[ArrayNum%], 1);
- x% = 40 - LEN(DisplayStr$) \ 2
- WHILE POS(p%) < x%
- PRINT MID$(FrameArray$[ArrayNum%], 6, 1);
- WEND
- CALL MessageColor
- PRINT DisplayStr$;
- CALL WindowColor
- WHILE POS(x%) < 70
- PRINT MID$(FrameArray$[ArrayNum%], 6, 1);
- WEND
- PRINT MID$(FrameArray$[ArrayNum%], 2, 1);
- LOCATE 19, 10
- PRINT MID$(FrameArray$[ArrayNum%], 3, 1);
- CALL Shadow
- LOCATE 19, 11
- PRINT MID$(FrameArray$[ArrayNum%], 7, 1);
- CALL MessageColor
- PRINT " Übernahme: "; CHR$(17);
- PRINT "──┘ Abbruch: <ESC> neue Suchmaske: <SPACE> ";
- CALL WindowColor
- PRINT RIGHT$(FrameArray$[ArrayNum%], 1);
- LOCATE 19, 70
- PRINT MID$(FrameArray$[ArrayNum%], 4, 1);
- CALL Shadow
- FOR count% = 10 TO 18
- LOCATE count%, 10
- PRINT MID$(FrameArray$[ArrayNum%], 5, 1);
- PRINT SPACE$(59);
- PRINT MID$(FrameArray$[ArrayNum%], 5, 1);
- CALL Shadow
- NEXT count%
- LOCATE 20, 11
- CALL MessageColor
- FOR count% = 0 TO 60
- CALL Shadow
- NEXT count%
- END SUB
-
- SUB DwHelp(zusatzinfo%)
- ' Hilfefenster für Dateiauswahl
- LOCAL ch$, count%
- CALL Save.Screen
- CALL Frame(1, 5, 80, 19, " Hilfe zur Dateiauswahl ")
- CALL WindowColor
- LOCATE 7, 3
- PRINT "Bewegen Sie das Zeigerfeld mit ";_
- " den Cursortasten und wählen Sie dann eine";
- LOCATE 8, 3
- PRINT "Datei mit der Eingabetaste <"; CHR$(17);
- PRINT "──┘> aus. Wird statt einer Datei ein Ver-";
- LOCATE 9, 3
- PRINT "zeichnis oder ein Laufwerk angewählt,";
- PRINT " wird in das Verzeichnis oder zum";
- LOCATE 10, 3
- PRINT "aktuellen Verzeichnis des Laufwerks ";
- PRINT "gewechselt. Soll die Suchmaske geändert";
- LOCATE 11, 3
- PRINT "werden, kann dies nach der Betätigung";
- PRINT " der Leertaste in einem gesonderten";
- LOCATE 12, 3
- PRINT "Bildschirmfenster erfolgen. Die Fenster";
- PRINT "farben kann man mit F2 ändern.";
- LOCATE 13, 3
- PRINT "Alle Benutzer-Aktionen können mit der ";
- PRINT "<ESC>-Taste abgebrochen werden.";
- IF zusatzinfo% THEN
- LOCATE 14, 3
- PRINT "Wenn F10 gedrückt wird, kann in einem ";
- PRINT "Fenster ein beliebiger Dateinamen von";
- LOCATE 15, 3: PRINT "Hand eingegeben werden.";
- END IF
- LOCATE 17, 30, 0
- PRINT "Ende mit beliebiger Taste";
- DO
- ch$ = INKEY$
- IF (LEN(ch$) = 2 AND RIGHT$(ch$, 1) = "-") _
- OR ch$ = CHR$(24) THEN
- CALL Stopp
- ch$ = ""
- END IF
- LOOP UNTIL ch$ <> ""
- CALL Restore.Screen
- END SUB
-
- SUB ErrorBeep
- ' Warnton bei falscher Eingabe ausgeben
- SOUND 880, 0.10
- END SUB
-
- SUB FillDirWindow
- ' Inhalt des Dateiauswahlfensters erstellen
- LOCAL x%, y%, cnt%
- SHARED dmax%, last%, DriveCount%, first%
- SHARED MarkedFile%, DirArray$[], att%
- SHARED DriveStr1$, DriveStr2$
- x% = 11: y% = 10
- IF att% THEN CALL DirWindow: att% = %FALSE
- last% = dmax%
- IF last% > 0 + DriveCount% THEN
- IF last% > 35 + first% THEN last% = first% + 35
- FOR cnt% = first% TO last%
- LOCATE y%, x%
- IF cnt% = MarkedFile% THEN CALL BarColor
- PRINT " "; DirArray$[cnt%];
- PRINT SPACE$(13 - LEN(DirArray$[cnt%]));
- CALL WindowColor
- INCR x%, 15
- IF x% > 60 THEN x% = 11: INCR y%
- NEXT cnt%
- ELSE
- IF last% > 35 + first% THEN last% = first% + 35
- FOR cnt% = first% TO last%
- LOCATE y%, x%
- IF cnt% = MarkedFile% THEN CALL BarColor
- PRINT " "; DirArray$[cnt%];
- PRINT SPACE$(13 - LEN(DirArray$[cnt%]));
- CALL WindowColor
- INCR x%, 15
- IF x% > 60 THEN x% = 11: INCR y%
- NEXT cnt%
- CALL MessageColor
- LOCATE 14, 29: PRINT SPC(24);
- LOCATE 15, 29: PRINT " keine Dateien gefunden ";
- LOCATE 16, 29: PRINT SPC(24);
- CALL WindowColor
- END IF
- END SUB
-
- FUNCTION FillUp$ (s$, i%)
- ' Hilfsfunktion für das Auslesen der 8-Bit-Register.
- ' Eine Binärzahl wird auf i% Stellen vorn mit "0"
- ' aufgefüllt
- IF (i% < 1) OR (LEN(s$) >= i%) THEN
- FillUp$ = s$
- EXIT FUNCTION
- END IF
- WHILE LEN(s$) < i%
- s$ = "0" + s$
- WEND
- FillUp$ = s$
- END FUNCTION
-
- SUB FindFirst(Pattern$, Attr%, DTA$)
- ' Einlesen der Dateien/Verzeichnisse
- SHARED DosError%
- Path$ = Pattern$ + CHR$(0)
- REG %AX, &H2F00
- CALL INTERRUPT &H21
- DTASeg% = REG(%ES)
- DTAOfs% = REG(%BX)
- DTA$ = SPACE$(43)
- REG %AX, &H1A00
- REG %DS, STRSEG(DTA$)
- REG %DX, STRPTR(DTA$)
- CALL INTERRUPT &H21
- REG %AX, &H4E00
- REG %CX, Attr%
- REG %DS, STRSEG(Path$)
- REG %DX, STRPTR(Path$)
- CALL INTERRUPT &H21
- IF (REG(%Flags) AND 1) = 1 THEN
- DosError% = REG(%AX)
- ELSE
- DosError% = 0
- END IF
- REG %AX, &H1A00
- REG %DS, DTASeg%
- REG %DX, DTAOfs%
- CALL INTERRUPT &H21
- END SUB
-
- SUB FindNext(DTA$)
- ' Weiter nach FindFirst
- SHARED DosError%
- LOCAL DTASeg%, DTAOfs%, PathName$
- IF LEN(DTA$) <> 43 THEN
- DosError% = 2
- ELSE
- DosError% = 0
- REG %AX, &H2F00
- CALL INTERRUPT &H21
- DTASeg% = REG(%ES)
- DTAOfs% = REG(%BX)
- REG %AX, &H1A00
- REG %DS, STRSEG(DTA$)
- REG %DX, STRPTR(DTA$)
- CALL INTERRUPT &H21
- REG %AX, &H4F00
- CALL INTERRUPT &H21
- IF (REG(%Flags) AND 1) = 1 THEN
- DosError% = REG(%AX)
- ELSE
- DosError% = 0
- END IF
- REG %AX, &H1A00
- REG %DS, DTASeg%
- REG %DX, DTAOfs%
- CALL INTERRUPT &H21
- END IF
- END SUB
-
- SUB Frame(x1%, y1%, x2%, y2%, Header$)
- ' Rahmen mit Überschrift zeichnen
- LOCAL x%, y%, Oldx%, Oldy%
- SHARED FrameArray$[], ArrayNum%
- CALL WindowColor
- LOCATE y1%, x1%
- PRINT LEFT$(FrameArray$[ArrayNum%], 1);
- PRINT STRING$(x2% - x1% - 2, _
- MID$(FrameArray$[ArrayNum%], 6, 1));
- PRINT MID$(FrameArray$[ArrayNum%], 2, 1);
- FOR y% = y1% + 1 TO y2% - 2
- LOCATE y%, x1%
- PRINT MID$(FrameArray$[ArrayNum%], 5, 1);
- PRINT SPC(x2% - 2 - x1%);
- PRINT MID$(FrameArray$[ArrayNum%], 5, 1);
- CALL Shadow
- NEXT y%
- LOCATE y2% - 1, x1%
- PRINT MID$(FrameArray$[ArrayNum%], 3, 1);
- PRINT STRING$( x2% - x1% - 2, _
- MID$(FrameArray$[ArrayNum%], 6,1));
- PRINT MID$(FrameArray$[ArrayNum%], 4, 1);
- CALL Shadow
- LOCATE y2%, x1% + 1
- FOR x% = 1 TO x2% - x1%
- CALL Shadow
- NEXT x%
- LOCATE y1%, (CINT((x2% + x1%) / 2) - _
- CINT(LEN(Header$) / 2))
- CALL MessageColor
- PRINT Header$;
- CALL WindowColor
- END SUB
-
- SUB FSplit(FilePathStr$, FilePath$, FileName$, FileExt$) PUBLIC
- ' Aus Pfad+Datei+Ext die Teile extrahieren
- LOCAL length%, length2%, count%
- FilePath$ = ""
- FileName$ = ""
- FileExt$ = ""
- length% = LINSTR%(FilePathStr$, "\")
- IF length% THEN
- FOR count% = 1 TO LEN(FilePathStr$)
- IF length% >= count% THEN
- FilePath$ = FilePath$ + MID$(FilePathStr$, count%, 1)
- END IF
- NEXT count%
- END IF
- length2% = INSTR(FilePathStr$, ".")
- IF length2% > length% THEN
- FileName$ = MID$(FilePathStr$, _
- length% + 1, length2% - length1%)
- END IF
- IF INSTR(FileName$, ".") THEN
- FileExt$ = MID$(FileName$, INSTR(FileName$, "."), _
- LEN(FileName$) - INSTR(FileName$, ".") + 1)
- FileName$ = MID$(FileName$, 1, _
- INSTR(FileName$, ".") - 1)
- END IF
- END SUB
-
- FUNCTION GetCurrDrive$ PUBLIC
- ' Fügt hinter GetDD$ :\ zu
- GetCurrDrive$ = GetDD$ + ":\"
- END FUNCTION
-
- FUNCTION GetDD$ PUBLIC
- ' Ermittelt den Buchstaben des aktuellen
- ' Laufwerkes
- REG %AX, &H1900
- CALL INTERRUPT &H21
- GetDD$ = CHR$((REG(%AX) AND &HFF) + 65)
- END FUNCTION
-
- SUB GetDirectory(GetFileMask$, SortDir%)
- ' Die Verzeichnisse und Dateien im aktuellen
- ' Verzeichnis ermitteln und für GetFile auf-
- ' arbeiten.
- LOCAL w%, i%, tstring1$, GFM$, drive%, ActFile%
- SHARED DosError%, PathString$, DriveCount%
- SHARED NextString$, DirArray$[], dmax%, last%
- SHARED first%, NoDriveB$, DriveStr1$, DriveStr2$
- SHARED drives%, floppies%
- GetFileMask$ = UCASE$(GetFileMask$)
- GFM$ = MID$(PathString$, 1, LEN(PathString$) - _
- LEN(GetFileMask$)) + "*.*"
- CALL FindFirst(GFM$, %Directory, DTA$)
- WHILE NOT (DosError% = 18) AND (ActFile% <= %MaxDirs)
- IF SRecord.Attr%(DTA$) = &H10 THEN
- IF SRecord.Name$(DTA$) <> "." THEN
- INCR ActFile%
- DirArray$[ActFile%] = SRecord.Name$(DTA$) + "\"
- END IF
- END IF
- CALL FindNext(DTA$)
- WEND
- CALL FindFirst(PathString$, &H20, DTA$)
- WHILE NOT (DosError% = 18) AND (ActFile% <= %MaxDirs)
- INCR ActFile%
- DirArray$[ActFile%] = SRecord.Name$(DTA$)
- CALL FindNext(DTA$)
- WEND
- IF DirArray$[1] = (GetCurrDrive$ + GetFileMask$) THEN
- DECR ActFile%
- END IF
- dmax% = ActFile% + DriveCount%
- FOR w% = DriveCount% TO 1 STEP -1
- IF (w% = DriveCount% - 1) AND (floppies% < 2) THEN
- DirArray$[dmax% - w% + 1] = NoDriveB$
- ELSE
- DirArray$[dmax% - w% + 1] = DriveStr1$ + _
- CHR$(65 - w% + DriveCount%) + DriveStr2$
- END IF
- NEXT w%
- IF SortDir% THEN
- IF dmax% > 1 THEN
- FOR i% = 1 TO dmax%
- IF INSTR(DirArray$[i%], "\") THEN
- DirArray$[i%] = CHR$(1) + DirArray$[i%]
- END IF
- NEXT i%
- ARRAY SORT DirArray$[] FOR dmax%, FROM 1 TO 11, _
- COLLATE UCASE, ASCEND
- FOR i% = 1 TO dmax%
- IF INSTR(DirArray$[i%], "\") THEN
- DirArray$[i%] = MID$(DirArray$[i%], 2)
- END IF
- NEXT i%
- END IF
- END IF
- END SUB
-
- FUNCTION GetDrives%
- ' ermittelt die Zahl der tatsächlich verfügbaren
- ' Laufwerke
- LOCAL drives%, count%, control%
- SHARED active%
- control% = &H0
- Reg %AX, &H1900
- CALL INTERRUPT &H21
- Active% = REG(%AX) AND &HFF
- REG %AX, &H0E00
- REG %DX, &H0000
- CALL INTERRUPT &H21
- drives% = REG(%AX) AND &HFF
- REG %AX, &H0E00 + drives%
- REG %DX, active%
- IF drives% > 2 THEN
- FOR count% = 3 TO drives%
- REG %AX, &H1C00
- REG %DX, count%
- CALL INTERRUPT &H21
- IF GetLow%(REG(%AX)) = &HFF THEN INCR control%
- NEXT count%
- END IF
- DECR drives%, control%
- REG %AX, &H0E00
- REG %DX, active%
- CALL INTERRUPT &H21
- GetDrives% = drives%
- END FUNCTION
-
- SUB GetDir(drive%, directory$) PUBLIC
- ' Namen des aktuellen Verzeichnisses
- ' für Laufwerk drive% ermitteln
- LOCAL DTA$, ende%
- SHARED DosError%
- DTA$ = SPACE$(63)
- REG %AX, &H4700
- REG %DX, drive%
- REG %DS, STRSEG(DTA$)
- REG %SI, STRPTR(DTA$)
- CALL INTERRUPT &H21
- DosError% = REG(%Flags)
- IF DosError% <> 0 THEN
- DosError% = REG(%AX) AND &HFF
- END IF
- directory$ = DTA$
- ende% = INSTR(directory$, CHR$(0))
- ON ERROR GOTO drivenotready
- directory$ = LEFT$(directory$, ende% - 1)
- IF drive% = 0 THEN
- directory$ = GetCurrDrive$ + directory$
- ELSE
- directory$ = CHR$(drive% + 64) + ":\" + directory$
- END IF
- ON ERROR GOTO 0
- EXIT SUB
- drivenotready:
- RESUME backto0
- backto0:
- CALL Save.Screen
- CALL Frame(40, 19, 70, 22, " ACHTUNG ")
- LOCATE 20, 42, 0
- CALL MessageColor
- PRINT " Laufwerk nicht bereit! ";
- DELAY 2
- CALL Restore.Screen
- drive% = 0
- ON ERROR GOTO 0
- CALL GetDir(drive%, directory$) ' REKURSIV !
- END SUB
-
- SUB SaveConfig(ArrayNum%, MessFore%, MessBack%, _
- WinFore%, WinBack%, BarFore%, _
- BarBack%, shade%, GetFileMask$)
- ' Abspeichern der Konfigurationsdaten in die
- ' Datei CFGFile$
- SHARED StartDirectory$, CFGFile$
- LOCAL x%
- ON ERROR GOTO NoConfigFilewrite
- x% = FREEFILE
- OPEN CFGFile$ FOR OUTPUT AS #x%
- WRITE #x%, ArrayNum%, MessFore%, MessBack%, _
- WinFore%, WinBack%, BarFore%, _
- BarBack%, shade%, GetFileMask$
- CLOSE x%
- ON ERROR GOTO 0
- EXIT SUB
- NoConfigFilewrite:
- RESUME StdOptionWriteNot
- StdOptionWriteNot:
- ON ERROR GOTO 0
- END SUB
-
- FUNCTION GetFloppy% PUBLIC
- ' Ermittelt die Zahl der vorhandenen Floppy-
- ' laufwerke (1 oder 2)
- LOCAL floppies%, drives%
- DEF SEG = &H40
- floppies% = PEEK(&H10)
- DEF SEG
- IF floppies% AND 1 = 0 THEN
- drives% = 0
- ELSE
- drives% = CINT(((floppies% AND &HC0) / &H40) + 1)
- IF drives% < 2 THEN drives% = 1
- END IF
- GetFloppy% = drives%
- END FUNCTION
-
- FUNCTION GetHigh% (invar%)
- ' Rückgabe des High-Bytes eines 16-Bit-Wertes
- GetHigh% = VAL("&B" + _
- LEFT$(FillUp$(BIN$(invar%), 16), 8))
- END FUNCTION
-
- FUNCTION GetLow% (invar%)
- ' Rückgabe des Low-Bytes eines 16-Bit-Wertes
- GetLow% = VAL("&B" + _
- RIGHT$(FillUp$(BIN$(invar%), 16), 8))
- END FUNCTION
-
- FUNCTION GetTextAttr%
- ' Ermittelt das Textattribut an der aktuellen
- ' Cursorposition
- GetTextAttr% = SCREEN(CSRLIN, POS(x%), 1)
- END FUNCTION
-
- FUNCTION ManualInput$
- ' Eingabe des Dateinamens in einem Bildschirm-
- ' fenster mithilfe der Funktion ReadString$()
- SHARED PathString$
- LOCAL length%, ExitChar%, XPos%, YPos%
- LOCAL pe%, i%, TestName$, MInput$
- LOCAL OldFilePath$, NewFilePath$
- LOCAL Extension$, FileName$, GetExt$
- LOCAL ok%, ch$, ccx$, ScreenARRAY$
- YPos% = CSRLIN
- XPos% = POS(x%)
- FileName$ = ""
- CALL FSplit(PathString$, OldFilePath$, _
- FileName$, GetExt$)
- IF INSTR(GetExt$, "?") OR INSTR(GetExt$, "*") THEN
- GetExt$ = "."
- END IF
- DO
- DO
- ok% = %TRUE
- CALL Frame(10, 14, 71, 17, " Manuelle Eingabe ")
- LOCATE 15, 12, 1
- MInput$ = ReadString$(OldFilePath$, 58, ExitChar%)
- LOCATE , , 0
- IF LEN(MInput$) > 0 THEN
- IF INSTR(MInput$, ".") = 0 THEN
- MInput$ = MInput$ + GetExt$
- END IF
- IF INSTR(MInput$, "\") = 0 THEN
- MInput$ = OldFilePath$ + MInput$
- END IF
- CALL FSplit(MInput$, NewFilePath$, _
- FileName$, SetExt$)
- END IF
- LOOP UNTIL LEN(FileName$) > 0 OR ExitChar% = 27
- IF ExitChar% = 27 THEN MInput$ = ""
- IF MInput$ = "" THEN
- ManualInput$ = ""
- EXIT FUNCTION
- END IF
- testname$ = MInput$
- CALL FSplit(testname$, testnamepath$, _
- testnamename$, testnameext$)
- IF INSTR(extension$, "*") = 0 AND _
- INSTR(extension$, "?") = 0 THEN
- testname$ = testname$ + extension$
- END IF
- pe% = FREEFILE
- ON ERROR GOTO File.Not.Found
- OPEN "I", pe%, testname$
- IF LOF(pe%) = 0 THEN ok% = %FALSE ' 0-Byte-Datei
- CLOSE pe%
- Resume.Address:
- LOOP UNTIL ok%
- ON ERROR GOTO 0
- ManualInput$ = testname$
- EXIT FUNCTION
- File.Not.Found:
- CALL Save.Screen
- CALL Frame(3, 3, 50, 6, " ACHTUNG ! ")
- LOCATE 4, 5, 1
- PRINT "Die Datei ist nicht vorhanden. OK? (J/N): ";
- DO
- DO
- ccx$ = UCASE$(INKEY$)
- LOOP UNTIL ccx$ <> ""
- IF ccx$ = CHR$(13) THEN
- ccx$ = "J"
- ELSEIF ccx$ = CHR$(27) THEN
- ccx$ = "N"
- END IF
- IF (LEN(ccx$) = 2 AND RIGHT$(ccx$, 1) = "-") _
- OR ccx$ = CHR$(24) THEN
- CALL Stopp
- LOCATE , , 1
- END IF
- LOOP UNTIL INSTR("JN", ccx$)
- CALL Restore.Screen
- IF ccx$ = "N" THEN ok% = %FALSE ELSE ok% = %TRUE
- RESUME Resume.Address
- END FUNCTION
-
- SUB MessageColor
- ' Farbe für Meldungen setzen
- SHARED MessFore%, MessBack%
- IF MessFore% < 0 OR MessFore% > 15 THEN MessFore% = 0
- IF MessBack% < 0 OR MessBack% > 7 THEN MessBack% = 0
- IF MessFore% <= 0 AND MessBack% <= 0 THEN
- MessFore% = %MessFore
- MessBack% = %MessBack
- END IF
- COLOR MessFore%, MessBack%
- END SUB
-
- SUB MessageWindow
- ' Erstellen des kleinen Infofensters
- ' über dem Dateiauswahlfenster.
- LOCAL XPos%, YPos%, x%
- YPos% = CSRLIN
- XPos% = POS(x%)
- IF XPos% < 1 OR XPos% > 25 THEN YPos% = 1
- IF YPos% < 1 OR YPos% > 80 THEN XPos% = 1
- CALL Frame(26, 4, 57, 7, "")
- LOCATE 5, 28, 0
- PRINT " Wählen Sie eine Datei aus ";
- LOCATE YPos%, XPos%, 0
- END SUB
-
- FUNCTION NewMask$(GetFileMask$, lastchar%)
- ' Ändern der Dateisuchmaske in einem Bildschirm-
- ' fenster mithilfe der Funktion ReadString$()
- LOCAL test%, NMask$, XPos%, YPos%
- YPos% = CSRLIN
- XPos% = POS(x%)
- CALL Frame(27, 10, 58, 13, " Neue Suchmaske ")
- LOCATE 11, 29, 1
- NMask$ = ReadString$(GetFileMask$, 11, test%)
- lastchar% = test%
- IF NMask$ = "" THEN NMask$ = GetFileMask$
- IF test% = 27 THEN
- NewMask$ = GetFileMask$
- ELSE
- NewMask$ = NMask$
- END IF
- LOCATE YPos%, XPos%, 0
- END FUNCTION
-
- FUNCTION ReadString$(EntryStr$, entrylen%, lastchar%) PUBLIC
- ' Editierroutine, Ersetzt die in Powerbasic miserable
- ' INPUT-Routine
- LOCAL entry$, ch$, chh$ Insmode%, count%
- LOCAL ready%, curpoint%, x%, y%, s1$, s2$
- y% = CSRLIN
- x% = POS(x%)
- DECR entryLen%
- entry$ = EntryStr$
- PRINT SPACE$(entrylen% + 1);
- IF CrtMode% = 7 THEN
- LOCATE y%, x%, 1, 11, 13
- ELSE
- LOCATE y%, x%, 1, 6, 7
- END IF
- PRINT entry$;
- curpoint% = LEN(entry$)
- InsMode% = %TRUE
- ready% = %FALSE
- DO
- DO
- ch$ = UCASE$(INKEY$)
- LOOP UNTIL ch$ <> ""
- IF LEN(ch$) = 2 THEN
- chh$ = RIGHT$(ch$, 1)
- ch$ = CHR$(0)
- END IF
- SELECT CASE ch$
- CASE CHR$(10), CHR$(13)
- lastchar% = 13
- ready% = %TRUE
- CASE CHR$(3), CHR$(27)
- lastchar% = 27
- ready% = %TRUE
- entry$ = ""
- curpoint% = 0
- CASE Chr$(7)
- IF curpoint% >= 0 AND _
- curpoint% <> LEN(entry$) THEN
- FOR count% = curpoint% + 1 TO LEN(entry$) - 1
- MID$(entry$, count%, 1) = _
- MID$(entry$, count% + 1, 1)
- NEXT count%
- entry$ = LEFT$(entry$, LEN(entry$) - 1)
- LOCATE y%, x%, 1
- PRINT entry$; " ";
- LOCATE y%, x% + curpoint%
- ELSE
- BEEP
- END IF
- CASE CHR$(8)
- IF curpoint% > 0 THEN
- inter$ = entry$
- FOR count% = curpoint% TO LEN(entry$) - 1
- MID$(inter$, count%, 1) = _
- MID$(entry$, count% + 1, 1)
- NEXT count%
- entry$ = LEFT$(inter$, LEN(inter$) - 1)
- DECR curpoint%
- LOCATE y%, x%, 0
- PRINT entry$, " ";
- LOCATE y%, x% + curpoint%, 1
- END IF
- CASE CHR$(24)
- CALL Stopp
- LOCATE , , 1
- CASE CHR$(127)
- curpoint% = 0
- entry$ = ""
- LOCATE y%, x%
- PRINT SPACE$(entrylen% + 1);
- LOCATE y%, x%
- CASE "!" TO "&", "(" TO "*", _
- "-" TO ".", "0" TO ";", _
- "=", "?" TO "Z", "\", _
- "_" TO "{", "}", "~", _
- "Ç" TO "Ñ", "α" TO "■"
- IF len(entry$) <= entrylen% THEN
- IF curpoint% >= LEN(entry$) THEN
- entry$ = entry$ + ch$
- INCR curpoint%
- PRINT ch$;
- ELSE
- IF InsMode% THEN
- s1$ = LEFT$(entry$, curpoint%)
- s2$ = RIGHT$(entry$, _
- LEN(entry$) - curpoint% + 1)
- entry$ = s1$ + ch$ + s2$
- LOCATE y%, x%, 1
- PRINT entry$; " ";
- INCR curpoint%
- LOCATE y%, curpoint% + x%, 1
- ELSE ' IF NOT InsMode% THEN
- PRINT ch$;
- INCR curpoint%
- MID$(entry$, curpoint%, 1) = ch$
- END IF
- END IF
- ELSE
- IF NOT Insmode% AND curpoint% <= entrylen% THEN
- PRINT ch$;
- INCR curpoint%
- MID$(entry$, curpoint%, 1) = ch$
- ELSEIF Insmode% AND curpoint% <= entrylen% THEN
- s1$ = LEFT$(entry$, curpoint%)
- s2$ = RIGHT$(entry$, LEN(entry$) - LEN(s1$))
- entry$ = s1$ + ch$ + s2$
- entry$ = LEFT$(entry$, LEN(entry$) - 1)
- INCR curpoint%
- IF CrtMode% = 7 THEN
- LOCATE y%, x%, 1, 11, 13
- ELSE
- LOCATE y%, x%, 1, 6, 7
- END IF
- PRINT entry$; " "
- LOCATE y%, curpoint% + x%, 1
- ELSE
- BEEP
- END IF
- END IF
- CASE CHR$(0)
- SELECT CASE chh$
- CASE "-"
- CALL Stopp
- LOCATE , , 1
- CASE ";"
- LOCATE , , 0
- CALL ReadStringHelp
- LOCATE , , 1
- CASE "R"
- IF Insmode% THEN
- Insmode% = %FALSE
- LOCATE , , 1, 0, 16
- ELSE
- Insmode% = %TRUE
- IF CrtMode% = 7 THEN
- LOCATE , , 1, 11, 13
- ELSE
- LOCATE , , 1, 6, 7
- END IF
- END IF
- CASE "G"
- curpoint% = 0
- LOCATE y%, x%, 1
- PRINT entry$; " ";
- LOCATE y%, x%, 1
- CASE "O"
- curpoint% = LEN(entry$)
- LOCATE y%, x%, 1
- PRINT entry$; " ";
- LOCATE y%, x% + curpoint%, 1
- CASE "S"
- IF curpoint% >= 0 AND _
- curpoint% <> LEN(entry$) THEN
- FOR count% = curpoint% + 1 TO LEN(entry$) - 1
- MID$(entry$, count%, 1) = _
- MID$(entry$, count% + 1, 1)
- NEXT count%
- entry$ = LEFT$(entry$, LEN(entry$) - 1)
- LOCATE y%, x%, 1
- PRINT entry$; " ";
- LOCATE y%, x% + curpoint%
- END IF
- CASE "H", "K"
- IF curpoint% <> 0 THEN
- DECR curpoint%
- LOCATE y%, x% + curpoint%
- END IF
- CASE "M", "P"
- IF curpoint% <> LEN(entry$) THEN
- INCR curpoint%
- LOCATE y%, x% + curpoint%
- END IF
- END SELECT
- END SELECT
- LOOP UNTIL ready%
- ReadString$ = entry$
- LOCATE , , 0
- END FUNCTION
-
- SUB ReadStringHelp
- ' Hilfe für die Editierroutine
- LOCAL OldX%, OldY%, a$, ch$, OldAttr%
- CALL Save.Screen
- OldX% = POS(x%)
- OldY% = CSRLIN
- OldAttr% = GetTextAttr%
- CALL ClearKeyBoard
- a$ = ""
- CALL Frame(5, 13, 44, 24, " Hilfe für Editierfenster ")
- LOCATE 14, 7
- PRINT "Sie können die Eingabe frei editie-";
- LOCATE 15, 7
- PRINT "ren. ^BackSpace löscht die Eingabe";
- LOCATE 16, 7
- PRINT "vollständig, Ins wechselt zwischen";
- LOCATE 17, 7
- PRINT "Überschreibemodus (BlockCursor)";
- LOCATE 18, 7
- PRINT "und Einfügemodus (Strichcursor).";
- LOCATE 19, 7
- PRINT "Nicht erlaubte Zeichen werden igno-";
- LOCATE 20, 7
- PRINT "riert. Löschen einzelner Zeichen";
- LOCATE 21, 7
- PRINT "mit Del und Backspace. Übernahme";
- LOCATE 22, 7
- PRINT "mit <"; CHR$(17); "──┘>, Abbruch mit <ESC>";
- WHILE a$ = ""
- a$ = INKEY$
- IF (LEN(a$) = 2 AND RIGHT$(a$, 1) = "-") _
- OR a$ = CHR$(24) THEN
- CALL Stopp
- a$ = ""
- END IF
- WEND
- CALL Restore.Screen
- CALL TextAttr(OldAttr%)
- LOCATE OldY%, OldX%, 1
- END SUB
-
- SUB Restore.Screen
- ' Lokale Restaurierung des Bildschirminhaltes.
- ' korresondiert mit SUB Save.Screen
- SHARED Peeked.Screen$
- LOCAL ScreenSeg%
- IF CrtMode% = 7 THEN
- ScreenSeg% = &HB000
- ELSE
- ScreenSeg% = &HB800
- END IF
- DEF SEG = ScreenSeg%
- POKE$ 0, Peeked.Screen$
- DEF SEG
- END SUB
-
- SUB RestoreScreen PUBLIC
- ' Globale Restaurierung des Bildschirm-
- ' inhaltes. Korrespondiert mit SUB SaveScreen.
- ' Kann auch im Hautprogramm verwendet werden.
- SHARED PeekedScreen$
- LOCAL ScreenSeg%
- IF CrtMode% = 7 THEN
- ScreenSeg% = &HB000
- ELSE
- ScreenSeg% = &HB800
- END IF
- DEF SEG = ScreenSeg%
- POKE$ 0, PeekedScreen$
- DEF SEG
- END SUB
-
- SUB Save.Screen
- ' Lokale Sicherung des Bildschirminhaltes.
- ' Korrespondiert mit SUB Restore.Screen
- SHARED Peeked.Screen$
- LOCAL ScreenSeg%
- IF CrtMode% = 7 THEN
- ScreenSeg% = &HB000
- ELSE
- ScreenSeg% = &HB800
- END IF
- DEF SEG = ScreenSeg%
- Peeked.Screen$ = PEEK$(0, 4000)
- DEF SEG
- END SUB
-
- SUB SaveScreen PUBLIC
- ' Globale Sicherung des Bildschirminhaltes.
- ' Korrespondiert mit SUB RestoreScreen. Kann
- ' auch im Hautprogramm verwendet werden.
- SHARED PeekedScreen$
- LOCAL ScreenSeg%
- IF CrtMode% = 7 THEN
- ScreenSeg% = &HB000
- ELSE
- ScreenSeg% = &HB800
- END IF
- DEF SEG = ScreenSeg%
- PeekedScreen$ = PEEK$(0, 4000)
- DEF SEG
- END SUB
-
- SUB Shadow
- ' Schreiben des Schattenzeichens mit
- ' der Zeichennummer shade% um den Rahmen
- ' des definierten Bildschirmfensters
- SHARED OrgAttribute%, shade%
- CALL TextAttr(OrgAttribute%)
- PRINT CHR$(shade%);
- CALL WindowColor
- END SUB
-
- FUNCTION SRecord.Attr% (DTA$)
- ' Rückgabe des Attributes aus der
- ' Disk Transfer Area (DTA)
- SRecord.Attr% = ASC(MID$(DTA$, 22, 1))
- END FUNCTION
-
- FUNCTION SRecord.Name$ (DTA$)
- 2' Rückgabe des Namens aus der
- ' Disk Transfer Area (DTA)
- LOCAL Temp$
- temp$ = MID$(DTA$, 31) + CHR$(0)
- SRecord.Name$ = LEFT$(temp$, INSTR(temp$, CHR$(0)) - 1)
- ' * Dateiname aus DTA holen
- END FUNCTION
-
- SUB Stopit(Breaktest%)
- ' Abbruch-Routine für ALT-X, ^X
- ' wegen der Verschachtelungen muß eine eigene
- ' Bildschirmsicherungsroutine verwendet werden!
- LOCAL OldCurs%, OldY%, OldX%, ScreenSeg%, a$, OldAttr%
- Breaktest% = %FALSE
- OldX% = POS(x%)
- OldY% = CSRLIN
- DEF SEG = &H40
- OldCurs% = PEEKI(&H60)
- Crt% = PEEK(&H49)
- DEF SEG
- IF Crt% = 7 THEN
- ScreenSeg% = &HB000
- ELSE
- ScreenSeg% = &HB800
- END IF
- DEF SEG = ScreenSeg%
- ScreenArray$ = PEEK$(0, 4000)
- DEF SEG
- OldAttr% = GetTextAttr%
- CALL Frame(21, 11, 62, 14, " ACHTUNG ")
- LOCATE 12, 23, 1
- PRINT "Programm wirklich abbrechen? (J/N): ";
- DO
- DO
- a$ = UCASE$(INKEY$)
- IF a$ = CHR$(13) OR _
- a$ = CHR$(24) OR _
- (LEN(a$) = 2 AND RIGHT$(a$, 1) = "-") THEN
- a$ = "J" ' j, J, <───┘, ^X, Alt-X
- ELSEIF a$ = CHR$(27) THEN
- a$ = "N" ' n, N, ESC
- END IF
- LOOP UNTIL a$ <> ""
- LOOP UNTIL INSTR("JN", a$)
- PRINT a$;
- IF a$ = "N" THEN
- LOCATE OldY%, OldX%, 0
- DEF SEG = ScreenSeg%
- POKE$ 0, ScreenArray$
- DEF SEG
- CALL TextAttr(OldAttr%)
- EXIT SUB
- END IF
- CLS
- LOCATE , , 1
- Breaktest% = %TRUE
- END SUB
-
- SUB Stopp
- ' Abbruchprozedur
- LOCAL break%
- CALL Stopit(break%)
- IF break% THEN CALL ChangeOrgDir: STOP
- END SUB
-
- SUB TextAttr(Attr%)
- ' Schreiben des Textattributes statt des
- ' Color-Prozedur, Wird benötigt, wenn das
- ' Attribut mit SCREEN ,,1 ermittelt wurde
- ' z.B. in FUNCTION GetTextAttr%().
- IF Attr% > &HFF THEN Attr% = Attr% MOD &HFF
- IF Attr% >= 0 AND Attr% < &H100 THEN
- IF Attr% > 126 THEN
- COLOR Attr% MOD &H10 + &H10, Attr% \ &H10
- ELSE
- COLOR Attr% MOD &H10, Attr% \ &H10
- END IF
- END IF
- END SUB
-
- SUB WindowColor
- ' Setzen des Fensterfarben
- SHARED WinFore%, WinBack%
- IF WinFore% <= 0 AND WinBack% <= 0 THEN
- WinFore% = %WinFore
- WinBack% = %WinBack
- END IF
- COLOR WinFore%, WinBack%
- END SUB
-
- FUNCTION GetFile$(GetFileMask$, _
- InputAllowed%, _
- SortDir%) PUBLIC
- ' Funktion zum Einlesen eines Dateinamens (mit Pfad)
- ' aus einem Bildschirmfenster mit Wechsel von Lauf-
- ' werk und Verzeichnis. Bei Abbruch mit <ESC> wird
- ' der String "<ESC>" zurückgegeben, auf den ium Haupt-
- ' programm getestet werden muß, da es sich um keine
- ' valide Dateikennung handelt.
- SHARED GetFMask$, OrgAttribute%, CursorStart%
- SHARED MarkedFile%, DirArray$[], PathString$
- SHARED OrgDirectory$, DirString$, att%, ConfigFile$
- SHARED ESCBack$, DriveStr1$, DriveStr2$, ManualName$
- SHARED dmax%, drives%, first%, last%, BarBack%
- SHARED MessFore%, MessBack%, WinFore%, initialized%
- SHARED shade%, ArrayNum%, WinBack%, BarFore%
- LOCAL OldX%, OldY%, ch$, cx$, chh$, drive%
- LOCAL tcount%, ctx%, x%
- IF NOT initialized% THEN CALL InitDirwin("DIRWIN.CFG")
- OldY% = CSRLIN
- OldX% = POS(x%)
- IF GetFMask$ <> "" THEN GetFileMask$ = GetFMask$
- GetFileMask$ = UCASE$(GetFileMask$)
- drives% = GetDrives%
- drive% = 0
- ActFile% = 1
- CALL SaveScreen
- CALL GetDir(drive%, OrgDirectory$)
- PathString$ = ""
- Looplabel:
- IF PathString$ <> "" THEN CALL ChangeActDir
- CALL GetDir(drive%, DirString$)
- MarkedFile% = 1
- IF LEN(DirString$) = 3 THEN
- DirString$ = LEFT$(DirString$, 2)
- END IF
- PathString$ = DirString$ + "\" + GetFileMask$
- CALL MessageWindow
- LOCATE , , 0
- CALL GetDirectory(GetFileMask$, SortDir%)
- att% = %TRUE
- first% = 1
- CALL FillDirWindow
- DO
- ch$ = ""
- ccx$ = ""
- chh$ = ""
- DO
- ch$ = INKEY$
- IF LEN(ch$) > 1 THEN
- ccx$ = RIGHT$(ch$, 1)
- ch$ = CHR$(0)
- END IF
- LOOP UNTIL ch$ <> ""
- SELECT CASE ch$
- CASE CHR$(0)
- SELECT CASE ccx$
- CASE "-"
- CALL Stopp
- CASE ";", "^", "T", "h"
- CALL DwHelp(InputAllowed%)
- CASE "<", "_", "U", "i"
- CALL ChangeMenuColors(GetFileMask$)
- CALL MessageWindow
- CALL DirWindow
- CALL FillDirWindow
- CASE "g", "]", "q", "D"
- IF InputAllowed% THEN
- ManualName$ = ManualInput$
- IF ManualName$ = "" THEN GOTO LoopLabel
- GetFile$ = ManualName$
- CALL RestoreScreen
- LOCATE OldY%, OldX%, 1
- CALL TextAttr(OrgAttribute%)
- CALL ChangeOrgDir
- EXIT FUNCTION
- END IF
- CASE "K"
- IF MarkedFile% > first% THEN DECR MarkedFile%
- CASE "M"
- IF MarkedFile% < dmax% THEN
- IF MarkedFile% < 35 + first% THEN
- INCR MarkedFile%
- END IF
- END IF
- CASE "G"
- MarkedFile% = first%
- CASE "O"
- WHILE MarkedFile% < dmax% AND _
- MarkedFile% < 35 + first%
- INCR MarkedFile%
- WEND
- CASE "w", "ä"
- first% = 1
- MarkedFile% = 1
- CALL DirWindow
- CALL FillDirWindow
- CASE "v"
- IF dmax% > 35 THEN
- DO
- INCR first%, 4
- MarkedFile% = first%
- LOOP UNTIL MarkedFile% >= dmax% - 35 AND _
- MarkedFile% <= dmax% - 31
- CALL DirWindow
- CALL FillDirWindow
- END IF
- CASE "u"
- IF first% < dmax% - 3 THEN
- DO
- INCR first%, 4
- MarkedFile% = first%
- LOOP UNTIL MarkedFile% >= dmax% - 3 AND _
- MarkedFile% <= dmax%
- CALL DirWindow
- CALL FillDirWindow
- END IF
- CASE "I"
- IF MarkedFile% < 37 THEN
- first% = 1
- MarkedFile% = 1
- ELSE
- IF first% > 35 THEN
- DECR first%, 36
- ELSE
- first% = 1
- END IF
- MarkedFile% = first%
- CALL DirWindow
- CALL FillDirWindow
- END IF
- CASE "Q"
- IF dmax% < 37 THEN
- MarkedFile% = dmax%
- ELSE
- IF NOT (first% >= dmax% - 3 AND _
- first% <= dmax%) THEN
- IF dmax% > 35 THEN
- IF first% < dmax% - 35 THEN
- INCR first%, 36
- ELSE
- DO
- INCR first%, 4
- markedfile% = first%
- LOOP UNTIL MarkedFile% >= dmax% - 3 _
- AND MarkedFile% <= dmax%
- END IF
- END IF
- END IF
- END IF
- MarkedFile% = first%
- CALL DirWindow
- CALL FillDirWindow
- CASE "H"
- IF first% - 1 < MarkedFile% AND _
- first% + 4 > MarkedFile% THEN
- IF MarkedFile% - 3 > 1 THEN
- DECR first%, 4
- DECR MarkedFile%, 4
- CALL DirWindow
- CALL FillDirWindow
- END IF
- ELSE
- IF MarkedFile% > 3 + first% THEN
- DECR MarkedFile%, 4
- END IF
- END IF
- CASE "P"
- IF first% + 31 < MarkedFile% AND _
- first% + 36 > MarkedFile% THEN
- IF MarkedFile% + 4 < dmax% THEN
- INCR first%, 4
- INCR MarkedFile%, 4
- CALL DirWindow
- CALL FillDirWindow
- ELSE
- IF MarkedFile% <> dmax% THEN
- INCR first%, 4
- MarkedFile% = dmax%
- CALL DirWindow
- CALL FillDirWindow
- END IF
- END IF
- ELSE
- IF MarkedFile% <= dmax% - 4 AND _
- MarkedFile% <= dmax% + first% THEN
- INCR MarkedFile%, 4
- ELSE
- IF MarkedFile% > dmax% - 4 THEN
- MarkedFile% = dmax%
- END IF
- END IF
- END IF
- CASE ELSE: CALL ErrorBeep
- END SELECT
- CASE CHR$(24)
- CALL Stopp
- CASE CHR$(32)
- CALL Save.Screen
- GetFMask$ = NewMask$(GetFileMask$, LastChar%)
- IF LEFT$(GetFMsk$, 1) = "." THEN
- GetFMask$ = "*" + GetFMask$
- END IF
- IF GetFileMask$ = GetFMask$ THEN
- LastChar% = 27
- ELSE
- GetFileMask$ = GetFMask$
- END IF
- IF LastChar% <> 27 THEN
- CALL Frame (3, 3, 43, 6, "")
- LOCATE 4, 5, 1
- PRINT "Als Standardmaske speichern (J/N): ";
- DO
- DO
- chh$ = UCASE$(INKEY$)
- LOOP UNTIL chh$ <> ""
- IF chh$ = CHR$(13) THEN
- chh$ = "J"
- ELSEIF chh$ = CHR$(27) THEN
- chh$ = "N"
- END IF
- LOOP UNTIL INSTR("JN", chh$)
- LOCATE , , 0
- PRINT chh$;
- DELAY 0.4
- IF chh$ = "J" THEN
- CALL Frame(40, 19, 70, 22, "")
- LOCATE 20, 42, 0
- CALL MessageColor
- PRINT " Maske wird gespeichert ! ";
- CALL SaveConfig(ArrayNum%, MessFore%, _
- MessBack%, WinFore%, _
- WinBack%, BarFore%, _
- BarBack%, shade%, _
- GetFileMask$)
- END IF
- END IF
- CALL Restore.Screen
- GOTO Looplabel
- CASE CHR$(07), CHR$(09)
- IF MarkedFile% < dmax% AND _
- MarkedFile% < 35 + first% THEN
- INCR MarkedFile%
- END IF
- CASE CHR$(10), CHR$(13)
- IF INSTR(DirArray$[MarkedFile%], "\") THEN
- IF DirArray$[MarkedFile%] <> ".\" THEN
- IF DirArray$[MarkedFile%] = "..\" THEN
- IF PathString$ <> GetFileMask$ THEN
- CALL GetDir(drive%, PathString$)
- drv$ = LEFT$(PathString$, 2) + ".."
- CHDIR drv$
- CALL GetDir(drive%, PathString$)
- PathString$ = PathString$ _
- + "\" + GetFileMask$
- x% = INSTR(PathString$, "\\")
- IF x% > 0 THEN
- PathString$ = EXTRACT$(PathString$, _
- "\\") + MID$(PathString$, x% + 1)
- END IF
- END IF
- ELSE
- CALL GetDir(drive%, PathString$)
- PathString$ = PathString$ + "\" + _
- DirArray$[MarkedFile%]
- PathString$ = LEFT$(PathString$, _
- LEN(PathString$) - 1)
- x% = INSTR(PathString$, "\\")
- IF x% > 0 THEN
- PathString$ = EXTRACT$(PathString$, _
- "\\") + MID$(PathString$, x% + 1)
- END IF
- CHDIR PathString$
- PathString$ = PathString$ + "\" + GetFileMask$
- x% = INSTR(PathString$, "\\")
- IF x% > 0 THEN
- PathString$ = EXTRACT$(PathString$, _
- "\\") + MID$(PathString$, x% + 1)
- END IF
- END IF
- Att% = %TRUE
- MarkedFile% = 1
- CALL GetDirectory(GetFileMask$, SortDir%)
- CALL FillDirWindow
- END IF
- ELSE
- IF INSTR(DirArray$[MarkedFile%], _
- DriveStr1$) > 0 AND _
- INSTR(DirArray$[MarkedFile%), _
- DriveStr2$) > 0 AND _
- MID$(DirArray$[MarkedFile%], 6, 1) > "@" AND _
- MID$(DirArray$[MarkedFile%], 6, 1) < "[" THEN
- drive% = ASC(MID$(DirArray$[MarkedFile%], _
- 6, 1)) - ASC("@")
- IF (drive% < 3) AND (drive% <> 0) THEN
- CALL Save.Screen
- CALL Frame(38, 19, 77, 22, " ACHTUNG ")
- LOCATE 20, 40, 0
- CALL MessageColor
- CALL ClearKeyBoard
- PRINT " Diskette einlegen, Taste drücken! ";
- DO
- c$ = INKEY$
- IF c$ = CHR$(27) THEN
- CALL Restore.Screen
- drive% = 0
- GOTO LoopLabel
- ELSEIF (LEN(c$) = 2 AND RIGHT$(c$, 1) = "-") _
- OR c$ = CHR$(24) THEN
- CALL Stopp
- c$ = ""
- END IF
- LOOP UNTIL c$ <> ""
- CALL Restore.Screen
- END IF
- CALL GetDir(drive%, PathString$)
- CALL ChangeActDir
- PathString$ = PathString$ + "\" + GetFileMask$
- GOTO Looplabel
- ELSE
- IF DirArray$[MarkedFile%] = NoDriveB$ THEN
- drive% = 0
- CALL ErrorBeep
- GOTO Looplabel
- ELSE
- cxt% = LINSTR%(PathString$, "\")
- IF cxt% > 0 THEN
- PathString$ = LEFT$(PathString$, cxt%)
- END IF
- GetFile$ = PathString$ + _
- DirArray$[MarkedFile%]
- CALL RestoreScreen
- LOCATE OldY%, OldX%, 1
- CALL TextAttr(OrgAttribute%)
- CALL ChangeOrgDir
- EXIT FUNCTION
- END IF
- END IF
- END IF
- CASE CHR$(27)
- CASE ELSE: CALL ErrorBeep
- END SELECT
- CALL FillDirWindow
- LOOP UNTIL ch$ = CHR$(27)
- CALL RestoreScreen
- CALL TextAttr(OrgAttribute%)
- IF CrtMode% = 7 THEN
- LOCATE OldY%, OldX%, 1, 11, 13
- ELSE
- LOCATE OldY%, OldX%, 1, 6, 7
- END IF
- GetFile$ = ESCBack$
- CALL ChangeOrgDir
- END FUNCTION
-
- SUB ClearKeyBoard
- ' Löschen des Tastaturpuffers über das
- ' Ignorieren der Eingabe und Schicken
- ' der Tasteneingaben ins Nichts.
- LOCAL ch$
- WHILE INSTAT
- ch$ = INKEY$
- WEND
- END SUB
-
- FUNCTION CrtMode%
- ' Bildschirmmodus ermitteln über das
- ' BIOS-Datensegment bei 40h:49h
- LOCAL Crt%
- DEF SEG = &H40
- Crt% = PEEK(&H49)
- DEF SEG
- CrtMode% = Crt%
- END FUNCTION
-
-