home *** CD-ROM | disk | FTP | other *** search
- DECLARE SUB FindNextFile (DTA$, Fehler%)
- DECLARE SUB FindFirstFile (Path$, DTA$, Fehler%)
- '* ------------------------------------------------------- *
- '* REQUEST.BAS *
- '* 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. *
- '* (c) 1989 W.Rinke & TOOLBOX *
- '* ------------------------------------------------------- *
- CONST IstNormal = 0
- CONST IstReadOnly = 1
- CONST IstHidden = 2
- CONST IstSystem = 4
- CONST IstVolumeLabel = 8
- CONST IstSubDirectory = 16
- CONST IstArchive = 32 '* Die Dateiattribute ...
-
- CONST MaxEintraege = 100 '* Anzahl der Einträge im
- '* Verzeichnis
-
- TYPE Regs '* Turbo Basic:
- ax AS INTEGER '* Register 1
- bx AS INTEGER '* Register 2
- cx AS INTEGER '* Register 3
- dx AS INTEGER '* Register 4
- bp AS INTEGER '* Register 7
- si AS INTEGER '* Register 5
- di AS INTEGER '* Register 6
- flags AS INTEGER '* Register 0
- ds AS INTEGER '* Register 8
- es AS INTEGER '* Register 9 von REG
- END TYPE
-
- DIM Dir$(0 TO MaxEintraege) '* bzW. 0:MaxEintraege
- DIM VideoBuffer%(4000)
-
- '* suche die erste Datei, die auf das Muster "*.*" paßt
- '* (komplette Pfade können eingetragen werden)
-
- CALL FindFirstFile("*.*", Eintrag$, Ergebnis%)
-
- IF Ergebnis% = 0 THEN '* Datei gefunden
- i = 1
- temp$ = MID$(Eintrag$, 31) + CHR$(0)
- Dir$(i) = LEFT$(temp$, INSTR(temp$, CHR$(0)) - 1)
- '* Dateiname aus DTA holen
- DO
- CALL FindNextFile(Eintrag$, Ergebnis%)
- i = i + 1
- IF Ergebnis% = 0 THEN
- temp$ = MID$(Eintrag$, 31) + CHR$(0)
- Dir$(i) = LEFT$(temp$, INSTR(temp$, CHR$(0)) - 1)
- '* Dateiname aus DTA holen
- END IF
- LOOP UNTIL Ergebnis% = 18 OR Ergebnis% <> 0
- '* keine weitere Datei
- END IF
-
- IstEintraege% = i - 1 '* gefundene Dateien
-
- CLS '* für Testzwecke ...
-
- '* ... Bildschirm sichern
- DEF SEG = &H40
- VideoMode% = PEEK(&H49) '* ... Videomodus erkennen
- DEF SEG
-
- IF VideoMode% = 7 THEN '* Monochrom
- DEF SEG = &HB000
- ELSE
- DEF SEG = &HB800 '* Farbe
- END IF
-
- FOR i% = 0 TO 3999
- VideoBuffer%(i%) = PEEK(i%)
- NEXT i%
- DEF SEG
-
- LOCATE 10, 10: COLOR 1, 7 '* Aufbau des Fensters
- PRINT "╔════════════════╗";
- LOCATE 11, 10: COLOR 1, 7
- PRINT "║ ║";
- COLOR 1, 0: PRINT CHR$(176);
- LOCATE 12, 10: COLOR 1, 7
- PRINT "║ ║";
- COLOR 1, 0: PRINT CHR$(176);
- LOCATE 13, 10: COLOR 1, 7
- PRINT "║ ║";
- COLOR 1, 0: PRINT CHR$(176);
- LOCATE 14, 10: COLOR 1, 7
- PRINT "║ ║";
- COLOR 1, 0: PRINT CHR$(176);
- LOCATE 15, 10: COLOR 1, 7
- PRINT "║ ║";
- COLOR 1, 0: PRINT CHR$(176);
- LOCATE 16, 10: COLOR 1, 7
- PRINT "║ ║";
- COLOR 1, 0: PRINT CHR$(176);
- LOCATE 17, 10: COLOR 1, 7
- PRINT "║ ║";
- COLOR 1, 0: PRINT CHR$(176)
- LOCATE 18, 10: COLOR 1, 7
- PRINT "║ ║";
- COLOR 1, 0: PRINT CHR$(176)
- LOCATE 19, 10: COLOR 1, 7
- PRINT "║ ║";
- COLOR 1, 0: PRINT CHR$(176)
- LOCATE 20, 10: COLOR 1, 7
- PRINT "║ ║";
- COLOR 1, 0: PRINT CHR$(176)
- LOCATE 21, 10: COLOR 1, 7
- PRINT "╚════════════════╝";
- COLOR 1, 0: PRINT CHR$(176)
- LOCATE 22, 11: COLOR 1, 0
- PRINT "░░░░░░░░░░░░░░░░░░"; '* das geht so am schnellsten
- COLOR 1, 7
-
- FOR i = 1 TO 10
- LOCATE 10 + i, 13: PRINT Dir$(i);
- NEXT
- LOCATE 11, 13
- EintragCtr = 1
- PosCtr = 1
- COLOR 1, 7
- LOCATE 10 + PosCtr, 13: COLOR 7, 1
- PRINT Dir$(EintragCtr); SPACE$(12 - LEN(Dir$(EintragCtr)))
- COLOR 1, 7
- '* Initialisierung abgeschlossen
-
- DO '* Hauptschleife
- DO
- Taste$ = INKEY$ '* auf Eingabe warten
- LOOP UNTIL Taste$ <> ""
- Taste = ASC(Taste$)
- IF Taste = 0 THEN '* Erweiterter
- Taste = ASC(RIGHT$(Taste$, 1)) '* Tastencode liegt an
- END IF
- '* ESC -> Taste = 27
- '* CR -> Taste = 13
- '* Cup -> Taste = 72
- '* CDn -> Taste = 80
- IF Taste = 72 THEN
- LOCATE 10 + PosCtr, 13
- PRINT Dir$(EintragCtr);
- PRINT SPACE$(12 - LEN(Dir$(EintragCtr)))
- EintragCtr = EintragCtr - 1
- IF EintragCtr < 1 THEN EintragCtr = 1
- PosCtr = PosCtr - 1
- IF PosCtr < 1 THEN PosCtr = 1
- LOCATE 10 + PosCtr, 13
- COLOR 7, 1: PRINT Dir$(EintragCtr);
- PRINT SPACE$(12 - LEN(Dir$(EintragCtr)))
- COLOR 1, 7
- IF PosCtr = 1 THEN
- FOR i = 1 TO 9 '* "UpDate" des Fensters
- LOCATE 10 + PosCtr + i, 13
- PRINT Dir$(EintragCtr + i);
- PRINT SPACE$(12 - LEN(Dir$(EintragCtr + i)))
- NEXT i
- END IF
- END IF
- IF Taste = 80 THEN
- LOCATE 10 + PosCtr, 13
- PRINT Dir$(EintragCtr);
- PRINT SPACE$(12 - LEN(Dir$(EintragCtr)))
- EintragCtr = EintragCtr + 1
- IF EintragCtr > IstEintraege% THEN
- EintragCtr = IstEintraege%
- END IF
- PosCtr = PosCtr + 1
- IF PosCtr > 10 THEN PosCtr = 10
- LOCATE 10 + PosCtr, 13
- COLOR 7, 1: PRINT Dir$(EintragCtr);
- PRINT SPACE$(12 - LEN(Dir$(EintragCtr)))
- COLOR 1, 7
- IF PosCtr = 10 THEN
- FOR i = 1 TO 9 '* "UpDate" des Fensters
- LOCATE 10 + PosCtr + i - 10, 13
- PRINT Dir$(EintragCtr - 10 + i);
- PRINT SPACE$(12 - LEN(Dir$(EintragCtr - 10 + i)))
- NEXT i
- END IF
- END IF
- LOOP UNTIL (Taste = 27) OR (Taste = 13)
-
- IF Taste = 13 THEN '* <RETURN>?
- Rueckgabe$ = Dir$(EintragCtr)
- ELSE
- Rueckgabe$ = "" '* oder <ESC>?
- END IF
-
- '* Bildschirm wiederherstellen
- IF VideoMode% = 7 THEN '* Monochrom
- DEF SEG = &HB000
- ELSE '* Farbe
- DEF SEG = &HB800
- END IF
-
- FOR i% = 0 TO 3999
- POKE i%, VideoBuffer%(i%)
- NEXT i%
- DEF SEG
- PRINT Rueckgabe$ '* der Dateieintrag,
- '* der verarbeitet werden soll
-
-
- '* ------------------------------------------------------- *
- SUB FindFirstFile (Path$, DTA$, Fehler%) STATIC
- DIM Reg AS Regs
-
- PathName$ = Path$ + CHR$(0) '* CHR$(0) für DOS
-
- Reg.ax = &H2F00 '* hole aktuelle DTA
- CALL INTERRUPTX(&H21, Reg, Reg)
- DTASeg% = Reg.es
- DTAOfs% = Reg.bx
-
- DTA$ = SPACE$(43) '* eigene DTA setzen
- Reg.ax = &H1A00
- Reg.ds = VARSEG(DTA$)
- Reg.dx = SADD(DTA$)
- CALL INTERRUPTX(&H21, Reg, Reg)
-
- Reg.ax = &H4E00 '* Suche ersten Eintrag
- Reg.cx = IstNormal + IstArchive
- Reg.ds = VARSEG(PathName$)
- Reg.dx = SADD(PathName$)
- CALL INTERRUPTX(&H21, Reg, Reg)
-
- Fehler% = Reg.flags AND 1
-
- Reg.ax = &H1A00 '* Original-DTA rücksetzen
- Reg.ds = DTASeg%
- Reg.dx = DTAOfs%
- CALL INTERRUPTX(&H21, Reg, Reg)
-
- END SUB
-
- '* ------------------------------------------------------- *
- SUB FindNextFile (DTA$, Fehler%) STATIC
- DIM Reg AS Regs
-
- IF LEN(DTA$) <> 43 THEN
- Fehler% = 2 '* Find First nicht aufgerufen!
- EXIT SUB
- END IF
-
- Reg.ax = &H2F00 '* hole aktuelle DTA
- CALL INTERRUPTX(&H21, Reg, Reg)
- DTASeg% = Reg.es
- DTAOfs% = Reg.bx
-
- Reg.ax = &H1A00 '* eigene DTA setzen
- Reg.ds = VARSEG(DTA$)
- Reg.dx = SADD(DTA$)
- CALL INTERRUPTX(&H21, Reg, Reg)
-
- Reg.ax = &H4F00 '* Suche nächsten Eintrag
- Reg.cx = IstNormal
- Reg.ds = VARSEG(PathName$)
- Reg.dx = SADD(PathName$)
- CALL INTERRUPTX(&H21, Reg, Reg)
-
- Fehler% = Reg.flags AND 1
-
- Reg.ax = &H1A00 '* DTA wiederherstellen
- Reg.ds = DTASeg%
- Reg.dx = DTAOfs%
- CALL INTERRUPTX(&H21, Reg, Reg)
-
- END SUB
- '* ------------------------------------------------------- *
- '* Ende von REQUEST.BAS *