home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* FILEBOX.PAS *)
- (* Datei-Selektion im Grafikmodus *)
- (* (c) 1991 Thorsten Huck & TOOLBOX *)
- (* ------------------------------------------------------ *)
- UNIT FileBox;
-
- INTERFACE
-
- PROCEDURE OpenGraph;
-
- PROCEDURE MouseOn;
-
- PROCEDURE MouseOff;
-
- PROCEDURE MouseSpeed(horRatio, verRatio : INTEGER);
-
- PROCEDURE MouseState(VAR St : INTEGER);
-
- PROCEDURE Mouse(VAR hPos, vPos, Status : INTEGER);
-
- PROCEDURE SetMouseArea(Left, Up, Right, Down : INTEGER);
-
- PROCEDURE SetMouse(hPos, vPos : INTEGER);
-
- PROCEDURE MouseClick( Button : INTEGER;
- VAR Count : INTEGER);
-
- PROCEDURE FileSelect(x, y : INTEGER; VAR fName : STRING;
- BoxName, Path, Mask : STRING;
- hg, vg : INTEGER);
-
-
- IMPLEMENTATION
-
- USES Graph, Crt, Dos;
-
- CONST
- MaxFiles = 180;
-
- VAR
- Regs : Registers;
- fName : STRING;
-
- PROCEDURE OpenGraph;
- VAR
- driver,
- Mode,
- errcode : INTEGER;
- BGIPath : STRING;
- BEGIN
- BGIPath := GetEnv('BGIPATH');
- DetectGraph(driver, Mode);
- InitGraph(driver, Mode, BGIPath);
- errcode := GraphResult;
- IF errcode <> 0 THEN BEGIN
- WriteLn('Grafiktreiber nicht gefunden!');
- WriteLn; WriteLn('Fehlercode', errcode);
- REPEAT UNTIL KeyPressed;
- Halt(errcode);
- END;
- END;
-
- PROCEDURE MouseOn;
- BEGIN (* MausCursor darstellen *)
- Regs.AX := 1;
- Intr($33, Regs);
- END;
-
- PROCEDURE MouseOff;
- BEGIN (* MausCursor löschen *)
- Regs.AX := 2;
- Intr($33, Regs);
- END;
-
- PROCEDURE MouseSpeed(horRatio, verRatio : INTEGER);
- BEGIN (* Verhältnis Mickey/Bildpunkt bestimmen *)
- Regs.AX := 15;
- Regs.CX := horRatio;
- Regs.DX := verRatio;
- Intr($33,Regs);
- END;
-
- PROCEDURE MouseState(VAR St : INTEGER);
- BEGIN (* Maus Reset *)
- Regs.AX := 0;
- Intr($33, Regs);
- St := Regs.AX; (* -1, wenn Maus nicht installiert *)
- END;
-
- PROCEDURE Mouse(VAR hPos, vPos, Status : INTEGER);
- BEGIN (* Status und Position der Maus *)
- Regs.AX := 3;
- Intr($33, Regs);
- hPos := Regs.CX;
- vPos := Regs.DX;
- Status := Regs.BX;
- END;
-
- PROCEDURE SetMouseArea(Left, Up, Right, Down : INTEGER);
- BEGIN (* Festlegen der horizontalen/vertikalen Grenze *)
- Regs.AX := 7;
- Regs.CX := Left;
- Regs.DX := Right;
- Intr($33, Regs);
- Regs.AX := 8;
- Regs.CX := Up;
- Regs.DX := Down;
- Intr($33, Regs);
- END;
-
- PROCEDURE SetMouse(hPos, vPos : INTEGER);
- BEGIN (* Position des Mauszeigers festlegen *)
- Regs.AX := 4;
- Regs.CX := hPos;
- Regs.DX := vPos;
- Intr($33, Regs);
- END;
-
- PROCEDURE MouseClick( Button : INTEGER;
- VAR Count : INTEGER);
- BEGIN (* Maustasten gedrückt *)
- Regs.AX := 5;
- Regs.BX := Button;
- Intr($33, Regs);
- Count := Regs.BX;
- END;
-
- PROCEDURE FileSelect(x, y : INTEGER; VAR fName : STRING;
- BoxName, Path, Mask : STRING;
- hg, vg : INTEGER);
- VAR
- xx, yy, k, mo, ii, i,
- FileCnt, xFile, xPos : INTEGER;
- OldPath, helpV, helpV1 : STRING;
- DirName : ARRAY [1..MaxFiles] OF
- STRING [15];
- ColorBuffer, PrKey : BYTE;
- LwC, LwD, LwE, ok, Jump : BOOLEAN;
- z, z1 : WORD;
- scroll, back : Pointer;
- DirInfo : SearchRec;
-
- FUNCTION IsDirectory : BOOLEAN;
- BEGIN
- IsDirectory := ((DosError = 0) AND
- (DirInfo.Attr = Directory) AND
- (DirInfo.Name <> '.'));
- END;
-
- FUNCTION IsArchive : BOOLEAN;
- BEGIN (* Diese Dateien werden angezeigt *)
- IsArchive := ((DosError = 0) AND
- (DirInfo.Attr = Archive));
- END;
-
- PROCEDURE Select(Path : STRING);
- VAR
- i : INTEGER;
- Name : STRING;
- BEGIN
- FileCnt := 0;
- FOR i := 1 TO MaxFiles DO DirName[i] := '';
- (* Unterverzeichnisse *)
- FindFirst(Path + '*.*', AnyFile, DirInfo);
- IF IsDirectory THEN BEGIN
- INC(FileCnt);
- DirName[FileCnt] := Chr(10) + ' ' + DirInfo.Name;
- END;
- REPEAT
- FindNext(DirInfo);
- IF IsDirectory THEN BEGIN
- INC(FileCnt);
- DirName[FileCnt] := Chr(10) + ' ' + DirInfo.Name;
- END;
- UNTIL DosError = 18; (* keine Dateien gefunden.. *)
- (* Dateinamen mit Suchmaske *)
- FindFirst(Path + Mask, AnyFile, DirInfo);
- IF IsArchive THEN BEGIN
- INC(FileCnt);
- DirName[FileCnt] := ' ' + DirInfo.Name;
- END;
- REPEAT
- FindNext(DirInfo);
- IF IsArchive THEN BEGIN
- INC(FileCnt);
- DirName[FileCnt] := ' ' + DirInfo.Name;
- END;
- UNTIL DosError = 18; (* keine Dateien gefunden.. *)
- END;
-
- PROCEDURE ShowIt;
- BEGIN (* Anzeige Laufwerk *)
- helpV1 := '';
- SetColor(vg);
- SetFillStyle(1, hg);
- Bar(x+8, y+16, x+395, y+25);
- helpV := 'Suchpfad : ' + Path + Mask;
- OutTextXY(x+10, y+16, helpV);
- Bar(x+31, y+46, x+164, y+142);
- Jump := TRUE;
- END;
-
- BEGIN (* Kontrolle, welche Laufwerke verfügbar *)
- LwC := FALSE; LwD := FALSE; LwE := FALSE;
- GetDir(0, OldPath);
- {$I-}
- ChDir('C:\'); IF IOResult <> 15 THEN LwC := TRUE;
- ChDir('D:\'); IF IOResult <> 15 THEN LwD := TRUE;
- ChDir('E:\'); IF IOResult <> 15 THEN LwE := TRUE;
- {$I+}
- ChDir(OldPath);
- IF (Path = '') OR (Path = ' ') THEN Path := FExpand('');
- IF (Mask = '') OR (Mask = ' ') THEN Mask := '*.*';
- helpV1 := '';
- fName := '';
- ok := FALSE;
- ColorBuffer := GetColor;
- MouseState(mo);
- z := ImageSize(x+35, y+59, x+160, y+138);
- GetMem(scroll, z);
- z1 := ImageSize(x, y, x+400, y+400);
- GetMem(back, z);
- GetImage(x, y, x+400, y+150, back^);
- xPos := 1;
- xFile := 1;
- SetFillStyle(1, hg);
- Bar(x, y, x+400, y+150);
- SetColor(vg);
- Rectangle(x+2, y+2, x+398, y+148);
- Rectangle(x+4, y+4, x+396, y+146);
- i := TextWidth(BoxName);
- OutTextXY(x + 200 - (i DIV 2), y+7, BoxName);
- Rectangle(x+30, y+45, x+165, y+143);
- i := TextWidth(Mask);
- i := 72 - (i DIV 2);
- OutTextXY(x+30+i, y+37, Mask);
- Rectangle(x+ 30, y+ 35, x+185, y+45);
- Rectangle(x+165, y+143, x+185, y+45);
- OutTextXY(x+172, y+ 50, Chr(30));
- OutTextXY(x+172, y+130, Chr(31));
- Rectangle(x+165, y+60, x+185, y+128);
- helpV := 'Suchpfad : ' + Path + Mask;
- OutTextXY(x+ 10, y+16, helpV);
- OutTextXY(x+200, y+26, 'Auswahl:');
- OutTextXY(x+200, y+32, ' ------------');
- OutTextXY(x+250, y+70, ' O K ');
- OutTextXY(x+250, y+90, 'Abbrechen');
- Rectangle(x+240, y+66, x+340, y+80);
- Rectangle(x+242, y+68, x+338, y+78);
- Rectangle(x+240, y+86, x+340, y+100);
- OutTextXY(x+205, y+45, 'A:'); (* LW A: *)
- Rectangle(x+195, y+40, x+225, y+55);
- Rectangle(x+193, y+38, x+227, y+57);
- OutTextXY(x+245, y+45, 'B:'); (* LW B: *)
- Rectangle(x+235, y+40, x+265, y+55);
- Rectangle(x+233, y+38, x+267, y+57);
- IF LwC THEN BEGIN
- OutTextXY(x+285, y+45, 'C:'); (* LW C: *)
- Rectangle(x+275, y+40, x+305, y+55);
- Rectangle(x+273, y+38, x+307, y+57);
- END;
- IF LwD THEN BEGIN
- OutTextXY(x+325, y+45, 'D:'); (* LW D: *)
- Rectangle(x+315, y+40, x+345, y+55);
- Rectangle(x+313, y+38, x+347, y+57);
- END;
- IF LwE THEN BEGIN
- OutTextXY(x+365, y+45, 'E:'); (* LW E: *)
- Rectangle(x+355, y+40, x+385, y+55);
- Rectangle(x+353, y+38, x+387, y+57);
- END;
- OutTextXY(x+248, y+110, 'FileSelect ');
- OutTextXY(x+210, y+122, '(c) 1991 Thorsten Huck');
- OutTextXY(x+240, y+134, ' & TOOLBOX');
- k := 0;
- REPEAT
- Jump := FALSE;
- SetColor(vg);
- Select(Path);
- FOR i := 1 TO 9 DO
- OutTextXY(x+40, y+40+(i*10), DirName[i]);
- SetFillStyle(1, vg);
- Bar(x+35, y+49, x+160, y+58);
- SetColor(hg);
- OutTextXY(x+40, y+50, DirName[1]);
- xPos := 1; xFile := 1;
- IF DirName[1,1] = Chr(10) THEN
- helpV1 := ''
- ELSE BEGIN
- helpV1 := DirName[1];
- Delete(helpV1, 1, 2);
- END;
- SetFillStyle(1, hg);
- SetColor(vg);
- Bar(x+270, y+26, x+395, y+34);
- helpV := helpV1 + Chr(219);
- OutTextXY(x+272, y+26, helpV);
- IF mo = -1 THEN MouseOn;
- IF k = 1 THEN Delay(100);
- REPEAT
- Mouse(xx, yy, k); PrKey := 0;
- IF k = 1 THEN BEGIN
- FOR i := 1 TO 9 DO
- IF (xx > x+35) AND (xx < x+160) AND
- (yy > y+39+(i*10)) AND
- (yy < y+48+(i*10)) AND (k = 1) THEN BEGIN
- IF mo = -1 THEN MouseOff;
- SetFillStyle(1, hg);
- Bar(x+ 35, y+39+(xPos*10),
- x+160, y+48+(xPos*10));
- SetColor(vg);
- OutTextXY(x+40, y+40+(xPos*10),
- DirName[xFile]);
- xFile := xFile-(xPos-i); xPos:=i;
- SetFillStyle(1, vg);
- Bar(x+ 35, y+39+(xPos*10),
- x+160, y+48+(xPos*10));
- SetColor(hg);
- OutTextXY(x+40, y+40+(xPos*10),
- DirName[xFile]);
- IF DirName[xFile,1] = Chr(10) THEN
- helpV1 := ''
- ELSE BEGIN
- helpV1 := DirName[xFile];
- Delete(helpV1, 1, 2);
- END;
- SetFillStyle(1, hg);
- SetColor(vg);
- Bar(x+270, y+26, x+395,y +34);
- helpV := helpV1 + Chr(219);
- OutTextXY(x+272, y+26, helpV);
- IF k = 1 THEN MouseClick(0, ii);
- IF mo = -1 THEN MouseOn;
- Delay(200);
- IF k = 1 THEN BEGIN
- MouseClick(0, ii);
- IF ii > 0 THEN ok := TRUE;
- END;
- END;
- END;
- IF KeyPressed OR (k <> 0) THEN BEGIN
- IF k = 0 THEN PrKey := Ord(ReadKey);
- IF (PrKey = 13) OR
- ((xx > x+240) AND (xx < x+340) AND
- (yy > y+ 66) AND (yy < y+ 80) AND
- (k = 1)) OR ok THEN BEGIN
- IF helpV1 <> '' THEN BEGIN
- fName := Path + helpV1;
- DirName[xFile,1] := ' ';
- END;
- IF DirName[xFile,1] = Chr(10) THEN BEGIN
- IF (DirName[xFile,3] = '.') AND
- (DirName[xFile,4] = '.') THEN BEGIN
- i := Length(Path);
- Delete(Path, i, 1);
- REPEAT
- DEC(i); Delete(Path, i, 1);
- UNTIL Path[i-1] = '\';
- END ELSE BEGIN
- Delete(DirName[xFile], 1, 2);
- Path := Path + DirName[xFile] + '\';
- END;
- SetFillStyle(1, hg);
- IF mo = -1 THEN MouseOff;
- Bar(x+31, y+46, x+164, y+142);
- helpV := 'Suchpfad :' + Path + Mask;
- SetColor(vg);
- Bar(x+8, y+16, x+395, y+25);
- OutTextXY(x+10, y+16, helpV);
- ok := FALSE; helpV1 := ''; Jump := TRUE;
- END;
- END;
- IF (PrKey IN [32..90, 92, 95, 97..122]) AND
- (Length(helpV1) < 12) THEN BEGIN
- SetFillStyle(1, hg);
- helpV1 := helpV1 + Chr(PrKey);
- SetColor(vg);
- Bar(x+270, y+26, x+395, y+34);
- helpV := helpV1 + Chr(219);
- OutTextXY(x+272, y+26, helpV);
- END;
- IF (PrKey = 8) AND (Length(helpV1) > 0) THEN BEGIN
- SetFillStyle(1, hg);
- Delete(helpV1, Length(helpV1), 1);
- SetColor(vg);
- Bar(x+270, y+26, x+395, y+34);
- helpV := helpV1 + Chr(219);
- OutTextXY(x+272, y+26, helpV);
- END;
- IF (PrKey = 0) OR (k <> 0) THEN BEGIN
- IF k = 0 THEN PrKey := Ord(ReadKey);
- IF (PrKey = 59) OR
- ((xx > x+195) AND (xx < x+225) AND
- (yy > y+ 40) AND (yy < y+ 55) AND
- (k = 1)) THEN BEGIN
- Path := 'A:\'; ShowIt;
- END;
- IF (PrKey = 60) OR
- ((xx > x+235) AND (xx < x+265) AND
- (yy > y+ 40) AND (yy < y+ 55) AND
- (k = 1)) THEN BEGIN
- Path := 'B:\'; ShowIt;
- END;
- IF ((PrKey = 61) OR
- ((xx > x+275) AND (xx < x+305) AND
- (yy > y+ 40) AND (yy < y+ 55) AND
- (k = 1))) AND LwC THEN BEGIN
- Path := 'C:\'; ShowIt;
- END;
- IF ((PrKey = 62) OR
- ((xx > x+315) AND (xx < x+345) AND
- (yy > y+ 40) AND (yy < y+ 55) AND
- (k = 1))) AND LwD THEN BEGIN
- Path := 'D:\'; ShowIt;
- END;
- IF ((PrKey = 63) OR
- ((xx > x+355) AND (xx < x+385) AND
- (yy > y+ 40) AND (yy < y+ 55) AND
- (k = 1))) AND LwE THEN BEGIN
- Path := 'E:\'; ShowIt;
- END;
- IF ((PrKey = 80) AND (xFile < FileCnt)) OR
- ((xx > x+165) AND (xx < x+185) AND
- (yy > y+128) AND (yy < y+143) AND
- (k = 1) AND (xFile < FileCnt)) THEN BEGIN
- IF mo = -1 THEN MouseOff;
- SetFillStyle(1, hg);
- Bar(x+ 35, y+39+(xPos*10),
- x+160, y+48+(xPos*10));
- SetColor(vg);
- OutTextXY(x+40, y+40+(xPos*10),
- DirName[xFile]);
- INC(xFile);
- IF xPos < 9 THEN
- INC(xPos)
- ELSE BEGIN
- GetImage(x+35, y+59, x+160, y+138, scroll^);
- PutImage(x+35, y+49, scroll^, 0);
- END;
- SetFillStyle(1, vg);
- Bar(x+ 35, y+39+(xPos*10),
- x+160, y+48+(xPos*10));
- SetColor(hg);
- OutTextXY(x+40, y+40+(xPos*10),
- DirName[xFile]);
- IF DirName[xFile,1] = Chr(10) THEN
- helpV1 := ''
- ELSE BEGIN
- helpV1 := DirName[xFile];
- Delete(helpV1, 1, 2);
- END;
- SetFillStyle(1, hg);
- SetColor(vg);
- Bar(x+270, y+26, x+395, y+34);
- helpV := helpV1 + Chr(219);
- OutTextXY(x+272, y+26, helpV);
- IF mo = -1 THEN MouseOn;
- IF k <> 0 THEN Delay(35);
- END;
- IF ((PrKey = 72) AND (xFile > 1)) OR
- ((xx > x+165) AND (xx < x+185) AND
- (yy > y+ 45) AND (yy < y+ 60) AND
- (k = 1) AND (xFile > 1))THEN BEGIN
- IF mo = -1 THEN MouseOff;
- SetFillStyle(1, hg);
- Bar(x+ 35, y+39+(xPos*10),
- x+160, y+48+(xPos*10));
- SetColor(vg);
- OutTextXY(x+40, y+40+(xPos*10),
- DirName[xFile]);
- DEC(xFile);
- IF xPos > 1 THEN
- DEC(xPos)
- ELSE BEGIN
- GetImage(x+35, y+49, x+160, y+128, scroll^);
- PutImage(x+35,y+59,scroll^,0);
- END;
- SetFillStyle(1, vg);
- Bar(x+ 35, y+39+(xPos*10),
- x+160, y+48+(xPos*10));
- SetColor(hg);
- OutTextXY(x+40, y+40+(xPos*10),
- DirName[xFile]);
- IF DirName[xFile,1] = Chr(10) THEN
- helpV1 := ''
- ELSE BEGIN
- helpV1 := DirName[xFile];
- Delete(helpV1, 1, 2);
- END;
- SetFillStyle(1, hg);
- SetColor(vg);
- Bar(x+270, y+26, x+395, y+34);
- helpV := helpV1 + Chr(219);
- OutTextXY(x+272, y+26, helpV);
- IF mo = -1 THEN MouseOn;
- IF k <> 0 THEN Delay(35);
- END;
- END;
- END;
- UNTIL (PrKey = 27) OR
- ((xx > x+240) AND (xx < x+340) AND
- (yy > y+ 86) AND (yy < y+100) AND (k = 1)) OR
- (fName <> '') OR Jump;
- UNTIL NOT Jump;
- IF mo = -1 THEN MouseOff;
- PutImage(x, y, back^, 0);
- FreeMem(back, z1);
- FreeMem(scroll, z);
- IF mo = -1 THEN MouseOn;
- PrKey := 0;
- SetColor(ColorBuffer);
- END;
-
- END.
- (* ------------------------------------------------------ *)
- (* Ende von FILEBOX.PAS *)
-