Benutzer:FbNutzer/FreePascalThemen
Erscheinungsbild
Programme für FreePascal und TurboPascal
vokabeltrainer.pas
[Bearbeiten]PROGRAM Vokabeltrainer;
{ Vokabeltrainer erstellt 1993 von "wikibooks.de/Benutzer:FbNutzer"}
{ mit TurboPascal 6.0 ; 2012 modif., damit komp. mit FreePascal(Lazarus)}
{ Schriftart wenn möglich im Win32-Konsolenfenster auf TT Lucida }
{ stellen, weil dann das Sonderzeichen œ (wie in sœuer) vorhanden ist }
{$I-} {$S-} {$R+}
USES Dos,Crt;
CONST Zeilenanzahl = 8;
TYPE Worttyp = STRING[53];
Zeigertyp = ^Worttyp;
Sprachenarraytyp = ARRAY[1..1000] OF Zeigertyp;
String30 = STRING[30];
Texttyp = ARRAY[0..Zeilenanzahl] OF String30;
Inhaltstyp = ARRAY[1..105] OF STRING[20];
chFTyp = ARRAY[1..14] OF CHAR;
CONST uekW = 'ü'; aekW = 'ä'; aegW = 'Ä'; oekW = 'ö';
oegW = 'Ö'; uegW = 'Ü'; szettW = 'ß';
uekD = #129; aekD = #132; aegD = #142; oekD = #148;
oegD = #153; uegD = #154 ; szettD = #225;
chFW : chFTyp = {WIN kompatibel}
('é','è','à','â','ç','ê','î','ù','û','ï','ô','ë','É','œ');
chFD : chFTyp = {DOS kompatibel}
(#130,#138,#133,#131,#135,#136,#140,#151,#150,#139,#147,#137,#144,#32);
VAR altes_Textattribut,Punkt : BYTE;
Deutsch,Fremdsprache : Sprachenarraytyp;
Beenden,ch : CHAR;
Laenge,Hintergrundfarbe,
Vordergrundfarbe,i,j : INTEGER;
FT_Anzeige,Dummy : BOOLEAN;
MText : Texttyp;
MaxLaenge : INTEGER;
Pfad : STRING;
hoehe,hoeheKAT : INTEGER;
uek,ueg,aek,aeg,oek,oeg,szett: CHAR;
chF : chFTyp ;
chD_komp : BOOLEAN;
PROCEDURE InitSonderZeichen;
BEGIN
IF chD_komp=true THEN {wenn DOS kompatibel }
BEGIN
chF:=chFD;
uek:=uekD; ueg:=uegD; aek:=aekD; oek:=oekD; oeg:=oegD;
szett:=szettD;
END
ELSE BEGIN {wenn WIN kompatibel }
chF:=chFW;
uek:=uekW; ueg:=uegW; aek:=aekW; oek:=oekW; oeg:=oegW;
szett:=szettW;
END;
MText[0]:=' VOKABELTRAINER ';
MText[1]:=' Info & Einstellung ';
MText[2]:=' Vokabeln eingeben ';
MText[3]:=' Vokabeln abfragen ';
MText[4]:=' Vokabelreferenz ';
MText[5]:=' Vokabeln speichern ';
MText[6]:=' Vokabeln laden ';
MText[7]:=' Vokabeln l'+oek+'schen ';
MText[8]:=' Programmende ';
END;
PROCEDURE Tastaturpuffer_loeschen;
VAR ch : CHAR;
BEGIN
WHILE KeyPressed DO
ch:=ReadKey;
end;
PROCEDURE Konfiguration_speichern;
VAR Datei : FILE OF INTEGER;
ch : CHAR;
Error,Wert : INTEGER;
BEGIN
Assign(Datei,'VKONFIG.DAT');
Rewrite(Datei);
Error:=IOResult;
IF Error=0 THEN
BEGIN
Wert:=hoeheKat*1024;
IF chD_komp THEN
Wert:=Wert+512;
IF FT_Anzeige THEN
Wert:=Wert+256;
Wert:=Wert+16*Hintergrundfarbe+Vordergrundfarbe;
Write(Datei,Wert);
Close(Datei);
END
ELSE
BEGIN
WriteLn(#7,' Fehler beim Schreiben der Datei !');
ch:=ReadKey;
END;
END;
PROCEDURE Pfad_speichern;
VAR Datei : TEXT;
ch : CHAR;
Error : INTEGER;
BEGIN
Assign(Datei,'VPFAD.DAT');
Rewrite(Datei);
Error:=IOResult;
IF Error=0 THEN
BEGIN
WriteLn(Datei,Pfad);
Close(Datei);
END
ELSE BEGIN
WriteLn(#7,' Fehler beim Schreiben des Pfades !');
ch:=ReadKey;
END;
END;
PROCEDURE Pfad_laden;
VAR Datei : TEXT;
Error : INTEGER;
BEGIN
Assign(Datei,'VPFAD.DAT');
Reset(Datei);
Error:=IOResult;
IF Error=0 THEN
BEGIN
ReadLn(Datei,Pfad);
Close(Datei);
END;
END;
PROCEDURE Konfiguration_laden;
VAR Datei : FILE OF INTEGER;
Wert,Wert_h,Error : INTEGER;
BEGIN
Assign(Datei,'VKONFIG.DAT');
Reset(Datei);
Error:=IOResult;
IF Error=0 THEN
BEGIN
Read(Datei,Wert);
CASE Wert div 1024 OF
2 : hoeheKat:=2;
1 : hoeheKat:=1;
ELSE
hoeheKat:=0;
END;
Wert:=Wert mod 1024;
CASE Wert div 512 OF
1 : chD_komp:=true;
0 : chD_komp:=false;
END;
Wert:=Wert mod 512;
CASE Wert div 256 OF
0 : FT_Anzeige:=false;
1 : FT_Anzeige:=true;
END;
Wert:=Wert mod 256;
IF Wert>0 THEN
BEGIN
Hintergrundfarbe:=Wert div 16;
Vordergrundfarbe:=Wert mod 16;
END
ELSE BEGIN
Hintergrundfarbe:=cyan;
Vordergrundfarbe:=black;
END;
Close(Datei);
END;
END;
PROCEDURE Cursor_aus;
BEGIN
IF Vordergrundfarbe<>Hintergrundfarbe THEN
CursorOff;
END;
PROCEDURE Cursor_ein;
BEGIN
CursorOn;
END;
PROCEDURE Funktionstastenanzeige;
VAR d : INTEGER;
BEGIN
IF hoeheKat=0 THEN d:=0 ELSE d:=1;
GotoXY(75,d+1);Write('F1 :',chF[1]);
GotoXY(75,d+3);Write('F2 :',chF[2]);
GotoXY(75,d+5);Write('F3 :',chF[3]);
GotoXY(75,d+7);Write('F4 :',chF[4]);
GotoXY(75,d+9);Write('F5 :',chF[5]);
GotoXY(75,d+11);Write('F6 :',chF[6]);
GotoXY(75,d+13);Write('F7 :',chF[7]);
GotoXY(75,d+15);Write('F8 :',chF[8]);
GotoXY(75,d+17);Write('F9 :',chF[9]);
GotoXY(75,d+19);Write('F10:',chF[10]);
GotoXY(75,d+21);Write('SF1:',chF[11]);
GotoXY(75,d+23);Write('SF2:',chF[12]);
GotoXY(75,2*d+24); Write('SF3:',chF[13]);
GotoXY(75,3*d+25); Write('SF4:',chF[14]);
END;
FUNCTION Input(VAR Zeichenkette:Worttyp;Esc:BOOLEAN):BOOLEAN;forward;
PROCEDURE Esc_Prozedur;
VAR Wort : Worttyp;
Nummer,F : INTEGER;
Nummer_s : STRING;
BEGIN
Window(1,hoehe-2,74,hoehe);
REPEAT
GotoXY(2,1);
Write('<Zahl>:Zeile '+aek+'ndern 0:Abbruch');
GotoXY(2,2);
Write('Nummer:');
ReadLn(Nummer_s);
Val(Nummer_s,Nummer,F);
IF (Nummer>0) and (Nummer<MaxLaenge) THEN
BEGIN
Val(Nummer_s,Nummer,F);
GotoXY(15,2);
Write('Deutsch : ');
Dummy:=Input(Wort,false);
IF Wort<>'' THEN
Deutsch[Nummer]^:=Wort;
GotoXY(15,3);
Write('Fremdsprache : ');
Dummy:=Input(Wort,false);
IF Wort<>'' THEN
Fremdsprache[Nummer]^:=Wort;
ClrScr;
END;
UNTIL (Nummer<=0) or (Nummer>=MaxLaenge);
ClrScr;
Window(1,3,74,hoehe-3);
END;
FUNCTION Input(VAR Zeichenkette:Worttyp;Esc:BOOLEAN):BOOLEAN;
VAR alt_X,alt_Y,i : BYTE;
Abbruch : BOOLEAN;
ch : CHAR;
BEGIN
Abbruch:=false;
Zeichenkette:='';
i:=0;
REPEAT
Inc(i);
ch:=ReadKey;
IF ch>#31 THEN
BEGIN
Write(ch);
Zeichenkette:=Zeichenkette+ch;
END
ELSE
CASE ch OF
#13 : WriteLn;
#8 : BEGIN
Write(#8,#32,#8);
Delete(Zeichenkette,Length(Zeichenkette),1);
END;
#0 : BEGIN
ch:=ReadKey;
CASE ch OF
#59 : ch:=chF[1]; {F1:é }
#60 : ch:=chF[2]; {F2:è }
#61 : ch:=chF[3]; {F3:à }
#62 : ch:=chF[4]; {F4:â }
#63 : ch:=chF[5]; {F5:ç }
#64 : ch:=chF[6]; {F6:ê }
#65 : ch:=chF[7]; {F7:î }
#66 : ch:=chF[8]; {F8:ù }
#67 : ch:=chF[9]; {F9:û }
#68 : ch:=chF[10]; {F10:Ç}
#84 : ch:=chF[11]; {SF1:ï}
#85 : ch:=chF[12]; {SF2:ô}
#86 : ch:=chF[13];
#87 : ch:=chF[14];
ELSE
ch:=#0;
END;
IF ch<>#0 THEN
BEGIN
Write(ch);
Zeichenkette:=Zeichenkette+ch;
END;
END;
#27 : BEGIN
IF Esc THEN
BEGIN
alt_X:=WhereX;
alt_Y:=WhereY;
Esc_Prozedur;
GotoXY(alt_X,alt_Y);
END
ELSE
Abbruch:=true;
END;
END;
UNTIL (ch=#13) or (Length(Zeichenkette)>52) or Abbruch;
IF Length(Zeichenkette)>52 THEN
WriteLn(#7);
Input:=Abbruch;
END;
PROCEDURE Schreibe_invers(Feldz:STRING;Zeile,x:BYTE);
BEGIN
TextColor(Hintergrundfarbe);
TextBackground(Vordergrundfarbe);
GotoXY(x,Zeile);
Write(Feldz);
TextColor(Vordergrundfarbe);
TextBackground(Hintergrundfarbe);
END;
FUNCTION Menue(Feld:Texttyp;Anzahl,akt_Zeile,Kopfzeile,
Zusatz:BYTE;Esc:BOOLEAN):BYTE;
VAR alte_Zeile,i,maxZeichen,x : BYTE;
ch : CHAR;
BEGIN
maxZeichen:=0;
FOR i:=1 TO Anzahl DO
BEGIN
IF Length(Feld[i])>maxZeichen THEN
maxZeichen:=Length(Feld[i]);
Feld[i]:=' '+Feld[i]+' ';
END;
x:=(78-maxZeichen) div 2-1;
FOR i:=1 TO Anzahl DO
WHILE Length(Feld[i])<maxZeichen+2 DO
Feld[i]:=Feld[i]+' ';
Cursor_aus;
TextColor(Vordergrundfarbe);
TextBackground(Hintergrundfarbe);
ClrScr;
GotoXY((78-Length(Feld[0])) div 2,Kopfzeile);Write(Feld[0]);
REPEAT
FOR i:=1 TO Anzahl DO
BEGIN
GotoXY(x,Zusatz+2*i);
Write(Feld[i]);
END;
Schreibe_invers(Feld[akt_Zeile],Zusatz+2*akt_Zeile,x);
ch:=ReadKey;
IF ch=#0 THEN
BEGIN
ch:=ReadKey;
alte_Zeile:=akt_Zeile;
CASE ch OF
#72 : IF akt_Zeile>1 THEN
Dec(akt_Zeile)
ELSE
akt_Zeile:=Anzahl;
#80 : IF akt_Zeile<Anzahl THEN
Inc(akt_Zeile)
ELSE
akt_Zeile:=1;
END;
GotoXY(x,Zusatz+2*alte_Zeile);Write(Feld[alte_Zeile]);
END;
UNTIL (ch=#13) or (Esc and (ch=#27));
Cursor_ein;
IF Esc and (ch=#27) THEN
Menue:=0
ELSE
Menue:=akt_Zeile;
END;
FUNCTION Untermenue(String0,String1,String2:String30):BYTE;
VAR UFeld : Texttyp;
BEGIN
Window(1,1,80,hoehe);
ClrScr;
UFeld[0]:=' '+String0+' ';
UFeld[1]:=' '+String1+' ';
UFeld[2]:=' '+String2+' ';
UFeld[3]:=' Hauptmen'+uek;
Untermenue:=Menue(UFeld,3,1,5,7,true);
ClrScr;
END;
PROCEDURE Loeschen;
VAR i,x,y,
Unterpunkt : INTEGER;
loesche : CHAR;
xs,ys : STRING[4];
BEGIN
Unterpunkt:=Untermenue('L'+oek+'schen','Alles l'+oek+'schen',
'Zeile(n) l'+oek+'schen');
ClrScr;
CASE Unterpunkt OF
1 : BEGIN
Cursor_aus;
GotoXY(20,10);
Write('Wirklich alles l'+oek+'schen (j/n) ?');
loesche:=UpCase(ReadKey);
IF loesche='J' THEN
BEGIN
FOR i:=1 TO MaxLaenge DO
BEGIN
Deutsch[i]^:='';
Fremdsprache[i]^:='';
END;
Laenge:=0;
END;
END;
2 : BEGIN
GotoXY(15,10);
Write('von Zeile : ');
ReadLn(xs);
GotoXY(15,12);
Write('bis Zeile : ');
ReadLn(ys);
Val(xs,x,i);
IF i=0 THEN
Val(ys,y,i);
IF (i=0) and (x>0) and (y<=Laenge) THEN
BEGIN
FOR i:=0 TO Laenge-y-1 DO
BEGIN
Deutsch[x+i]^:=Deutsch[y+i+1]^;
Fremdsprache[x+i]^:=Fremdsprache[y+i+1]^;
Deutsch[y+i+1]^:='';
Fremdsprache[y+i+1]^:='';
END;
Dec(Laenge,y-x+1);
END
ELSE
Write(#7);
END;
END;
Cursor_ein;
END;
PROCEDURE Eingabe(VAR i:INTEGER);
VAR Wort_d,Wort_f : Worttyp;
i_alt,ab,F,
Unterpunkt : INTEGER;
ab_s : STRING;
BEGIN
i_alt:=0;
ab:=0;
Unterpunkt:=Untermenue('Eingabe','Eingabe','Eingabe ab <Zeile>');
IF Unterpunkt=2 THEN
BEGIN
GotoXY(20,11);
Write('Eingabe ab Zeile : ');
ReadLn(ab_s);
Val(ab_s,ab,F);
IF F<>0 THEN
ab:=0;
IF (ab>0) and (ab<=i+1) THEN
BEGIN
i_alt:=i;
i:=ab-1;
END
ELSE
Write(#7);
END;
ClrScr;
IF (Unterpunkt=1) or (Unterpunkt=2) THEN
BEGIN
Write(' Vokabeltrainer : ');
WriteLn('Eingabe Abbruch mit <ENTER>');
IF FT_Anzeige THEN
Funktionstastenanzeige;
Window (1,3,74,hoehe-3);
REPEAT
Inc(i);
Write(i:3,' Deutsch :');
Dummy:=Input(Wort_d,true);
IF Wort_d<>'' THEN
Deutsch[i]^:=Wort_d;
Write(i:3,' Fremdsprache :');
Dummy:=Input(Wort_f,true);
IF Wort_f<>'' THEN
Fremdsprache[i]^:=Wort_f;
WriteLn;
UNTIL (Wort_d='') or (Wort_f='') or (i=MaxLaenge-1);
IF Deutsch[i]^='' THEN
Dec(i);
IF i_alt>i THEN
i:=i_alt;
END;
END;
PROCEDURE Abfrage;
VAR r_Laenge,Fehler,Woerter,
alte_Zufallszahl,Zufallszahl,
Unterpunkt : INTEGER;
L_Wort,e_Wort,Wort : Worttyp;
Hilfszeiger : Zeigertyp;
Sprache,ch : CHAR;
Ueben,Abbruch : BOOLEAN;
BEGIN
Unterpunkt:=Untermenue('Abfrage',''+ueg+'bung','Testen');
IF (Unterpunkt=1) OR (Unterpunkt=2) THEN
BEGIN
IF Unterpunkt=1 THEN
Ueben:=true
ELSE
Ueben:=false;
ClrScr;
Woerter:=0;
Fehler:=0;
Randomize;
r_Laenge:=Laenge;
Write(' Vokabeltrainer : ');
IF not(Ueben) THEN
Write('Abfrage')
ELSE
Write('šben');
IF Laenge>0 THEN
BEGIN
WriteLn(' Abbruch mit <ESC>');
GotoXY(10,10);
Write('Deutsch/Fremdsprache(d/f):');
Cursor_aus;
Sprache:=ReadKey;
WriteLn(Sprache);
Sprache:=UpCase(Sprache);
GotoXY(1,10);
DelLine;
IF FT_Anzeige THEN
Funktionstastenanzeige;
Window(1,10,74,12);
Cursor_ein;
Zufallszahl:=0;
Abbruch:=false;
REPEAT
Inc(Woerter);
ClrScr;
alte_Zufallszahl:=Zufallszahl;
Zufallszahl:=round(Random(r_Laenge));
IF Zufallszahl<r_Laenge THEN
Inc(Zufallszahl);
IF Zufallszahl=alte_Zufallszahl THEN
BEGIN
IF Zufallszahl<r_Laenge THEN
Inc(Zufallszahl)
ELSE IF Zufallszahl>2 THEN
Dec(Zufallszahl);
END;
IF Sprache='D' THEN
BEGIN
L_Wort:=Fremdsprache[Zufallszahl]^;
Wort:=Deutsch[Zufallszahl]^;
END
ELSE
BEGIN
L_Wort:=Deutsch[Zufallszahl]^;
Wort:=Fremdsprache[Zufallszahl]^;
END;
WriteLn(' ',Wort);
WriteLn;
Write(' ? ');
Abbruch:=Input(e_Wort,false);
IF not(Abbruch) THEN
BEGIN
IF L_Wort<>e_Wort THEN
BEGIN
ClrScr;
WriteLn(' Falsch,das Wort hei'+szett+'t: "',L_Wort,'" !');
WriteLn;
Write(' <Taste dr'+uek+'cken>');
ch:=ReadKey;
WriteLn;
Inc(Fehler);
END;
IF (L_Wort=e_Wort) or not(Ueben) THEN
BEGIN
IF L_Wort<>e_Wort THEN
Inc(Fehler);
Hilfszeiger:=Deutsch[r_Laenge];
Deutsch[r_Laenge]:=Deutsch[Zufallszahl];
Deutsch[Zufallszahl]:=Hilfszeiger;
Hilfszeiger:=Fremdsprache[r_Laenge];
Fremdsprache[r_Laenge]:=Fremdsprache[Zufallszahl];
Fremdsprache[Zufallszahl]:=Hilfszeiger;
Dec(r_Laenge);
END;
END;
UNTIL Abbruch or (r_Laenge=0);
Window(1,1,80,hoehe);
ClrScr;
GotoXY(20,10);
Write('Es gab ',Fehler,' Fehler bei ',Woerter,' W'+oek+'rtern!');
GotoXY(20,12);
Write('<Taste dr'+uek+'cken>');
ch:=ReadKey;
END
ELSE
BEGIN
GotoXY(10,10);
Write('Es befinden sich keine Vokabeln im Speicher!');
GotoXY(10,12);
Write('<Taste dr'+uek+'cken>');
ch:=ReadKey;
END;
END;
END;
FUNCTION SuchFunktion(Name:Worttyp;
VAR Vokabeln:Sprachenarraytyp):INTEGER;
VAR i : INTEGER;
BEGIN
i:=0;
REPEAT
Inc(i);
UNTIL (Name=Vokabeln[i]^) or (i>Laenge);
IF i>Laenge THEN
SuchFunktion:=0
ELSE
SuchFunktion:=i;
END;
PROCEDURE Uebersicht;
VAR Nummer : INTEGER;
BEGIN
ClrScr;
Cursor_aus;
WriteLn(' Vokabeltrainer : '+ueg+
'bersicht Abbruch mit <Esc>');
Window(1,3,80,hoehe);
Nummer:=0;
REPEAT
ClrScr;
WHILE (WhereY<=21) and (Nummer<MaxLaenge) DO
BEGIN
Inc(Nummer);
Write(Nummer:3,':',Deutsch[Nummer]^);
GotoXY(42,WhereY);
WriteLn(' ',Fremdsprache[Nummer]^);
END;
WriteLn;
Write(' <Taste dr'+uek+'cken>');
UNTIL (ReadKey=#27) or (Nummer>=Laenge);
Window(1,1,80,hoehe);
Cursor_ein;
END; { Uebersicht }
PROCEDURE Suchen;
VAR Wort : Worttyp;
Stelle,
Unterpunkt : INTEGER;
Sprache,ch : CHAR;
Abbruch : BOOLEAN;
BEGIN
Unterpunkt:=Untermenue(''+ueg+'bersetzen & '+ueg+'bersicht',
''+ueg+'bersetzen','Vokabel'+uek+'bersicht');
CASE Unterpunkt OF
1 : BEGIN
ClrScr;
Write(' Vokabeltrainer : ');
WriteLn(''+ueg+
'bersetzen Abbruch mit <ESC>');
IF FT_Anzeige THEN
Funktionstastenanzeige;
Window(1,3,74,hoehe-3);
Abbruch:=false;
REPEAT
Cursor_aus;
Write(' Wollen Sie einen deutschen oder');
WriteLn(' einen ausl'+aek+'ndischen Namen');
Write(' '+ueg+'bersetzen? (d/a) :');
Sprache:=ReadKey;
Cursor_ein;
IF (Sprache<>#13) and (Sprache<>#27) THEN
BEGIN
WriteLn(Sprache);
Sprache:=UpCase(Sprache);
WriteLn;
Write(' Vokabel:');
Abbruch:=Input(Wort,false);
END;
IF (Sprache<>#13) and (Sprache<>#27) and not(Abbruch) THEN
BEGIN
IF Sprache='F' THEN
Stelle:=SuchFunktion(Wort,Fremdsprache)
ELSE
Stelle:=SuchFunktion(Wort,Deutsch);
IF Stelle=0 THEN
WriteLn(' Wort leider nicht gefunden !')
ELSE
BEGIN
IF Sprache='F' THEN
WriteLn(' Wort:',Deutsch[Stelle]^)
ELSE
WriteLn(' Wort:',Fremdsprache[Stelle]^);
WriteLn;
Write(' '+aek+'ndern (j/n)');
ch:=ReadKey;
WriteLn(ch);
ch:=UpCase(ch);
IF ch='J' THEN
BEGIN
Write(' Deutsch:');
Abbruch:=Input(Wort,false);
IF (Wort<>'') and not(Abbruch) THEN
Deutsch[Stelle]^:=Wort;
Write(' Fremdsprache:');
Abbruch:=Input(Wort,false);
IF (Wort<>'') and not(Abbruch) THEN
Fremdsprache[Stelle]^:=Wort;
END;
END;
WriteLn;
WriteLn;
END;
UNTIL (Wort='') or (Sprache=#13) or (Sprache=#27) or Abbruch;
END;
2 : Uebersicht;
END;
END; { Suchen }
PROCEDURE Error(Speichern:BOOLEAN);
VAR ch : CHAR;
BEGIN
WriteLn;
GotoXY(8,WhereY);
Write(#7,'Fehler beim ');
IF Speichern THEN
Write('Speichern')
ELSE
Write('Laden');
Write(' der Datei!');
Cursor_aus;
ch:=ReadKey;
Cursor_ein;
ClrScr;
END;
FUNCTION LeseVerzeichnis(VAR Inhalt:Inhaltstyp):INTEGER;
VAR Dirdat : SearchRec;
Anzahl : INTEGER;
BEGIN
FOR i:=1 TO 105 DO
Inhalt[i]:='';
FindFirst(Pfad+'*.vok',AnyFile,Dirdat);
Anzahl:=0;
WHILE DosError=0 DO
BEGIN
Inc(Anzahl);
Inhalt[Anzahl]:=' '+Dirdat.Name;
WHILE Length(Inhalt[Anzahl])<14 DO
Inhalt[Anzahl]:=Inhalt[Anzahl]+' ';
FindNext(Dirdat);
END;
Leseverzeichnis:=Anzahl;
END;
FUNCTION Inhaltsmenue(Speichern:BOOLEAN):STRING;
VAR Dateianz,i,f,
akt_Datei,alte_Datei : INTEGER;
Inhalt : Inhaltstyp;
Name : STRING;
ch : CHAR;
BEGIN
Cursor_aus;
Dateianz:=LeseVerzeichnis(Inhalt);
IF Speichern THEN
BEGIN
Inhalt[Dateianz+1]:=Inhalt[1];
Inhalt[1]:=' <Neue Datei> ';
Inc(dateianz);
END
ELSE
BEGIN
Inc(Dateianz);
Inhalt[Dateianz]:='<Andere Datei>';
END;
IF Dateianz>55 THEN
f:=1
ELSE
f:=2;
FOR i:=1 TO Dateianz DO
BEGIN
GotoXY(2+((i-1) mod 5)*16,3+((i-1) div 5)*f);
Write(Inhalt[i]);
END;
akt_Datei:=1;
Schreibe_invers(Inhalt[akt_Datei],3+((akt_Datei-1) div 5)*f,
2+((akt_Datei-1) mod 5)*16);
alte_Datei:=1;
REPEAT
ch:=ReadKey;
IF ch=#0 THEN
BEGIN
ch:=ReadKey;
alte_Datei:=akt_Datei;
CASE ch OF
#72 : IF akt_Datei>5 THEN
Dec(akt_Datei,5);
#75 : IF akt_Datei>1 THEN
Dec(akt_Datei);
#77 : IF akt_Datei<Dateianz THEN
Inc(akt_Datei);
#80 : IF akt_Datei+5<=Dateianz THEN
Inc(akt_Datei,5);
ELSE
ch:=#0;
END;
IF alte_Datei<>akt_Datei THEN
BEGIN
Schreibe_invers(Inhalt[akt_Datei],3+((akt_Datei-1) div 5)*f,
2+((akt_Datei-1) mod 5)*16);
GotoXY(2+((alte_Datei-1) mod 5)*16,3+((alte_Datei-1) div 5)*f);
Write(Inhalt[alte_Datei]);
END;
END;
UNTIL (ch=#13) or (ch=#27);
Name:=Inhalt[akt_Datei];
IF ch=#13 THEN
IF (Name=' <Neue Datei> ') or (Name='<Andere Datei>') THEN
Inhaltsmenue:='@'
ELSE
BEGIN
Delete(Name,1,1);
Delete(Name,Pos('.VOK',Name)+4,12);
Inhaltsmenue:=Name;
END
ELSE
Inhaltsmenue:='';
ClrScr;
END;
PROCEDURE Speichern;
VAR Datei : TEXT;
i,Fehler : INTEGER;
Abbruch : BOOLEAN;
DateiName : STRING;
p : BYTE;
Dateiname2 : Worttyp;
BEGIN
Abbruch:=false;
WriteLn;
Write(' Vokabeltrainer : ');
WriteLn('Speichern Abbruch mit <ESC>');
Window(1,3,80,hoehe);
DateiName:=Inhaltsmenue(true);
IF Dateiname='@' THEN
BEGIN
GotoXY(20,10);
Write('Dateiname : ');
Cursor_ein;
Abbruch:=Input(Dateiname2,false);
Cursor_aus;
Dateiname:=Dateiname2;
p:=Pos('.',Dateiname);
IF p>0 THEN
Delete(Dateiname,p,4);
Dateiname:=Dateiname+'.vok';
END;
IF (Dateiname<>'') and not(Abbruch) THEN
BEGIN
Assign(Datei,Pfad+Dateiname);
Rewrite(Datei);
Fehler:=IOResult;
IF Fehler=0 THEN
BEGIN
FOR i:=1 to Laenge DO
BEGIN
WriteLn(Datei,Deutsch[i]^);
WriteLn(Datei,Fremdsprache[i]^);
END;
Close(Datei);
END
ELSE
BEGIN
Error(true);
END;
END;
Cursor_ein;
END; { Speichern }
PROCEDURE Laden(Var i:INTEGER);
VAR Datei : TEXT;
Dateiname : STRING;
Fehler : INTEGER;
Dateiname2: Worttyp;
Abbruch : BOOLEAN;
BEGIN
Abbruch:=false;
WriteLn;
Write(' Vokabeltrainer : ');
WriteLn('Laden Abbruch mit <ESC>');
Window(1,3,80,hoehe);
ClrScr;
Dateiname:=Inhaltsmenue(false);
IF Dateiname='@' THEN
BEGIN
GotoXY(10,10);
Write('Vollst'+aek+'ndiger Suchweg : ');
Cursor_ein;
Abbruch:=Input(Dateiname2,false);
Cursor_aus;
Dateiname:=Dateiname2;
END
ELSE
IF Dateiname<>'' THEN
Dateiname:=Pfad+Dateiname;
IF (Dateiname<>'') and not(Abbruch) THEN
BEGIN
Assign(Datei,Dateiname);
Reset(Datei);
Fehler:=IOResult;
IF Fehler=0 THEN
BEGIN
WHILE not(EOF(Datei)) and (i<MaxLaenge) DO
BEGIN
Inc(i);
ReadLn(Datei,Deutsch[i]^);
ReadLn(Datei,Fremdsprache[i]^);
END;
Close(Datei);
END
ELSE
Error(false);
END;
Cursor_ein;
END; { Laden }
FUNCTION Farbe_waehlen:INTEGER;
VAR i,h,v,errcode,farbcode : INTEGER;
hstr,vstr : STRING;
BEGIN
TextColor(15);
TextBackground(0);
ClrScr;
FOR i:=0 TO 15 DO
BEGIN
TextColor(15);
TextBackground(i);
Write(' Hintergrund ',i:2,' ');
TextColor(i);
TextBackground(0);
WriteLn(' Vordergrund ',i:2,' ');
END;
WriteLn;
Write('Welche Hintergrundfarbe: ');
Readln(hstr);
WriteLn;
Write('Welche Vordergrundfarbe: ');
Readln(vstr);
WriteLn;
IF hstr='' THEN h:=Hintergrundfarbe
ELSE Val(hstr,h,errcode);
IF vstr='' THEN v:=Vordergrundfarbe
ELSE Val(vstr,v,errcode);
farbcode:=h*16+v;
IF (farbcode<=0) or (farbcode>255) THEN
BEGIN
WriteLn('Fehler.Verwende weiter die bisherigen Farben.');
Write('<Taste dr'+uek+'cken>');
ch:=ReadKey;
Farbe_waehlen:=0 {Fehler}
END
ELSE
Farbe_waehlen:=farbcode;
END;
PROCEDURE Info_Einstellung;
VAR ch,Frage : CHAR;
FarbCode,Fehler,
Unterpunkt : INTEGER;
BEGIN
Fehler:=0;
Unterpunkt:=Untermenue('Info & Einstellung',
'Information','Konfiguration');
ClrScr;
CASE Unterpunkt OF
1 : BEGIN
WriteLn(' Vokabeltrainer : Info');
WriteLn;
WriteLn;
Write(' Der VOKABELTRAINER kann bis zu ',MaxLaenge);
WriteLn(' Vokabel(doppel)felder verwalten.');
WriteLn;
WriteLn(' Derzeit sind ',Laenge,' Felder belegt.');
WriteLn;
Write(' Die K'+uek+'rzel SF1 und SF2 bedeuten, dass');
WriteLn(' man [SHIFT][F1] bzw. [SHIFT][F2]');
WriteLn(' dr'+uek+'cken soll.');
Write(' '+ueg+'brigens, es k'+oek+
'nnen auch im Feld "DEUTSCH"');
WriteLn('die frz. Sonderbuchstaben');
WriteLn(' mit den Funktionstasten eingegeben werden.');
WriteLn;
Write(' <Taste dr'+uek+'cken>');
Cursor_aus;
ch:=ReadKey;
Cursor_ein;
END;
2 : BEGIN
Cursor_ein;
FarbCode:=Farbe_waehlen;
IF FarbCode>0 THEN
BEGIN
Hintergrundfarbe:=FarbCode div 16;
VordergrundFarbe:=FarbCode mod 16;
TextColor(Vordergrundfarbe);
TextBackground(Hintergrundfarbe);
END;
ClrScr;
WriteLn(' Vokabeltrainer : Konfiguration');
GotoXY(3,6);
Write('Funktionstastenanzeige (j/n) :');
Frage:=ReadKey;
WriteLn(Frage);
Frage:=UpCase(Frage);
IF Frage='N' THEN
FT_Anzeige:=false
ELSE
FT_Anzeige:=true;
GotoXY(3,9);
Write('Zeichendarstellung DOS/WIN wechseln (j/n)? :');
Frage:=ReadKey;
Write(Frage);
IF UpCase(Frage)='J' THEN
chD_komp:=not(chD_komp);
InitSonderZeichen; {Sonderzeichen anpassen}
GotoXY(3,12);
Write('Suchweg/Pfad : ');
ReadLn(Pfad);
IF Pfad<>'' THEN
IF Pfad[Length(Pfad)]<>'\' THEN
Pfad:=Pfad+'\';
GotoXY(3,15);
Write('Fensterh'+oek+'he gro'+szett+
'(g), mittel(m) oder klein(k): ');
Frage:=ReadKey;
Write(Frage);
CASE UpCase(Frage) OF
'G' : hoeheKat:=2;
'M' : hoeheKat:=1;
ELSE
hoeheKat:=0;
END;
hoehe:=25+5*hoeheKat;
GotoXY(3,18);
Write('Speichern (j/n): ');
Frage:=UpCase(ReadKey);
IF Frage='J' THEN
BEGIN
Konfiguration_speichern;
Pfad_speichern;
END;
END;
END;
END; { Info_Einstellung }
BEGIN { Hauptprogramm }
hoeheKat:=0; {80x25 Fenster}
chD_komp:=false; {auf WIN komp. voreingestellt}
SetCBreak(true);
Pfad:='';
altes_Textattribut:=TextAttr;
Hintergrundfarbe:=cyan;
Vordergrundfarbe:=black;
FT_Anzeige:=true;
Tastaturpuffer_loeschen;
ClrScr;
Writeln;
Cursor_aus;
WriteLn('Pfad und Konfigration laden (j/n) ? Standard = j');
j:=0;
Cursor_ein;
REPEAT
write('.');
inc(j);
delay(50);
UNTIL KeyPressed or (j>48);
IF KeyPressed THEN
ch:=ReadKey;
IF UpCase(ch)<>'N' THEN
BEGIN
Pfad_laden;
Konfiguration_laden;
END;
hoehe:=25+hoeheKat*5;
InitSonderZeichen;
i:=0;
WHILE i<1000 DO
BEGIN
Inc(i);
New(Deutsch[i]);
New(Fremdsprache[i]);
END;
MaxLaenge:=i;
Laenge:=0;
FOR i:=1 TO MaxLaenge DO
BEGIN
Deutsch[i]^:='';
Fremdsprache[i]^:='';
END;
Punkt:=1;
REPEAT
Window(1,1,80,hoehe);
WHILE KeyPressed DO
ch:=ReadKey;
Punkt:=Menue(MText,Zeilenanzahl,Punkt,3,4,true);
ClrScr;
CASE Punkt OF
1 : Info_Einstellung;
2 : Eingabe(Laenge);
3 : Abfrage;
4 : Suchen;
5 : Speichern;
6 : Laden(Laenge);
7 : Loeschen;
ELSE
Cursor_aus;
Tastaturpuffer_loeschen;
GotoXY(10,12);
Write('Wollen Sie das Programm wirklich beenden (j/n) ?');
Beenden:=UpCase(ReadKey);
IF Beenden<>'J' THEN
Punkt:=1;
Cursor_ein;
END;
UNTIL (Punkt>=Zeilenanzahl) or (Punkt<1);
TextAttr:=altes_TextAttribut;
ClrScr;
END.