home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* DATWAHL.PAS *)
- (* Turbo-Dateiwahl nachempfunden *)
- (* (c) 1990 Alexander Sunder & TOOLBOX *)
- (* ------------------------------------------------------ *)
- UNIT DatWahl;
-
- INTERFACE
-
- USES
- Crt, Dos;
-
- CONST
- StdName = '*';
- StdExt = '*';
- MaxEintraege = 165;
- BoxColor = $70; { Werte für monochrome Text- }
- ChoseColor = $18; { darstellung: invers und hell }
-
- TYPE
- TDrive = STRING [1];
- TDir = STRING [67];
- TName = STRING [8];
- TExten = STRING [3];
-
-
- PROCEDURE UpString(VAR St : STRING);
-
- PROCEDURE Rahmen(X1, Y1, X2, Y2 : BYTE);
-
- PROCEDURE CompleteFileName(Name : STRING;
- VAR Drive : TDrive;
- VAR Dir : TDir;
- VAR FName : TName;
- VAR Ext : TExten);
-
- PROCEDURE DateiWahl(x, y : BYTE; VAR Name : STRING);
-
-
- IMPLEMENTATION
-
- PROCEDURE UpString;
- VAR
- i : BYTE;
- BEGIN
- FOR i := 1 TO Length(St) DO
- IF St[i] IN ['ä', 'ö', 'ü'] THEN
- CASE St[i] OF
- 'ä' : St[i] := 'Ä';
- 'ö' : St[i] := 'Ö';
- 'ü' : St[i] := 'Ü';
- END
- ELSE
- St[i] := UpCase(St[i]);
- END;
-
- PROCEDURE CompleteFileName;
- VAR
- HDir : TDir;
- i : BYTE;
- ExtVorhanden : BOOLEAN;
- BEGIN
- Dir := ''; FName := StdName; Ext := StdExt;
- ExtVorhanden := FALSE;
- IF (Length(Name) > 1) AND (Name[2] = ':') THEN BEGIN
- Drive := Name[1];
- Name := Copy(Name, 3, Length(Name) - 2);
- END ELSE BEGIN
- GetDir(0, HDir);
- Drive := HDir[1];
- END;
- i := Pos('.',Name);
- IF (Length(Name) > 1) AND (i <> 0) THEN BEGIN
- Ext := Copy(Name, i + 1, Length(Name) - i);
- Name := Copy(Name, 1, i - 1);
- ExtVorhanden := TRUE;
- END;
- IF Length(Name) > 0 THEN BEGIN
- i := Length(Name);
- WHILE (Name[i] <> '\') and (i > 1) DO Dec(i);
- IF Name[i] <> '\' THEN
- FName := Name
- ELSE
- IF ExtVorhanden THEN BEGIN
- FName := Copy(Name, i + 1, Length(Name) - i);
- Dir := Copy(Name, 1, i)
- END ELSE
- Dir := Name;
- END;
- IF (Dir = '') OR (Dir[1] <> '\') THEN BEGIN
- GetDir(Ord(Drive[1]) - 64, HDir);
- HDir := Copy(HDir, 3, Length(HDir) - 2);
- IF Dir = '' THEN Dir := HDir
- ELSE Dir := HDir + '\' + Dir;
- END;
- IF Dir[Length(Dir)] <> '\' THEN Dir := Dir + '\'
- END;
-
- PROCEDURE Rahmen;
- VAR
- I : BYTE;
- BEGIN
- GotoXY(X1, Y1); Write(#218);
- FOR i := X1 + 1 TO X2 - 1 DO Write(#196);
- Write(#191);
- FOR i := Y1 + 1 TO Y2 - 1 DO BEGIN
- GotoXY(X1, i); Write(#179);
- GotoXY(X2, i); Write(#179);
- END;
- GotoXY(X1, Y2); Write(#192);
- FOR i := X1 + 1 TO X2 - 1 DO Write(#196);
- Write(#217);
- END;
-
- PROCEDURE DateiWahl;
- TYPE
- string12 = STRING[12];
- VAR
- DirNamen : ARRAY [1..MaxEintraege] OF string12;
- Anzahl,i : WORD;
- Drive : TDrive;
- Dir,OldDir : TDir;
- FName : TName;
- Ext : TExten;
- OldX, OldY, Attr : BYTE;
- ScreenBase : WORD;
- ScreenBuffer : ARRAY [0..3999] OF BYTE;
-
- PROCEDURE DirNamenSortieren(Links, Rechts : WORD);
- VAR
- L, R : WORD;
- Vergleich, Speicher : string12;
- BEGIN
- L := Links; R := Rechts ;
- Vergleich := DirNamen[(Links + Rechts) DIV 2];
- REPEAT
- WHILE DirNamen[L] < Vergleich DO L := L + 1;
- WHILE DirNamen[R] > Vergleich DO R := R - 1;
- IF L <= R THEN BEGIN
- Speicher := DirNamen[L];
- DirNamen[L] := DirNamen[R];
- DirNamen[R] := Speicher;
- L := L + 1; R := R - 1;
- END;
- UNTIL L > R;
- IF R > Links THEN DirNamenSortieren(Links, R);
- IF L < Rechts THEN DirNamenSortieren(L, Rechts);
- END;
-
- FUNCTION DateiListeErstellen(Name : STRING) : WORD;
- VAR
- DirInfo : SearchRec;
- I, Anzahl : WORD;
- BEGIN
- Anzahl := 0;
- FindFirst(Name, AnyFile, DirInfo);
- WHILE (DOSError = 0) AND
- (Anzahl < MaxEintraege - 15) DO BEGIN
- IF DirInfo.Attr = Archive THEN BEGIN
- Inc(Anzahl);
- DirNamen[Anzahl] := DirInfo.Name;
- END;
- FindNext(DirInfo);
- END;
- IF (Anzahl > 0) OR (DOSError IN [0,2,18]) THEN BEGIN
- FindFirst(Drive+':'+ Dir + '*.*', AnyFile, DirInfo);
- WHILE (DOSError = 0) AND
- (Anzahl < MaxEintraege) DO BEGIN
- IF (DirInfo.Attr = Directory) AND
- (DirInfo.Name <> '.') THEN BEGIN
- Inc(Anzahl);
- IF DirInfo.Name = '..' THEN
- DirInfo.Name := #255 + DirInfo.Name;
- DirNamen[Anzahl] := '\' + DirInfo.Name
- END;
- FindNext(DirInfo);
- END;
- IF Anzahl > 0 THEN BEGIN
- DirNamenSortieren(1, Anzahl);
- FOR i := 1 TO Anzahl DO BEGIN
- IF Copy(DirNamen[i], 1, 1) = '\' THEN
- DirNamen[i] := Copy(DirNamen[i], 2,
- Length(DirNamen[i]) - 1) + '\';
- IF Copy(DirNamen[i], 1, 1) = #255 THEN
- DirNamen[i] := Copy(DirNamen[i], 2, 3);
- END;
- END;
- END;
- DateiListeErstellen := Anzahl;
- END;
-
- PROCEDURE DateiAuswahl(VAR Name : STRING);
- VAR
- ch : CHAR;
- ErsteZeile, BildIndex : INTEGER;
-
- PROCEDURE DateiAusgabe(Index, Zeile : BYTE);
- BEGIN
- GotoXY(x + 1 + ((Index - 1) MOD 4) * 15,
- y + 1 + (Index - 1) DIV 4);
- Write(' ', DirNamen[Index + Zeile * 4],
- ' ':13 - Length(DirNamen[Index + Zeile * 4]));
- END;
-
- PROCEDURE Aufbau(Zeile : BYTE);
- VAR
- i : BYTE;
- BEGIN
- GotoXY(X + 1, Y); FOR I := 1 TO 59 DO Write(#196);
- GotoXY(x + (60 - Length(' ' + Name + ' ')) DIV 2, y);
- Write(' ' + Name + ' ');
- TextAttr := BoxColor; i := 1;
- WHILE i < 37 DO BEGIN
- IF Zeile * 4 + i <= Anzahl THEN
- DateiAusgabe(i, Zeile)
- ELSE BEGIN
- GotoXY(x + 1 + ((i - 1) MOD 4) * 15,
- y + 1 + (i - 1) DIV 4);
- Write(' ':14);
- END;
- Inc(i);
- END;
- END;
-
- BEGIN
- ErsteZeile := 0; BildIndex := 1;
- Aufbau(ErsteZeile);
- TextAttr := ChoseColor;
- DateiAusgabe(BildIndex, ErsteZeile);
- REPEAT
- ch := ReadKey;
- IF ch = #0 THEN BEGIN
- ch := ReadKey;
- IF ch IN [#71..#73, #75, #77, #79..#81] THEN BEGIN
- TextAttr := BoxColor;
- DateiAusgabe(BildIndex, ErsteZeile);
- CASE ch OF
- {Home} #71: BEGIN
- ErsteZeile := 0; BildIndex := 1;
- Aufbau(ErsteZeile);
- END;
- {UpArrow} #72: IF ErsteZeile * 4 +
- BildIndex > 4 THEN BEGIN
- IF BildIndex - 4 <= 0 THEN BEGIN
- Dec(ErsteZeile);
- Aufbau(ErsteZeile);
- END ELSE
- Dec(BildIndex, 4);
- END;
- {PageUp} #73: BEGIN
- IF (ErsteZeile - 9) * 4 + 1 > 0 THEN
- Dec(ErsteZeile, 9)
- ELSE BEGIN
- ErsteZeile := 0;
- BildIndex := 1 + (BildIndex-1) MOD 4;
- END;
- Aufbau(ErsteZeile);
- END;
- {LeftArrow} #75: IF ErsteZeile*4 + BildIndex > 1 THEN BEGIN
- Dec(BildIndex);
- IF BildIndex = 0 THEN BEGIN
- Dec(ErsteZeile); BildIndex := 4;
- Aufbau(ErsteZeile);
- END;
- END;
- {RightArrow} #77: IF ErsteZeile*4 +
- BildIndex < Anzahl THEN BEGIN
- Inc(BildIndex);
- IF BildIndex = 37 THEN BEGIN
- Inc(ErsteZeile); BildIndex := 33;
- Aufbau(ErsteZeile);
- END;
- END;
- {END} #79: BEGIN
- IF (Anzahl < ErsteZeile * 4 - 1) OR
- (Anzahl > ErsteZeile * 4 + 34)
- THEN BEGIN
- ErsteZeile := ((Anzahl - 1) DIV 4) -8;
- Aufbau(ErsteZeile)
- END;
- BildIndex := Anzahl - ErsteZeile * 4;
- END;
- {DownArrow} #80: BEGIN
- IF ErsteZeile*4+BildIndex+4 <= Anzahl
- THEN Inc(BildIndex,4)
- ELSE BildIndex := Anzahl-ErsteZeile*4;
- IF BildIndex > 36 THEN BEGIN
- Inc(ErsteZeile); Dec(BildIndex,4);
- Aufbau(ErsteZeile);
- END;
- END;
- {PageDOwn} #81: IF(ErsteZeile+9)*4+1 <= Anzahl THEN BEGIN
- Inc(ErsteZeile, 9);
- Aufbau(ErsteZeile);
- IF ErsteZeile*4+BildIndex > Anzahl THEN
- BildIndex := Anzahl - ErsteZeile * 4
- END ELSE
- BildIndex := Anzahl - ErsteZeile * 4;
- END;
- TextAttr := ChoseColor;
- DateiAusgabe(BildIndex, ErsteZeile);
- END;
- END;
- UNTIL ch IN [#13, #27];
- TextAttr := BoxColor;
- DateiAusgabe(BildIndex, ErsteZeile);
- IF ch = #13 THEN
- Name := DirNamen[ErsteZeile * 4 + BildIndex]
- ELSE Name := '';
- END;
-
- BEGIN
- OldX := WhereX; OldY := WhereY; Attr:=TextAttr;
- IF Mem[$40:$49]=7 THEN ScreenBase := $B000
- ELSE ScreenBase := $B800;
- Move(Mem[ScreenBase:0000], ScreenBuffer, 4000);
- GetDir(0, OldDir);
- UpString(Name);
- CompleteFileName(Name, Drive, Dir, FName, Ext);
- TextAttr := BoxColor;
- Rahmen(x, y, x+60, y+10);
- Window(x+1, y+1, x+59, y+9);
- ClrScr;
- Window(1, 1, 80, 25);
- REPEAT
- Name := Drive + ':' + Dir + FName + '.' + Ext;
- Anzahl := DateiListeErstellen(Name);
- IF Anzahl = 0 THEN BEGIN
- Name := ''; Write(#7);
- END ELSE BEGIN
- DateiAuswahl(Name);
- IF Name[Length(Name)] = '\' THEN BEGIN
- IF (Name[1] <> '.') THEN
- Dir := Dir + Name
- ELSE BEGIN
- i := Length(Dir) - 1;
- WHILE (i > 0) AND (Dir[i] <> '\') DO Dec(i);
- IF i > 0 THEN Dir := Copy(Dir, 1, i);
- END;
- END;
- END;
- UNTIL (Name = '') OR (Name[Length(Name)] <> '\');
- IF Name <> '' THEN
- Name := Drive + ':' + Dir + Name;
- Move(ScreenBuffer, Mem[ScreenBase:0000], 4000);
- TextAttr := Attr; GotoXY(OldX, OldY);
- ChDir(OldDir);
- END;
-
- BEGIN
- END.
- (* ------------------------------------------------------ *)
- (* Ende von DATWAHL.PAS *)