home *** CD-ROM | disk | FTP | other *** search
- (*
- Das nachfolgende Beispiel verdeutlicht das Zusammenwirken
- der einzelnen Komponenten der WINEDIT-Anwenderschnittstelle.
-
- Auf eine Fehlerüberprüfung nach Aufruf von WINEDIT-Funktionen
- wurde der Übersicht halber weitgehend verzichtet.
-
- Zur Nutzbarmachung der WINEDIT-Routinen ist ein entsprechendes
- Unit vorhanden:
-
- W_TBP_40.TPU wenn mit TURBO 4.0,
- W_TBP_47.TPU wenn mit TURBO 4.0 + 8087,
- W_TBP_50.TPU wenn mit TURBO 5.0 und
- W_TBP_55.TPU wenn mit TURBO 5.5 gearbeitet wird.
-
- Eventuell ist die USES-Anweisung in diesem Quelltext
- entsprechend der verwendeten Version zu ändern.
-
- Häufigste Fehlerursachen sind erfahrungsgemäß
-
- - falscher Dateiname beim Laden einer Maskendatei mit w_load
-
- - nicht ausreichend verfügbarer Speicherplatz beim Laden oder
- Öffnen einer Maske;
- es sollte überprüft werden, ob z.B. durch Unterbinden des
- Anlegens virtueller Bilder bei Aufruf von w_load Speicher
- gespart werden kann.
- Es sollten selten benutzte Masken erst bei Bedarf geladen
- und anschließend mit w_erase(..) sofort wieder gelöscht werden.
-
- - das vielfache Laden ein und derselben Maske dadurch, daß der
- Ladevorgang erst bei Bedarf z.B. in einem Unterprogramm erfolgt,
- ein Löschen der Maske mit w_erase(..) jedoch bei Verlassen des
- Unterprogramms nicht erfolgt. Es ist durchaus zulässig, eine
- Maske mehrfach zu laden; nur ist irgendwann unweigerlich der
- Speicher voll.
-
- - ein zu kleiner Stackbereich des Programms;
-
-
- Im Beispielprogramm werden die einzelnen Masken erst bei Bedarf
- zugeladen und anschließend wieder gelöscht. Möglich wäre natürlich
- auch, alle Masken am Anfang des Programms einmalig zu Laden; dadurch
- werden Verzögerungszeiten beim Nachladen vermieden, der Speicherbedarf
- ist jedoch um einiges größer.
-
- Um die Wirkung der Konfigurationsfunktionen zu w_switch(..) zu
- ergründen, empfiehlt sich ein Herumspielen an diesen und
- anschließendem Betrachten der Ergebnisse;
- *)
-
- program beispiel;
-
-
-
- uses dos,W_TBP_55; (* Für andere Versionen entsprechen abändern *)
- (*
- Das Unit W_TBP_55.TPU ist somit dem Programm verfügbar
- *)
-
- var
- hm :integer; (* Maskenreferenz für das Hauptmenü *)
- s :string; (* Hilfsvariable *)
- ret :integer; (* Returnwert der WINEDIT-Funktionen *)
-
-
-
- procedure menue;
- (****************************************************************************
- Baut eine 3-stufige Menü-Hirachie auf;
- ****************************************************************************)
- var
- i,s,ok0,ok1,ok2:integer;
- m :array[0..9] of integer; (*Maskenreferenzen*)
- begin
-
- m[ 0]:=w_load('m0-00.msk',1);
- m[ 1]:=w_load('m1-00.msk',1);
- m[ 2]:=w_load('m1-01.msk',1);
- m[ 3]:=w_load('m1-02.msk',1);
- m[ 4]:=w_load('m1-03.msk',1);
- m[ 5]:=w_load('m1-04.msk',1);
- m[ 6]:=w_load('m2-00.msk',1);
- m[ 7]:=w_load('m2-01.msk',1);
- m[ 8]:=w_load('m2-02.msk',1);
- m[ 9]:=w_load('m2-03.msk',1);
- (*
- Alle Menüs und Untermenüs laden
- *)
-
- for i:=0 to 9 do
- if m[i] < 0 then
- begin
- writeln('Fehler ',w_error,' beim Laden von Nummer :',i);
- ret:=w_deinit;
- halt(1);
- end;
-
-
- for s:=0 to 9 do
- begin
- ret:=w_switch_mouse_cr(m[s],1);
- ret:=w_switch_mouse_esc(m[s],1);
- end;
- (*
- Hier wird die w_switch(..) so konfiguriert, daß lediglich durch
- Positionierung des Mauszeigers eine Anwahl erfolgt.
- Weiter ist das Verlassen eines Untermenüs über beliebige
- Menü-Hirachien hinweg mittels Mauszeiger möglich.
-
- Der Wert dieser Funktionen läß sich am besten erfahren, in dem
- man sie testweise entfernt.
- *)
-
-
- if w_open(m[0])=0 then
- begin
- writeln('Fehler ',w_error,' beim Öffnen ');
- ret:=w_deinit;
- halt(1);
- end;
- (*
- So könnte eine Fehlermeldung aussehen
- *)
-
-
- repeat
- ok0:=0;
- s:=w_switch(m[0]); (* Menü-Stufe 1 *)
- case s of
- 0:
- begin
- ret:=w_open(m[s+1]);
- ok1:=0;
- repeat
- case w_switch(m[s+1]) of (* Menü-Stufe 2 *)
- 0:
- begin
- ret:=w_open(m[6]);
- ok2:=0;
- repeat
- case w_switch(m[6]) of (* Menü-Stufe 3 *)
- 0:
- ;
- (*
- Hier und folgend sind
- die anwählbaren Aktionen
- einzusetzen
- *)
- 1:
- ;
- 2:
- ;
- -1:
- ok2:=1;
- else
- ;
- end
- until ok2=1;
- ret:=w_close;
- end;
- 1:
- begin
- ret:=w_open(m[7]);
- ok2:=0;
- repeat
- case w_switch(m[7]) of
- 0:
- ;
- (*
- Hier und folgend sind
- die anwählbaren Aktionen
- einzusetzen
- *)
- 1:
- ;
- 2:
- ;
- -1:
- ok2:=1;
- else
- ;
- end
- until ok2=1;
- ret:=w_close;
- end;
- 2:
- begin
- ret:=w_open(m[8]);
- ok2:=0;
- repeat
- case w_switch(m[8]) of
- 0:
- ;
- (*
- Hier und folgend sind
- die anwählbaren Aktionen
- einzusetzen
- *)
- 1:
- ;
- 2:
- ;
- -1:
- ok2:=1;
- else
- ;
- end
- until ok2=1;
- ret:=w_close;
- end;
- 3:
- begin
- ret:=w_open(m[9]);
- ok2:=0;
- repeat
- case w_switch(m[9]) of
- 0:
- ;
- (*
- Hier und folgend sind
- die anwählbaren Aktionen
- einzusetzen
- *)
- 1:
- ;
- 2:
- ;
- -1:
- ok2:=1;
- else
- ;
- end
- until ok2=1;
- ret:=w_close;
- end;
- 4:
- ;
- -1:
- ok1:=1;
- else
- ;
- end
- until ok1=1;
- ret:=w_close;
- end;
- 1:
- begin
- ret:=w_open(m[s+1]);
- ok1:=0;
- repeat
- case w_switch(m[s+1]) of
- 0,1,2,3,4,5:
- begin
- ;
- (* Hier sind ggf. Aktionen einzufügen *)
- end;
- -1:
- ok1:=1;
- else
- ;
- end
- until ok1=1;
- ret:=w_close;
- end;
- 2:
- begin
- ret:=w_open(m[s+1]);
- ok1:=0;
- repeat
- case w_switch(m[s+1]) of
- 0,1,2,3,4,5:
- begin
- ;
- (* Hier sind ggf. Aktionen einzufügen *)
- end;
- -1:
- ok1:=1;
- else
- ;
- end
- until ok1=1;
- ret:=w_close;
- end;
- 3:
- begin
- ret:=w_open(m[s+1]);
- ok1:=0;
- repeat
- case w_switch(m[s+1]) of
- 0,1,2,3,4,5:
- begin
- ;
- (* Hier sind ggf. Aktionen einzufügen *)
- end;
- -1:
- ok1:=1;
- else
- ;
- end
- until ok1=1;
- ret:=w_close;
- end;
- 4:
- begin
- ret:=w_open(m[s+1]);
- ok1:=0;
- repeat
- case w_switch(m[s+1]) of
- 0,1,2,3,4,5:
- begin
- ;
- (* Hier sind ggf. Aktionen einzufügen *)
- end;
- -1:
- ok1:=1;
- else
- ;
- end
- until ok1=1;
- ret:=w_close;
- end;
- -1:
- ok0:=1;
- else
- ;
- end;
- until ok0=1;
- ret:=w_close;
- for i:=0 to 9 do
- ret:=w_erase(m[i]);
- end;
-
-
-
- procedure hilfe;
- (****************************************************************************
- Gibt verschiedene Hilstexte zu diesem Beispielprogramm aus
- ****************************************************************************)
- var
- i,s,ok,akt :integer;
- m :array[0..5] of integer;
-
- begin
-
-
- m[ 0]:=w_load('h0.msk',1);
- m[ 1]:=w_load('h1.msk',1);
- m[ 2]:=w_load('h2.msk',1);
- m[ 3]:=w_load('h3.msk',1);
- m[ 4]:=w_load('h4.msk',1);
-
- for i:=0 to 4 do
- if m[i] < 0 then
- begin
- writeln('\nFehler beim Laden von Nummer ',i);
- ret:=w_deinit;
- halt(1);
- end;
-
-
- akt:=0;
- ok:=0;
- repeat
- ret:=w_open(m[akt]);
- s:=w_switch(m[akt]);
- case s of
- 0,1,2,3:
- begin
- if s >= akt then
- akt:=s+1
- else
- akt:=s;
- ret:=w_close;
- end;
- -1:
- begin
- ret:=w_close;
- ok:=1;
- end;
-
- else
- ;
- end;
- until ok=1;
-
- for i:=0 to 4 do
- ret:=w_erase(m[i]);
- end;
-
-
-
- function ascii_waehlen:char;
- (****************************************************************************
- Bringt eine ASCII-Tabelle zur Anzeige und ermöglicht die Auswahl eines
- Zeichens
- ****************************************************************************)
- var
- i,m :integer;
-
- begin
- m:=w_load('ascii.msk',1);
- (*
- Maske von Platte laden
- *)
-
- ret:=w_switch_matrix(m,1,0,0,0,0);
- (*
- Beschleunigte Anwahl wegen Maxtrix-artiger Anordnung
- der Positionen möglich; Dies ist nur bei einer großen
- Anzahl an Positionen relevant.
- Entfernt man diesen Aufruf, so wird man einen
- Zeitverzug nach Aufruf von w_switch bemerken.
- In dieser Zeit wird dann die Anordnung
- der einzelnen Anwahlpositionen zueinander überprüft.
- *)
-
- ret:=w_open(m);
- (*
- Maske ausgeben auf Schirm
- *)
-
- i:=w_switch(m);
- (*
- Auswahl durchführen
- *)
-
- ret:=w_close;
- (*
- Maske vom Schirm nehmen
- *)
-
- ret:=w_erase(m);
- (*
- Da die Maske bei jedem Unterprogrammaufruf neu geladen wird,
- muß sie natürlich bei verlassen des Unterprogramms gelöscht
- werden
- *)
-
- if i >= 0 then
- i:=i+32;
-
- ascii_waehlen:=char(i);
- end;
-
-
-
- function attribut_waehlen(altes_attribut:byte):byte;
- (****************************************************************************
- Ermöglicht die Auswahl eines der 256 Bildschirmattribute
- ****************************************************************************)
- var
- i,m:integer;
-
- begin
- m:=w_load('attrib.msk',1);
-
- ret:=w_switch_mark_mode(m,1);
- (*
- Markierung der Anwahlpositionen mit Pfeilen
- statt mit Attribut
- *)
-
- ret:=w_switch_pos(m,integer(altes_attribut));
- (*
- Bei Start markierte Position setzen;
- normalerweise wird bei Position 0 begonnen,
- hier nun bei Position altes_attribut
- *)
-
- ret:=w_switch_matrix(m,1,0,0,0,0);
- ret:=w_open(m);
- i:=w_switch(m);
- ret:=w_close;
- ret:=w_erase(m);
- attribut_waehlen:=byte(i);
- end;
-
-
-
-
- function datei_menue(var name:string;mode:integer):integer;
- (***************************************************************************
- Bringt eine Maske auf den Bildschirm, in der eine Datei angewählt werden
- kann.
- ***************************************************************************)
- const
- FELDER = 40; (* Felder der Maske*)
- SPALTEN = 4; (* Felder pro Zeile der Maske *)
- DATEIEN = 256; (* Maximum an einlesbaren Dateien, erweiterbar ! *)
-
- var
- merkmal : searchrec;
- i : integer;
- newdir : integer; (*Neues Directory wurde angewaehlt*)
- anzfile : integer; (*Summe der Dateien im Pfad*)
- ok : integer; (*Schleifendeterminator*)
- aktpos : integer; (*Aktuelle Dateinummer*)
- viewpos : integer; (*Aktuelles Feld in der Maske*)
- wechsel : integer; (*Kontrolliert Maskenrefresh*)
- taste : integer;
- anzahl : integer; (*Dateien + Subdirectories im Pfad*)
- scroll : integer; (*Anzahl der (gescrollten Zeilen)*SPALTEN*)
- maske : integer; (*Maskenreferenznummer*)
-
- dateiname : array[0..DATEIEN] of string[13]; (*Speichert die Dateinamen*)
-
- pfad1 : string; (*Vollständiger Pfad mit *.* *)
- pfad2 : string; (*Vollständiger Pfad mit Filemaske*)
- buffer : string;
-
-
-
-
- function strequal(s1,s2:string;n:byte):boolean;
- (*
- Stringvergleich auf n Zeichen
- *)
- var
- i:integer;
-
- begin
- for i:=1 to n do
- if s1[i]<>s2[i] then
- begin
- strequal:=false;
- exit;
- end;
- strequal:=true;
- end;
-
-
-
- procedure struppr(var s:string);
- (*
- Wandelt zu Großbuchstaben
- *)
- var
- i:integer;
- begin
-
- for i:=1 to length(s) do
- if (s[i]>= 'a') and (s[i] <= 'z') then
- s[i]:=char(byte (s[i]) - (32));
- end;
-
-
- function lastpos(s:string;c:char):byte;
- (*
- Findet letztes c in s
- *)
- var
- i :integer;
- begin
- i:=length(s)+1;
- repeat
- i:=i-1;
- until (i=0) or (s[i]='\') ;
- lastpos:=byte(i);
- end;
-
-
- procedure fullpath(var s:string;var dest:string);
- (*
- Verfolständigt eine relative Pfadangabe
- *)
- var
- dir :string;
- drive :byte;
- d :string;
- begin
-
- struppr(s);
-
-
- (*Laufwerk ermitteln*)
-
- if (length(s) < 2) or (s[2] <> ':') then
- (*
- Default-Laufwerk
- *)
- begin
- drive:=0;
- getdir(drive,d);
- d[0]:=char(2);
- d:=d+s;
- end
- else
- begin
- drive:=byte(s[1]) - 64;
- d:=s;
- end;
-
- (*
- Das Laufwerk ist ergänzt worden;
- nun ist die vollständige Pfadbezeichnung herzustellen
- *)
- getdir(drive,dir);
- if dir[length(dir)] <> '\' then
- dir:=dir + '\';
-
- if ( length(d) > 2 ) and ( d[3] <> '\' ) then
- begin
- (*
- Aktueller Pfad ist zu ergänzen
- *)
- d[0]:=char(length(d)-2);
- move(d[3],d[1],length(d));
- d:=dir + d;
- end
- else if length(d)=2 then
- begin
- d:= dir;
- end;
-
- dest:=d;
- end;
-
-
-
- procedure minpath(var s:string);
- (*
- Erzeugt, wenn möglich, eine verkürzte relative Pfadangabe
- *)
-
- var
- dir :string;
- drive :byte;
- off,l :integer;
- begin
-
- struppr(s);
- drive:=0;
- getdir(drive,dir);
- if dir[1]<>s[1] then
- begin
- (*
- Laufwerk ist nicht aktuelles Laufwerk
- *)
- drive:=byte(s[1]) - 64;
- getdir(drive,dir);
- end;
-
- off:=1;
- if dir[length(dir)] <> '\' then
- off:=2;
-
- if strequal(dir,s,length(dir)) then
- begin
- if drive = 0 then
- begin
- (*
- Laufwerk und Pfad
- *)
- l:=length(s)-length(dir)+1-off ;
- move(s[length(dir)+off],s[1],l);
- s[0]:=char(l);
- end
- else
- begin
- (*
- Laufwerk muß angegeben werden
- *)
- l:=length(s)-length(dir)+3-off;
- move(s[length(dir)+off],s[3],l-2);
- s[0]:=char(l);
- end
- end
- else if drive=0 then
- begin
- (*
- Laufwerksbuchstabe kann entfallen
- *)
- l:=length(s)-2;
- move(s[3],s[1],l);
- s[0]:=char(l);
- end
- end;
-
-
-
-
- procedure cdnext(var dir:string;sdir:string);
- (*
- Ergänzt den Namen eines Unterverzeichnisses
- in einem kompletten Pfad
- *)
- begin
- insert(sdir,dir,lastpos(dir,'\')+1);
- end;
-
-
- procedure cdback(var dir:string);
- (*
- Schneidet den Namen eines Unterverzeichnisses
- *)
- var
- l1,l2:byte;
- l:integer;
- begin
-
- l1:=lastpos(dir,'\');
-
- if l1 > 0 then
- begin
- l:=length(dir);
- dir[0]:=char(l1-1);
- l2:=lastpos(dir,'\');
- if l2 <> 0 then
- begin
- dir[0]:=char(l-l1+l2);
- move(dir[l1],dir[l2],l-l1+1);
- end
- else
- dir[0]:=char(l);
- end;
- end;
-
-
- procedure cdroot(var dir:string);
- (*
- Schneidet die Unterverzeichnisse ab
- *)
- var
- l1,l2:byte;
- l:integer;
- begin
-
- l1:=lastpos(dir,'\');
-
- if l1 > 0 then
- begin
- l:=length(dir);
- l2:=pos('\',dir);
-
- if l2 <> 0 then
- begin
- dir[0]:=char(l-l1+l2);
- move(dir[l1],dir[l2],l-l1+1);
- end
- end;
- end;
-
-
- procedure setfname(var s:string;fname:string);
- (*
- Setzt den angegebenen Dateinamen in den Pfad s ein
- *)
- var
- l:byte;
- begin
- l:=lastpos(s,'\');
- if l > 0 then
- begin
- s[0]:=char(l);
- s:=s + fname;
- end;
- end;
-
-
-
- procedure vshow;
- (*
- Neue Feld-Belegung auf den virtuellen Schirm ausgeben
- *)
- var
- j,k:integer;
- begin
- if(anzahl-scroll)<FELDER then
- k:=anzahl-scroll-1
- else
- k:=FELDER-1;
-
- for j:=0 to k do
- begin
- ret:=w_vout_str(maske,j,dateiname[j+1+scroll]);
- end;
-
- (*Rest löschen*)
-
- for j:=(anzahl-scroll) to FELDER-1 do
- begin
- ret:=w_vout_str(maske,j,' ');
- end;
-
- end;
-
-
-
-
- begin
- newdir :=1;
- ok :=0;
- aktpos :=0;
- viewpos:=0;
- wechsel:=1;
- anzahl :=0;
- scroll :=0;
-
- (*
- Maskenbeschreibung wird aus einer Datei in den Speicher geladen;
- Der zweite Parameter mit dem Wert 0 bewirkt, daß zu dieser Maske
- ein virtueller Bildschirm angelegt wird.
- *)
-
- maske:=w_load('file.msk',0);
- if maske < 0 then
- begin
- writeln('\nFehler %d beim Laden der Maske file.msk',w_error);
- ret:=w_deinit;
- halt(1);
- end;
-
-
- ret:=w_switch_matrix(maske,1,1,1,1,1);
- (*
- - Matrix-artige Anordnung
- - Bei Cursorbewegungen über die Kanten der Maske hinaus
- Abbruch der Funktion w_switch(..). Dies ist zur
- Realisierung einer Scroll-Funktion sinnvoll.
- *)
-
-
- ret:=w_switch_break_on_key(maske,2);
-
- ret:=w_open(maske);
-
- buffer:=name;
-
- while true do
- begin
-
- (*
- Dateiname bzw. Maske einlesen
- *)
- ret:=w_in_break_on_key(1);
- ret:=w_in_str(maske,40,255,buffer,'');
- taste:=w_in_last_key;
- if (ret = -1) or ((ret=-2)and(taste=MOUSE_R_B)) then
- begin
- ret:=w_close;
- ret:=w_erase(maske);
- datei_menue:=0;
- exit;
- end;
-
- struppr(buffer);
-
- (*
- Komplette Pfadbezeichnung in pfad2
- *)
- fullpath(buffer,pfad2);
-
- newdir:=1;
- while newdir=1 do
- begin
- wechsel:=1;
- for i:=0 to FELDER-1 do
- (*
- Felder löschen
- *)
- begin
- ret:=w_vout_str(maske,i,' ');
- end;
- ret:=w_switch_pos(maske,0);
-
- pfad1:=pfad2;
- setfname(pfad1,'*.*');
-
- anzahl:=0;
-
- findfirst(pfad2,archive,merkmal);
- while (doserror=0) and (anzahl<(DATEIEN-4)) do
- begin
- anzahl:=anzahl+1;
- dateiname[anzahl]:=merkmal.name;
- findnext(merkmal);
- end;
-
- anzfile:=anzahl;
-
- findfirst(pfad2,directory,merkmal);
- while (doserror=0) and (anzahl<(DATEIEN-2)) and (mode<>0) do
- begin
- if merkmal.attr = directory then
- begin
- anzahl:=anzahl+1;
- dateiname[anzahl]:=merkmal.name+'\';
- end;
- findnext(merkmal);
- end;
-
- if anzahl=0 then
- begin
- taste:=0;
- ret:=w_close;
- ret:=w_erase(maske);
- datei_menue:=-1;
- exit;
- end;
-
-
- ret:=w_vout_str(maske,40,pfad2);
-
- i:=0;
-
- while (i<anzahl) and (i<FELDER) do
- begin
- ret:=w_vout_str(maske,i,dateiname[i+1]);
- i:=i+1;
- end;
- ret:=w_vout(maske);
- taste:=0;
- scroll:=0;
- ok:=0;
- repeat
-
- if scroll > 0 then
- ret:=w_vout_str(maske,41,' ZURÜCK ')
- else
- ret:=w_vout_str(maske,41,' ');
-
- if (scroll+FELDER) < anzahl then
- ret:=w_vout_str(maske,42,' VOR ')
- else
- ret:=w_vout_str(maske,42,' ');
-
- i:=anzahl-scroll-1;
- if i>=FELDER then
- i:=FELDER-1;
- ret:=w_switch_range(maske,0,i);
- if wechsel=1 then
- begin
- ret:=w_vout(maske);
- wechsel:=0;
- end;
-
- i:=w_switch(maske);
- case i of
- -1:
- begin
- taste:=KEY_ESC;
- ok:=1;
- end;
- -2:
- begin
- taste:=w_switch_last_key(maske);
- viewpos:=w_switch_pos(maske,-1);
- case taste of
- MOUSE_L_B,
- KEY_PGUP,
- KEY_PGDN:
- begin
- if (w_xyon_field(maske,w_mouse_cur_x,w_mouse_cur_y)=41) or (taste=KEY_PGUP) then
- begin
- scroll:=scroll-FELDER;
- if scroll < 0 then
- scroll:=0;
- wechsel:=1;
- vshow;
- end
- else if (w_xyon_field(maske,w_mouse_cur_x,w_mouse_cur_y)=42) or (taste=KEY_PGDN) then
- begin
- if (scroll+FELDER) < anzahl then
- begin
- scroll:=scroll+FELDER;
- if (scroll + viewpos) >= anzahl then
- begin
- viewpos:=anzahl-1-scroll;
- ret:=w_switch_pos(maske,viewpos);
- end;
- wechsel:=1;
- vshow;
- end
- end
- end;
- KEY_C_D:
- begin
- if(scroll+FELDER) < anzahl then
- begin
- scroll:=scroll+SPALTEN;
- if (scroll + viewpos) >= anzahl then
- begin
- viewpos:=anzahl-1-scroll;
- ret:=w_switch_pos(maske,viewpos);
- end;
- wechsel:=1;
- vshow;
- end
- end;
- KEY_C_L:
- begin
- if (viewpos=0) and (scroll>0) then
- begin
- scroll:=scroll-SPALTEN;
- wechsel:=1;
- vshow;
- end
- else if viewpos>0 then
- begin
- viewpos:=viewpos-1;
- ret:=w_switch_pos(maske,viewpos);
- end
- end;
- KEY_C_R:
- begin
- if ((scroll+FELDER) < anzahl) and (viewpos=(FELDER-1)) then
- begin
- scroll:=scroll+SPALTEN;
- wechsel:=1;
- vshow;
- end
- else if (scroll+viewpos) < (anzahl-1) then
- begin
- viewpos:=viewpos+1;
- ret:=w_switch_pos(maske,viewpos);
- end
- end;
- KEY_C_U:
- begin
- if scroll > 0 then
- begin
- scroll:=scroll-SPALTEN;
- wechsel:=1;
- vshow;
- end
- end;
- else
- ;
- end;
- end;
- else
- if (i>=0) and (i < anzahl) then
- begin
- ok:=1;
- taste:=KEY_CR;
- end;
- end;
- if i>=0 then
- begin
- aktpos:=i + scroll;
- viewpos:=i;
- end;
- aktpos:=scroll+viewpos;
- until ok<>0;
-
-
- if taste=KEY_ESC then
- begin
- newdir:=0;
- end
- else if strequal(dateiname[aktpos+1],'..\',3) then
- (*
- Einen Pfad zurück
- *)
- begin
- newdir:=1;
- cdback(pfad2);
- end
- else if strequal(dateiname[aktpos+1],'.\',2) then
- (*
- Root wurde angewählt
- *)
- begin
- newdir:=1;
- cdroot(pfad2);
- end
- else if (aktpos+1) > anzfile then
- begin
- newdir:=1;
- cdnext(pfad2,dateiname[aktpos+1]);
- end
- else
- begin
- newdir:=0;
- end;
- end;
-
- if taste=KEY_CR then
- begin
- taste:=0;
- setfname(pfad2,dateiname[aktpos+1]);
- minpath(pfad2);
- name:=pfad2;
- ret:=w_close;
- ret:=w_erase(maske);
- datei_menue:=1;
- exit;
- end
- end
- end;
-
-
- (****************************************************************************
- ****************************************************************************)
- begin
-
- ret:=w_init(DIREKT);
- (*
- Initialisierung,
- Parameter 0 bewirkt einen direkten Zugriff auf den Bildspeicher
- Returnwert zeigt an, ob Maus angeschlossen ist
- *)
-
-
- hm:=w_load('hmenue.msk',NOVIRTUELL);
- (*
- Das Hauptmenü wird ohne Anlegen eines virtuellen Bildes geladen,
- über die Maskennummer in hm wird das Hauptmenü zukünftig angesprochen
- *)
-
- ret:=w_open(hm);
- (*
- Das Hauptmenü wird auf den Schirm ausgegeben
- *)
-
- repeat
- case w_switch(hm) of
- (*
- In w_switch erfolgt die Auswahl aus dem Hauptmenü, die
- einzelnen anwählbaren Stellen im Hauptmenü sind bei
- Erstellung der Maske definiert und nummeriert worden.
- *)
- 0:
- hilfe;
- 1:
- begin
- s:='*.*';
- ret:=datei_menue(s,1);
- end;
- 2:
- ret:=integer(ascii_waehlen);
- 3:
- ret:=attribut_waehlen($07);
- 4:
- menue;
-
- -3:
- begin
- ret:=w_deinit;
- writeln('Fehler ',w_error,' in w_switch');
- halt(0);
- end;
-
-
- else
- ;
- end
- until (( w_switch_last_key(hm) = KEY_ESC) or (w_switch_last_key(hm) = MOUSE_R_B ));
- (*
- Abbruch nur, wenn die letzte Taste in w_switch ESC
- oder linke Maustaste war.
- *)
-
-
- ret:=w_close;
- (*
- Das Hauptmenü wird vom Bilschirm genommen, der
- ursprüngliche Bildinhalt zurückgesichert. Eine
- Referenznummer ist nicht erforderlich, da die
- Masken in einem Maskenstapel verwaltet werden und
- somit immer die oberste Maske im Stapel
- geschlossen wird.
- *)
- v_clrscr;
- ret:=w_deinit;
- (*
- Beseitigt und löscht alle Maskenbestandteile im Speicher;
- *)
- end.
-