home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / dos / window / winedit / beispiel.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-07-28  |  29.6 KB  |  1,172 lines

  1. (*
  2. Das nachfolgende Beispiel verdeutlicht das Zusammenwirken
  3. der einzelnen Komponenten der WINEDIT-Anwenderschnittstelle.
  4.  
  5. Auf eine Fehlerüberprüfung nach Aufruf von WINEDIT-Funktionen
  6. wurde der Übersicht halber weitgehend verzichtet.
  7.  
  8. Zur Nutzbarmachung der WINEDIT-Routinen ist ein entsprechendes
  9. Unit vorhanden:
  10.  
  11.    W_TBP_40.TPU  wenn mit TURBO 4.0,
  12.    W_TBP_47.TPU  wenn mit TURBO 4.0 + 8087,
  13.    W_TBP_50.TPU  wenn mit TURBO 5.0 und
  14.    W_TBP_55.TPU  wenn mit TURBO 5.5 gearbeitet wird.
  15.  
  16. Eventuell ist die USES-Anweisung in diesem Quelltext
  17. entsprechend der verwendeten Version zu ändern.
  18.  
  19. Häufigste Fehlerursachen sind erfahrungsgemäß
  20.  
  21. - falscher Dateiname beim Laden einer Maskendatei mit w_load
  22.  
  23. - nicht ausreichend verfügbarer Speicherplatz beim Laden oder
  24.   Öffnen einer Maske;
  25.   es sollte überprüft werden, ob z.B. durch  Unterbinden des
  26.   Anlegens virtueller Bilder bei Aufruf von w_load Speicher
  27.   gespart werden kann.
  28.   Es sollten selten benutzte Masken erst bei Bedarf geladen
  29.   und anschließend mit w_erase(..) sofort wieder gelöscht werden.
  30.  
  31. - das vielfache Laden ein und derselben Maske dadurch, daß der
  32.   Ladevorgang erst bei Bedarf z.B. in einem Unterprogramm erfolgt,
  33.   ein Löschen der Maske mit w_erase(..) jedoch bei Verlassen des
  34.   Unterprogramms nicht erfolgt. Es ist durchaus zulässig, eine
  35.   Maske mehrfach zu laden; nur ist irgendwann unweigerlich der
  36.   Speicher voll.
  37.  
  38. - ein zu kleiner Stackbereich des Programms;
  39.  
  40.  
  41. Im Beispielprogramm werden die einzelnen Masken erst bei Bedarf
  42. zugeladen und anschließend wieder gelöscht. Möglich wäre natürlich
  43. auch, alle Masken am Anfang des Programms einmalig zu Laden; dadurch
  44. werden Verzögerungszeiten beim Nachladen vermieden, der Speicherbedarf
  45. ist jedoch um einiges größer.
  46.  
  47. Um die Wirkung der Konfigurationsfunktionen zu w_switch(..) zu
  48. ergründen, empfiehlt sich ein Herumspielen an diesen und
  49. anschließendem Betrachten der Ergebnisse;
  50. *)
  51.  
  52. program beispiel;
  53.  
  54.  
  55.  
  56. uses dos,W_TBP_55; (* Für andere Versionen entsprechen abändern *)
  57. (*
  58. Das Unit W_TBP_55.TPU ist somit dem Programm verfügbar
  59. *)
  60.  
  61. var
  62.     hm        :integer;     (* Maskenreferenz für das Hauptmenü *)
  63.     s         :string;      (* Hilfsvariable *)
  64.     ret       :integer;     (* Returnwert der WINEDIT-Funktionen *)
  65.  
  66.  
  67.  
  68. procedure menue;
  69. (****************************************************************************
  70. Baut eine 3-stufige Menü-Hirachie auf;
  71. ****************************************************************************)
  72. var
  73.    i,s,ok0,ok1,ok2:integer;
  74.    m              :array[0..9] of integer;  (*Maskenreferenzen*)
  75. begin
  76.  
  77. m[ 0]:=w_load('m0-00.msk',1);
  78. m[ 1]:=w_load('m1-00.msk',1);
  79. m[ 2]:=w_load('m1-01.msk',1);
  80. m[ 3]:=w_load('m1-02.msk',1);
  81. m[ 4]:=w_load('m1-03.msk',1);
  82. m[ 5]:=w_load('m1-04.msk',1);
  83. m[ 6]:=w_load('m2-00.msk',1);
  84. m[ 7]:=w_load('m2-01.msk',1);
  85. m[ 8]:=w_load('m2-02.msk',1);
  86. m[ 9]:=w_load('m2-03.msk',1);
  87. (*
  88. Alle Menüs und Untermenüs laden
  89. *)
  90.  
  91. for i:=0 to 9 do
  92.     if m[i] < 0 then
  93.         begin
  94.         writeln('Fehler ',w_error,' beim Laden von Nummer :',i);
  95.         ret:=w_deinit;
  96.         halt(1);
  97.         end;
  98.  
  99.  
  100. for s:=0 to 9 do
  101.     begin
  102.     ret:=w_switch_mouse_cr(m[s],1);
  103.     ret:=w_switch_mouse_esc(m[s],1);
  104.     end;
  105. (*
  106. Hier wird die w_switch(..) so konfiguriert, daß lediglich durch
  107. Positionierung des Mauszeigers eine Anwahl erfolgt.
  108. Weiter ist das Verlassen eines Untermenüs über beliebige
  109. Menü-Hirachien hinweg mittels Mauszeiger möglich.
  110.  
  111. Der Wert dieser Funktionen läß sich am besten erfahren, in dem
  112. man sie testweise entfernt.
  113. *)
  114.  
  115.  
  116. if w_open(m[0])=0 then
  117.     begin
  118.     writeln('Fehler ',w_error,' beim Öffnen ');
  119.     ret:=w_deinit;
  120.     halt(1);
  121.     end;
  122. (*
  123. So könnte eine Fehlermeldung aussehen
  124. *)
  125.  
  126.  
  127. repeat
  128.     ok0:=0;
  129.     s:=w_switch(m[0]);                                     (* Menü-Stufe 1 *)
  130.     case s of
  131.         0:
  132.             begin
  133.             ret:=w_open(m[s+1]);
  134.             ok1:=0;
  135.             repeat
  136.                 case w_switch(m[s+1]) of                   (* Menü-Stufe 2 *)
  137.                     0:
  138.                         begin
  139.                         ret:=w_open(m[6]);
  140.                         ok2:=0;
  141.                         repeat
  142.                             case w_switch(m[6]) of         (* Menü-Stufe 3 *)
  143.                                  0:
  144.                                     ;
  145.                                     (*
  146.                                     Hier und folgend sind
  147.                                     die anwählbaren Aktionen
  148.                                     einzusetzen
  149.                                     *)
  150.                                  1:
  151.                                     ;
  152.                                  2:
  153.                                     ;
  154.                                  -1:
  155.                                     ok2:=1;
  156.                                 else
  157.                                     ;
  158.                             end
  159.                         until ok2=1;
  160.                         ret:=w_close;
  161.                         end;
  162.                     1:
  163.                         begin
  164.                         ret:=w_open(m[7]);
  165.                         ok2:=0;
  166.                         repeat
  167.                             case w_switch(m[7]) of
  168.                                  0:
  169.                                     ;
  170.                                     (*
  171.                                     Hier und folgend sind
  172.                                     die anwählbaren Aktionen
  173.                                     einzusetzen
  174.                                     *)
  175.                                  1:
  176.                                     ;
  177.                                  2:
  178.                                     ;
  179.                                  -1:
  180.                                     ok2:=1;
  181.                                 else
  182.                                     ;
  183.                             end
  184.                         until ok2=1;
  185.                         ret:=w_close;
  186.                         end;
  187.                     2:
  188.                         begin
  189.                         ret:=w_open(m[8]);
  190.                         ok2:=0;
  191.                         repeat
  192.                             case w_switch(m[8]) of
  193.                                  0:
  194.                                     ;
  195.                                     (*
  196.                                     Hier und folgend sind
  197.                                     die anwählbaren Aktionen
  198.                                     einzusetzen
  199.                                     *)
  200.                                  1:
  201.                                     ;
  202.                                  2:
  203.                                     ;
  204.                                  -1:
  205.                                     ok2:=1;
  206.                                 else
  207.                                     ;
  208.                             end
  209.                         until ok2=1;
  210.                         ret:=w_close;
  211.                         end;
  212.                     3:
  213.                         begin
  214.                         ret:=w_open(m[9]);
  215.                         ok2:=0;
  216.                         repeat
  217.                             case w_switch(m[9]) of
  218.                                  0:
  219.                                     ;
  220.                                     (*
  221.                                     Hier und folgend sind
  222.                                     die anwählbaren Aktionen
  223.                                     einzusetzen
  224.                                     *)
  225.                                  1:
  226.                                     ;
  227.                                  2:
  228.                                     ;
  229.                                  -1:
  230.                                     ok2:=1;
  231.                                 else
  232.                                     ;
  233.                             end
  234.                         until ok2=1;
  235.                         ret:=w_close;
  236.                         end;
  237.                     4:
  238.                         ;
  239.                     -1:
  240.                         ok1:=1;
  241.                     else
  242.                         ;
  243.                 end
  244.             until ok1=1;
  245.             ret:=w_close;
  246.             end;
  247.         1:
  248.             begin
  249.             ret:=w_open(m[s+1]);
  250.             ok1:=0;
  251.             repeat
  252.                 case w_switch(m[s+1]) of
  253.                     0,1,2,3,4,5:
  254.                         begin
  255.                         ;
  256.                         (* Hier sind ggf. Aktionen einzufügen *)
  257.                         end;
  258.                     -1:
  259.                         ok1:=1;
  260.                     else
  261.                         ;
  262.                 end
  263.             until ok1=1;
  264.             ret:=w_close;
  265.             end;
  266.         2:
  267.             begin
  268.             ret:=w_open(m[s+1]);
  269.             ok1:=0;
  270.             repeat
  271.                 case w_switch(m[s+1]) of
  272.                     0,1,2,3,4,5:
  273.                         begin
  274.                         ;
  275.                         (* Hier sind ggf. Aktionen einzufügen *)
  276.                         end;
  277.                     -1:
  278.                         ok1:=1;
  279.                     else
  280.                         ;
  281.                 end
  282.             until ok1=1;
  283.             ret:=w_close;
  284.             end;
  285.         3:
  286.             begin
  287.             ret:=w_open(m[s+1]);
  288.             ok1:=0;
  289.             repeat
  290.                 case w_switch(m[s+1]) of
  291.                     0,1,2,3,4,5:
  292.                         begin
  293.                         ;
  294.                         (* Hier sind ggf. Aktionen einzufügen *)
  295.                         end;
  296.                     -1:
  297.                         ok1:=1;
  298.                     else
  299.                         ;
  300.                 end
  301.             until ok1=1;
  302.             ret:=w_close;
  303.             end;
  304.         4:
  305.             begin
  306.             ret:=w_open(m[s+1]);
  307.             ok1:=0;
  308.             repeat
  309.                 case w_switch(m[s+1]) of
  310.                     0,1,2,3,4,5:
  311.                         begin
  312.                         ;
  313.                         (* Hier sind ggf. Aktionen einzufügen *)
  314.                         end;
  315.                     -1:
  316.                         ok1:=1;
  317.                     else
  318.                         ;
  319.                 end
  320.             until ok1=1;
  321.             ret:=w_close;
  322.             end;
  323.         -1:
  324.             ok0:=1;
  325.         else
  326.             ;
  327.     end;
  328. until ok0=1;
  329. ret:=w_close;
  330. for i:=0 to 9 do
  331.     ret:=w_erase(m[i]);
  332. end;
  333.  
  334.  
  335.  
  336. procedure hilfe;
  337. (****************************************************************************
  338. Gibt verschiedene Hilstexte zu diesem Beispielprogramm aus
  339. ****************************************************************************)
  340. var
  341.      i,s,ok,akt    :integer;
  342.      m             :array[0..5] of integer;
  343.  
  344. begin
  345.  
  346.  
  347. m[ 0]:=w_load('h0.msk',1);
  348. m[ 1]:=w_load('h1.msk',1);
  349. m[ 2]:=w_load('h2.msk',1);
  350. m[ 3]:=w_load('h3.msk',1);
  351. m[ 4]:=w_load('h4.msk',1);
  352.  
  353. for i:=0 to 4 do
  354.     if m[i] < 0 then
  355.         begin
  356.         writeln('\nFehler beim Laden von Nummer ',i);
  357.         ret:=w_deinit;
  358.         halt(1);
  359.         end;
  360.  
  361.  
  362. akt:=0;
  363. ok:=0;
  364. repeat
  365.     ret:=w_open(m[akt]);
  366.     s:=w_switch(m[akt]);
  367.     case s of
  368.         0,1,2,3:
  369.             begin
  370.             if s >= akt then
  371.                akt:=s+1
  372.             else
  373.                akt:=s;
  374.             ret:=w_close;
  375.             end;
  376.         -1:
  377.             begin
  378.             ret:=w_close;
  379.             ok:=1;
  380.             end;
  381.  
  382.         else
  383.             ;
  384.     end;
  385. until ok=1;
  386.  
  387. for i:=0 to 4 do
  388.     ret:=w_erase(m[i]);
  389. end;
  390.  
  391.  
  392.  
  393. function ascii_waehlen:char;
  394. (****************************************************************************
  395. Bringt eine ASCII-Tabelle zur Anzeige und ermöglicht die Auswahl eines
  396. Zeichens
  397. ****************************************************************************)
  398. var
  399.     i,m :integer;
  400.  
  401. begin
  402. m:=w_load('ascii.msk',1);
  403. (*
  404. Maske von Platte laden
  405. *)
  406.  
  407. ret:=w_switch_matrix(m,1,0,0,0,0);
  408. (*
  409. Beschleunigte Anwahl wegen Maxtrix-artiger Anordnung
  410. der Positionen möglich; Dies ist nur bei einer großen
  411. Anzahl an Positionen relevant.
  412. Entfernt man diesen Aufruf, so wird man einen
  413. Zeitverzug nach Aufruf von w_switch bemerken.
  414. In dieser Zeit wird dann die Anordnung
  415. der einzelnen Anwahlpositionen zueinander überprüft.
  416. *)
  417.  
  418. ret:=w_open(m);
  419. (*
  420. Maske ausgeben auf Schirm
  421. *)
  422.  
  423. i:=w_switch(m);
  424. (*
  425. Auswahl durchführen
  426. *)
  427.  
  428. ret:=w_close;
  429. (*
  430. Maske vom Schirm nehmen
  431. *)
  432.  
  433. ret:=w_erase(m);
  434. (*
  435. Da die Maske bei jedem Unterprogrammaufruf neu geladen wird,
  436. muß sie natürlich bei verlassen des Unterprogramms gelöscht
  437. werden
  438. *)
  439.  
  440. if i >= 0 then
  441.     i:=i+32;
  442.  
  443. ascii_waehlen:=char(i);
  444. end;
  445.  
  446.  
  447.  
  448. function attribut_waehlen(altes_attribut:byte):byte;
  449. (****************************************************************************
  450. Ermöglicht die Auswahl eines der 256 Bildschirmattribute
  451. ****************************************************************************)
  452. var
  453.     i,m:integer;
  454.  
  455. begin
  456. m:=w_load('attrib.msk',1);
  457.  
  458. ret:=w_switch_mark_mode(m,1);
  459. (*
  460. Markierung der Anwahlpositionen mit Pfeilen
  461. statt mit Attribut
  462. *)
  463.  
  464. ret:=w_switch_pos(m,integer(altes_attribut));
  465. (*
  466. Bei Start markierte Position setzen;
  467. normalerweise wird bei Position 0 begonnen,
  468. hier nun bei Position altes_attribut
  469. *)
  470.  
  471. ret:=w_switch_matrix(m,1,0,0,0,0);
  472. ret:=w_open(m);
  473. i:=w_switch(m);
  474. ret:=w_close;
  475. ret:=w_erase(m);
  476. attribut_waehlen:=byte(i);
  477. end;
  478.  
  479.  
  480.  
  481.  
  482. function datei_menue(var name:string;mode:integer):integer;
  483. (***************************************************************************
  484. Bringt eine Maske auf den Bildschirm, in der eine Datei angewählt werden
  485. kann.
  486. ***************************************************************************)
  487. const
  488.     FELDER   =    40;   (* Felder der Maske*)
  489.     SPALTEN  =     4;   (* Felder pro Zeile der Maske *)
  490.     DATEIEN  =   256;   (* Maximum an einlesbaren Dateien, erweiterbar ! *)
  491.  
  492. var
  493.    merkmal     : searchrec;
  494.    i           : integer;
  495.    newdir      : integer;           (*Neues Directory wurde angewaehlt*)
  496.    anzfile     : integer;           (*Summe der Dateien im Pfad*)
  497.    ok          : integer;             (*Schleifendeterminator*)
  498.    aktpos      : integer;             (*Aktuelle Dateinummer*)
  499.    viewpos     : integer;             (*Aktuelles Feld in der Maske*)
  500.    wechsel     : integer;             (*Kontrolliert Maskenrefresh*)
  501.    taste       : integer;
  502.    anzahl      : integer;             (*Dateien + Subdirectories im Pfad*)
  503.    scroll      : integer;             (*Anzahl der (gescrollten Zeilen)*SPALTEN*)
  504.    maske       : integer;             (*Maskenreferenznummer*)
  505.  
  506.    dateiname   : array[0..DATEIEN] of string[13];   (*Speichert die Dateinamen*)
  507.  
  508.    pfad1        : string;             (*Vollständiger Pfad mit *.* *)
  509.    pfad2        : string;             (*Vollständiger Pfad mit Filemaske*)
  510.    buffer       : string;
  511.  
  512.  
  513.  
  514.  
  515. function strequal(s1,s2:string;n:byte):boolean;
  516. (*
  517. Stringvergleich auf n Zeichen
  518. *)
  519. var
  520.     i:integer;
  521.  
  522. begin
  523. for i:=1 to n do
  524.     if s1[i]<>s2[i] then
  525.         begin
  526.         strequal:=false;
  527.         exit;
  528.         end;
  529. strequal:=true;
  530. end;
  531.  
  532.  
  533.  
  534. procedure struppr(var s:string);
  535. (*
  536. Wandelt zu Großbuchstaben
  537. *)
  538. var
  539.     i:integer;
  540. begin
  541.  
  542. for i:=1 to length(s) do
  543.     if (s[i]>= 'a') and (s[i] <= 'z') then
  544.         s[i]:=char(byte (s[i]) - (32));
  545. end;
  546.  
  547.  
  548. function lastpos(s:string;c:char):byte;
  549. (*
  550. Findet letztes c in s
  551. *)
  552. var
  553.     i  :integer;
  554. begin
  555. i:=length(s)+1;
  556. repeat
  557.     i:=i-1;
  558. until (i=0) or (s[i]='\') ;
  559. lastpos:=byte(i);
  560. end;
  561.  
  562.  
  563. procedure fullpath(var s:string;var dest:string);
  564. (*
  565. Verfolständigt eine relative Pfadangabe
  566. *)
  567. var
  568.     dir   :string;
  569.     drive :byte;
  570.     d     :string;
  571. begin
  572.  
  573. struppr(s);
  574.  
  575.  
  576. (*Laufwerk ermitteln*)
  577.  
  578. if (length(s) < 2) or (s[2] <> ':') then
  579.     (*
  580.     Default-Laufwerk
  581.     *)
  582.     begin
  583.     drive:=0;
  584.     getdir(drive,d);
  585.     d[0]:=char(2);
  586.     d:=d+s;
  587.     end
  588. else
  589.     begin
  590.     drive:=byte(s[1]) - 64;
  591.     d:=s;
  592.     end;
  593.  
  594. (*
  595. Das Laufwerk ist ergänzt worden;
  596. nun ist die vollständige Pfadbezeichnung herzustellen
  597. *)
  598. getdir(drive,dir);
  599. if dir[length(dir)] <> '\' then
  600.     dir:=dir + '\';
  601.  
  602. if ( length(d) > 2 ) and ( d[3] <> '\' )   then
  603.     begin
  604.     (*
  605.     Aktueller Pfad ist zu ergänzen
  606.     *)
  607.     d[0]:=char(length(d)-2);
  608.     move(d[3],d[1],length(d));
  609.     d:=dir +  d;
  610.     end
  611. else if length(d)=2 then
  612.     begin
  613.     d:= dir;
  614.     end;
  615.  
  616. dest:=d;
  617. end;
  618.  
  619.  
  620.  
  621. procedure minpath(var s:string);
  622. (*
  623. Erzeugt, wenn möglich, eine verkürzte relative Pfadangabe
  624. *)
  625.  
  626. var
  627.     dir   :string;
  628.     drive :byte;
  629.     off,l :integer;
  630. begin
  631.  
  632. struppr(s);
  633. drive:=0;
  634. getdir(drive,dir);
  635. if dir[1]<>s[1] then
  636.     begin
  637.     (*
  638.     Laufwerk ist nicht aktuelles Laufwerk
  639.     *)
  640.     drive:=byte(s[1]) - 64;
  641.     getdir(drive,dir);
  642.     end;
  643.  
  644. off:=1;
  645. if dir[length(dir)] <> '\' then
  646.     off:=2;
  647.  
  648. if strequal(dir,s,length(dir)) then
  649.     begin
  650.     if drive = 0 then
  651.         begin
  652.         (*
  653.         Laufwerk und Pfad
  654.         *)
  655.         l:=length(s)-length(dir)+1-off ;
  656.         move(s[length(dir)+off],s[1],l);
  657.         s[0]:=char(l);
  658.         end
  659.     else
  660.         begin
  661.         (*
  662.         Laufwerk muß angegeben werden
  663.         *)
  664.         l:=length(s)-length(dir)+3-off;
  665.         move(s[length(dir)+off],s[3],l-2);
  666.         s[0]:=char(l);
  667.         end
  668.     end
  669. else if drive=0 then
  670.     begin
  671.     (*
  672.     Laufwerksbuchstabe kann entfallen
  673.     *)
  674.     l:=length(s)-2;
  675.     move(s[3],s[1],l);
  676.     s[0]:=char(l);
  677.     end
  678. end;
  679.  
  680.  
  681.  
  682.  
  683. procedure cdnext(var dir:string;sdir:string);
  684. (*
  685. Ergänzt den Namen eines Unterverzeichnisses
  686. in einem kompletten Pfad
  687. *)
  688. begin
  689. insert(sdir,dir,lastpos(dir,'\')+1);
  690. end;
  691.  
  692.  
  693. procedure cdback(var dir:string);
  694. (*
  695. Schneidet den Namen eines Unterverzeichnisses
  696. *)
  697. var
  698.     l1,l2:byte;
  699.     l:integer;
  700. begin
  701.  
  702. l1:=lastpos(dir,'\');
  703.  
  704. if l1 > 0 then
  705.     begin
  706.     l:=length(dir);
  707.     dir[0]:=char(l1-1);
  708.     l2:=lastpos(dir,'\');
  709.     if l2 <> 0 then
  710.         begin
  711.         dir[0]:=char(l-l1+l2);
  712.         move(dir[l1],dir[l2],l-l1+1);
  713.         end
  714.     else
  715.         dir[0]:=char(l);
  716.     end;
  717. end;
  718.  
  719.  
  720. procedure cdroot(var dir:string);
  721. (*
  722. Schneidet die Unterverzeichnisse ab
  723. *)
  724. var
  725.     l1,l2:byte;
  726.     l:integer;
  727. begin
  728.  
  729. l1:=lastpos(dir,'\');
  730.  
  731. if l1 > 0 then
  732.     begin
  733.     l:=length(dir);
  734.     l2:=pos('\',dir);
  735.  
  736.     if l2 <> 0 then
  737.         begin
  738.         dir[0]:=char(l-l1+l2);
  739.         move(dir[l1],dir[l2],l-l1+1);
  740.         end
  741.     end;
  742. end;
  743.  
  744.  
  745. procedure setfname(var s:string;fname:string);
  746. (*
  747. Setzt den angegebenen Dateinamen in den Pfad s ein
  748. *)
  749. var
  750.     l:byte;
  751. begin
  752. l:=lastpos(s,'\');
  753. if l > 0 then
  754.     begin
  755.     s[0]:=char(l);
  756.     s:=s + fname;
  757.     end;
  758. end;
  759.  
  760.  
  761.  
  762. procedure vshow;
  763. (*
  764. Neue Feld-Belegung auf den virtuellen Schirm ausgeben
  765. *)
  766. var
  767.     j,k:integer;
  768. begin
  769. if(anzahl-scroll)<FELDER then
  770.     k:=anzahl-scroll-1
  771. else
  772.     k:=FELDER-1;
  773.  
  774. for j:=0 to k do
  775.     begin
  776.     ret:=w_vout_str(maske,j,dateiname[j+1+scroll]);
  777.     end;
  778.  
  779. (*Rest löschen*)
  780.  
  781. for j:=(anzahl-scroll) to FELDER-1 do
  782.     begin
  783.     ret:=w_vout_str(maske,j,'            ');
  784.     end;
  785.  
  786. end;
  787.  
  788.  
  789.  
  790.  
  791. begin
  792. newdir :=1;
  793. ok     :=0;
  794. aktpos :=0;
  795. viewpos:=0;
  796. wechsel:=1;
  797. anzahl :=0;
  798. scroll :=0;
  799.  
  800. (*
  801. Maskenbeschreibung wird aus einer Datei in den Speicher geladen;
  802. Der zweite Parameter mit dem Wert 0 bewirkt, daß zu dieser Maske
  803. ein virtueller Bildschirm angelegt wird.
  804. *)
  805.  
  806. maske:=w_load('file.msk',0);
  807. if  maske < 0 then
  808.     begin
  809.     writeln('\nFehler %d beim Laden der Maske file.msk',w_error);
  810.     ret:=w_deinit;
  811.     halt(1);
  812.     end;
  813.  
  814.  
  815. ret:=w_switch_matrix(maske,1,1,1,1,1);
  816. (*
  817. -  Matrix-artige Anordnung
  818. -  Bei Cursorbewegungen über die Kanten der Maske hinaus
  819.    Abbruch der Funktion w_switch(..). Dies ist zur
  820.    Realisierung einer Scroll-Funktion sinnvoll.
  821. *)
  822.  
  823.  
  824. ret:=w_switch_break_on_key(maske,2);
  825.  
  826. ret:=w_open(maske);
  827.  
  828. buffer:=name;
  829.  
  830. while true do
  831.     begin
  832.  
  833.     (*
  834.     Dateiname bzw. Maske einlesen
  835.     *)
  836.     ret:=w_in_break_on_key(1);
  837.     ret:=w_in_str(maske,40,255,buffer,'');
  838.     taste:=w_in_last_key;
  839.     if (ret = -1) or ((ret=-2)and(taste=MOUSE_R_B))  then
  840.         begin
  841.         ret:=w_close;
  842.         ret:=w_erase(maske);
  843.         datei_menue:=0;
  844.         exit;
  845.         end;
  846.  
  847.     struppr(buffer);
  848.  
  849.     (*
  850.     Komplette Pfadbezeichnung in pfad2
  851.     *)
  852.     fullpath(buffer,pfad2);
  853.  
  854.     newdir:=1;
  855.     while newdir=1 do
  856.         begin
  857.         wechsel:=1;
  858.         for i:=0 to FELDER-1 do
  859.            (*
  860.            Felder löschen
  861.            *)
  862.            begin
  863.            ret:=w_vout_str(maske,i,'            ');
  864.            end;
  865.         ret:=w_switch_pos(maske,0);
  866.  
  867.         pfad1:=pfad2;
  868.         setfname(pfad1,'*.*');
  869.  
  870.         anzahl:=0;
  871.  
  872.         findfirst(pfad2,archive,merkmal);
  873.         while (doserror=0) and (anzahl<(DATEIEN-4)) do
  874.             begin
  875.             anzahl:=anzahl+1;
  876.             dateiname[anzahl]:=merkmal.name;
  877.             findnext(merkmal);
  878.             end;
  879.  
  880.         anzfile:=anzahl;
  881.  
  882.         findfirst(pfad2,directory,merkmal);
  883.         while (doserror=0) and (anzahl<(DATEIEN-2)) and (mode<>0) do
  884.             begin
  885.             if merkmal.attr = directory then
  886.                 begin
  887.                 anzahl:=anzahl+1;
  888.                 dateiname[anzahl]:=merkmal.name+'\';
  889.                 end;
  890.             findnext(merkmal);
  891.             end;
  892.  
  893.         if anzahl=0  then
  894.             begin
  895.             taste:=0;
  896.             ret:=w_close;
  897.             ret:=w_erase(maske);
  898.             datei_menue:=-1;
  899.             exit;
  900.             end;
  901.  
  902.  
  903.         ret:=w_vout_str(maske,40,pfad2);
  904.  
  905.         i:=0;
  906.  
  907.         while (i<anzahl) and (i<FELDER) do
  908.            begin
  909.            ret:=w_vout_str(maske,i,dateiname[i+1]);
  910.            i:=i+1;
  911.            end;
  912.         ret:=w_vout(maske);
  913.         taste:=0;
  914.         scroll:=0;
  915.         ok:=0;
  916.         repeat
  917.  
  918.             if scroll > 0 then
  919.                 ret:=w_vout_str(maske,41,' ZURÜCK ')
  920.             else
  921.                 ret:=w_vout_str(maske,41,'        ');
  922.  
  923.             if (scroll+FELDER) < anzahl then
  924.                 ret:=w_vout_str(maske,42,'  VOR   ')
  925.             else
  926.                 ret:=w_vout_str(maske,42,'        ');
  927.  
  928.             i:=anzahl-scroll-1;
  929.             if i>=FELDER then
  930.                 i:=FELDER-1;
  931.             ret:=w_switch_range(maske,0,i);
  932.             if wechsel=1 then
  933.                 begin
  934.                 ret:=w_vout(maske);
  935.                 wechsel:=0;
  936.                 end;
  937.  
  938.             i:=w_switch(maske);
  939.             case i of
  940.                 -1:
  941.                     begin
  942.                     taste:=KEY_ESC;
  943.                     ok:=1;
  944.                     end;
  945.                 -2:
  946.                     begin
  947.                     taste:=w_switch_last_key(maske);
  948.                     viewpos:=w_switch_pos(maske,-1);
  949.                     case taste of
  950.                         MOUSE_L_B,
  951.                         KEY_PGUP,
  952.                         KEY_PGDN:
  953.                             begin
  954.                             if (w_xyon_field(maske,w_mouse_cur_x,w_mouse_cur_y)=41) or (taste=KEY_PGUP) then
  955.                                 begin
  956.                                 scroll:=scroll-FELDER;
  957.                                 if scroll < 0 then
  958.                                     scroll:=0;
  959.                                 wechsel:=1;
  960.                                 vshow;
  961.                                 end
  962.                             else if (w_xyon_field(maske,w_mouse_cur_x,w_mouse_cur_y)=42) or (taste=KEY_PGDN) then
  963.                                 begin
  964.                                 if (scroll+FELDER) < anzahl then
  965.                                     begin
  966.                                     scroll:=scroll+FELDER;
  967.                                     if (scroll + viewpos) >= anzahl then
  968.                                         begin
  969.                                         viewpos:=anzahl-1-scroll;
  970.                                         ret:=w_switch_pos(maske,viewpos);
  971.                                         end;
  972.                                     wechsel:=1;
  973.                                     vshow;
  974.                                     end
  975.                                 end
  976.                             end;
  977.                         KEY_C_D:
  978.                             begin
  979.                             if(scroll+FELDER) < anzahl then
  980.                                 begin
  981.                                 scroll:=scroll+SPALTEN;
  982.                                 if (scroll + viewpos) >= anzahl then
  983.                                     begin
  984.                                     viewpos:=anzahl-1-scroll;
  985.                                     ret:=w_switch_pos(maske,viewpos);
  986.                                     end;
  987.                                 wechsel:=1;
  988.                                 vshow;
  989.                                 end
  990.                             end;
  991.                         KEY_C_L:
  992.                             begin
  993.                             if (viewpos=0) and  (scroll>0) then
  994.                                 begin
  995.                                 scroll:=scroll-SPALTEN;
  996.                                 wechsel:=1;
  997.                                 vshow;
  998.                                 end
  999.                             else if viewpos>0 then
  1000.                                 begin
  1001.                                 viewpos:=viewpos-1;
  1002.                                 ret:=w_switch_pos(maske,viewpos);
  1003.                                 end
  1004.                             end;
  1005.                         KEY_C_R:
  1006.                             begin
  1007.                             if ((scroll+FELDER) < anzahl) and (viewpos=(FELDER-1)) then
  1008.                                 begin
  1009.                                 scroll:=scroll+SPALTEN;
  1010.                                 wechsel:=1;
  1011.                                 vshow;
  1012.                                 end
  1013.                             else if (scroll+viewpos) < (anzahl-1) then
  1014.                                 begin
  1015.                                 viewpos:=viewpos+1;
  1016.                                 ret:=w_switch_pos(maske,viewpos);
  1017.                                 end
  1018.                             end;
  1019.                         KEY_C_U:
  1020.                             begin
  1021.                             if scroll > 0 then
  1022.                                 begin
  1023.                                 scroll:=scroll-SPALTEN;
  1024.                                 wechsel:=1;
  1025.                                 vshow;
  1026.                                 end
  1027.                             end;
  1028.                         else
  1029.                             ;
  1030.                     end;
  1031.                     end;
  1032.                 else
  1033.                     if  (i>=0) and (i < anzahl) then
  1034.                         begin
  1035.                         ok:=1;
  1036.                         taste:=KEY_CR;
  1037.                         end;
  1038.                 end;
  1039.             if i>=0 then
  1040.                 begin
  1041.                 aktpos:=i + scroll;
  1042.                 viewpos:=i;
  1043.                 end;
  1044.             aktpos:=scroll+viewpos;
  1045.         until ok<>0;
  1046.  
  1047.  
  1048.         if taste=KEY_ESC then
  1049.             begin
  1050.             newdir:=0;
  1051.             end
  1052.         else if strequal(dateiname[aktpos+1],'..\',3) then
  1053.             (*
  1054.             Einen Pfad zurück
  1055.             *)
  1056.             begin
  1057.             newdir:=1;
  1058.             cdback(pfad2);
  1059.             end
  1060.         else if strequal(dateiname[aktpos+1],'.\',2) then
  1061.             (*
  1062.             Root wurde angewählt
  1063.             *)
  1064.             begin
  1065.             newdir:=1;
  1066.             cdroot(pfad2);
  1067.             end
  1068.         else if (aktpos+1) > anzfile then
  1069.             begin
  1070.             newdir:=1;
  1071.             cdnext(pfad2,dateiname[aktpos+1]);
  1072.             end
  1073.         else
  1074.             begin
  1075.             newdir:=0;
  1076.             end;
  1077.         end;
  1078.  
  1079.     if taste=KEY_CR then
  1080.         begin
  1081.         taste:=0;
  1082.         setfname(pfad2,dateiname[aktpos+1]);
  1083.         minpath(pfad2);
  1084.         name:=pfad2;
  1085.         ret:=w_close;
  1086.         ret:=w_erase(maske);
  1087.         datei_menue:=1;
  1088.         exit;
  1089.         end
  1090.     end
  1091. end;
  1092.  
  1093.  
  1094. (****************************************************************************
  1095. ****************************************************************************)
  1096. begin
  1097.  
  1098. ret:=w_init(DIREKT);
  1099. (*
  1100. Initialisierung,
  1101. Parameter 0 bewirkt einen direkten Zugriff auf den Bildspeicher
  1102. Returnwert zeigt an, ob Maus angeschlossen ist
  1103. *)
  1104.  
  1105.  
  1106. hm:=w_load('hmenue.msk',NOVIRTUELL);
  1107. (*
  1108. Das Hauptmenü wird ohne Anlegen eines virtuellen Bildes geladen,
  1109. über die Maskennummer in hm wird das Hauptmenü zukünftig angesprochen
  1110. *)
  1111.  
  1112. ret:=w_open(hm);
  1113. (*
  1114. Das Hauptmenü wird auf den Schirm ausgegeben
  1115. *)
  1116.  
  1117. repeat
  1118.     case w_switch(hm) of
  1119.         (*
  1120.         In w_switch erfolgt die Auswahl aus dem Hauptmenü, die
  1121.         einzelnen anwählbaren Stellen im Hauptmenü sind bei
  1122.         Erstellung der Maske definiert und nummeriert worden.
  1123.         *)
  1124.         0:
  1125.             hilfe;
  1126.         1:
  1127.             begin
  1128.             s:='*.*';
  1129.             ret:=datei_menue(s,1);
  1130.             end;
  1131.         2:
  1132.             ret:=integer(ascii_waehlen);
  1133.         3:
  1134.             ret:=attribut_waehlen($07);
  1135.         4:
  1136.             menue;
  1137.  
  1138.        -3:
  1139.            begin
  1140.            ret:=w_deinit;
  1141.            writeln('Fehler ',w_error,' in w_switch');
  1142.            halt(0);
  1143.            end;
  1144.  
  1145.  
  1146.         else
  1147.             ;
  1148.     end
  1149. until ((  w_switch_last_key(hm) = KEY_ESC)  or  (w_switch_last_key(hm) = MOUSE_R_B ));
  1150. (*
  1151. Abbruch nur, wenn die letzte Taste in w_switch ESC
  1152. oder linke Maustaste war.
  1153. *)
  1154.  
  1155.  
  1156. ret:=w_close;
  1157. (*
  1158. Das Hauptmenü wird vom Bilschirm genommen, der
  1159. ursprüngliche Bildinhalt zurückgesichert. Eine
  1160. Referenznummer ist nicht erforderlich, da die
  1161. Masken in einem Maskenstapel verwaltet werden und
  1162. somit immer die oberste Maske im Stapel
  1163. geschlossen wird.
  1164. *)
  1165. v_clrscr;
  1166. ret:=w_deinit;
  1167. (*
  1168. Beseitigt und löscht alle Maskenbestandteile im Speicher;
  1169. *)
  1170. end.
  1171.  
  1172.