home *** CD-ROM | disk | FTP | other *** search
- (* ----------------------------------------------------------------------- *)
- (* HAKA20.PAS *)
- (* H a u s h a l t s k a s s e v2.0 *)
- (* (C) 1987 Michael Hecker & PASCAL INT. *)
- (* ----------------------------------------------------------------------- *)
- PROGRAM Haushaltskasse;
- CONST
- promptx = 20; (* Koordinaten der Meldungszeile *)
- prompty = 25;
- Nmon = 'Neuen Monat anlegen';
- Amon = 'Aktuellen Monat bearbeiten';
- Mstat = 'Monats-Statistik';
- Jstat = 'Jahres-Statistik';
- Mwe = 'Monat wechseln';
- Ende = 'Programm beEnden';
- Titel = 'H A U S H A L T S K A S S E V2.0';
- Blank = ' '; (* 5 Leerzeichen *)
- underline =
- '=====================================================================';
- TYPE
- Stringtyp = STRING[30];
- Monstr = STRING[9];
- Mon_Aus = RECORD
- SummeL, (* Lebensmittel *)
- SummeT, (* Toilettenartikel *)
- SummeLit, (* Literatur *)
- SummeKfz, (* Auto *)
- SummePost, (* Post *)
- SummeKleid, (* Kleidung *)
- SummeWoh, (* Wohnung *)
- SummeBuro, (* Bueroartikel *)
- SummeFrei, (* Freizeit/Hobby *)
- SummeDiv, (* Diverses *)
- Guthaben_MonAnfang, (* Guthaben am Monatsanfang *)
- Einkommen, (* Einkommen im lfd. Monat *)
- Guthaben : REAL;
- END;
- VAR
- mflag, mflag1, KeineDaten : BOOLEAN;
- Tag, Mon, Jahr, Fehler : INTEGER;
- Monat : Monstr;
- Key : CHAR;
- Guth, Summe : REAL;
- Liste : Mon_Aus;
- Datei : FILE OF Mon_Aus;
- Ext : STRING[3]; (* Extention fuer den Filenamen *)
- (* --> HAKA.EXT *)
- (* ----------------------------------------------------------------------- *)
- PROCEDURE Invers; (* Bildschirmsteuerung *)
- BEGIN TextBackGround(White); TextColor(Black); END;
-
- PROCEDURE Normal;
- BEGIN TextBackGround(Black); TextColor(White); END;
-
- PROCEDURE Pause (x: INTEGER); (* bei anderen Pascal-Sys. z.B. *)
- BEGIN Delay(x); END; (* durch FOR-Schleife ersetzen *)
- (* ----------------------------------------------------------------------- *)
- PROCEDURE Initialisieren; (* Record initialisieren *)
- BEGIN
- KeineDaten := FALSE;
- WITH Liste DO BEGIN
- SummeL := 0; SummeT := 0; SummeLit := 0;
- SummeKfz := 0; SummePost := 0; SummeKleid := 0;
- SummeWoh := 0; SummeBuro := 0; SummeFrei := 0;
- SummeDiv := 0; Guthaben_MonAnfang := 0;
- Guthaben := 0; Einkommen := 0;
- END;
- END;
- (* ----------------------------------------------------------------------- *)
- PROCEDURE Ueberschrift;
- BEGIN
- ClrScr; GotoXY(5,1); Invers;
- WriteLn(Blank,Blank,Titel,Blank,Blank,Tag,'.',Monat,' ',Jahr,Blank,Blank);
- Normal;
- END;
- (* ----------------------------------------------------------------------- *)
- (* druckt String an Position x,y - der i. Buchstabe ist invers *)
- PROCEDURE Say (s: Stringtyp; i,x,y: INTEGER);
- VAR p : INTEGER;
- BEGIN
- LowVideo; GotoXY(x,y);
- FOR p:= 1 TO Length(s) DO BEGIN
- IF p = i THEN BEGIN NormVideo; Write(s[p]); LowVideo; END
- ELSE Write(s[p]);
- END;
- NormVideo;
- END;
- (* ----------------------------------------------------------------------- *)
- (* Tastaturpuffer immer wieder auslesen, Char in Grossbuchstaben wandeln *)
- FUNCTION Getkey: CHAR;
- VAR ch : CHAR;
- BEGIN
- WHILE KeyPressed DO Read (Kbd,ch);
- Read(Kbd,ch); Getkey := UpCase(ch);
- END;
- (* ----------------------------------------------------------------------- *)
- (* Aufruf bei falschem Zeichen, Meldung ausgeben und neues Zeichen holen: *)
- FUNCTION Error_c (msg: Stringtyp): CHAR;
- BEGIN
- GotoXY(promptx,prompty); ClrEol;
- Invers; Write(msg); Normal;
- Error_c := Getkey; GotoXY(promptx,prompty); ClrEol;
- END;
- (* ----------------------------------------------------------------------- *)
- (* fordert Eingabe von J/N, gibt true/false zurueck. msg ist eine Frage, *)
- (* die mit J/N beantwortet werden muss *)
- FUNCTION JaNein (msg: Stringtyp): BOOLEAN;
- BEGIN
- Invers; GotoXY(promptx,prompty); Write(msg,' (J/N)? '); Normal;
- Key := Getkey; GotoXY(promptx,prompty); ClrEol;
- WHILE NOT(Key IN ['J','N']) DO
- Key := Error_c('Antwort sollte J oder N sein !');
- JaNein := (Key = 'J');
- END;
- (* ----------------------------------------------------------------------- *)
- PROCEDURE Datum; (* Systemdatum ermitteln, hier nur fuer MSDOS-Benutzer!!! *)
- TYPE regpack = RECORD
- ax,bx,cx,dx,bp,si,di,ds,es,flags: INTEGER;
- END;
- VAR recpack : regpack; (* Record fuer MsDos-Aufruf *)
- BEGIN
- WITH recpack DO ax := $2a SHL 8;
- MsDos(recpack);
- WITH recpack DO BEGIN
- Jahr := cx; Tag := dx MOD 256; Mon := dx SHR 8;
- END;
- END;
- (* ----------------------------------------------------------------------- *)
- PROCEDURE Monats_Umwandlung (VAR Zahl: INTEGER);
- BEGIN
- CASE Zahl OF
- 1 : Monat := 'Januar'; 2 : Monat := 'Februar';
- 3 : Monat := 'Maerz'; 4 : Monat := 'April';
- 5 : Monat := 'Mai'; 6 : Monat := 'Juni';
- 7 : Monat := 'July'; 8 : Monat := 'August';
- 9 : Monat := 'September'; 10 : Monat := 'Oktober';
- 11 : Monat := 'November'; 12 : Monat := 'Dezember';
- END;
- END;
- (* ----------------------------------------------------------------------- *)
- PROCEDURE Daten_Speichern;
- BEGIN
- GotoXY(promptx,prompty); Invers;
- Write(' Daten fuer ',Monat,' werden gespeichert ! '); Normal;
- Ext := Copy(Monat,1,3); (* Extention aus Monatsnamen ableiten *)
- Assign(Datei,'HAKA'+'.'+Ext); (* z. B.: HAKA.AUG *)
- ReWrite(Datei); (* Datei zum Schreiben vorbereiten *)
- Write(Datei,Liste); (* Record abspeichern *)
- Close(Datei);
- Pause(2000); (* nur zum Lesen der Meldung *)
- END;
- (* ----------------------------------------------------------------------- *)
- PROCEDURE Daten_Lesen;
- BEGIN
- KeineDaten := FALSE; GotoXY(promptx,prompty); Invers;
- Write(' Daten fuer ',Monat,' werden gelesen ! '); Normal;
- Ext := Copy(Monat,1,3); Assign(Datei,'HAKA'+'.'+Ext);
- (*$I-*) (* I/O-Ueberwachung durch Laufzeitsystem ausschalten *)
- ReSet(Datei); (* Datei zum Lesen vorbereiten *)
- (*$I+*) (* ...und I/O-Ueberwachung wieder reaktivieren *)
- Fehler := IOResult; (* Ergebnis von 'ReSet' *)
- IF Fehler = 0 THEN (* alles ok !! *)
- BEGIN
- Read(Datei,Liste); (* Record einlesen *)
- Pause(2000); (* nur zum Lesen der Meldung *)
- END
- ELSE
- BEGIN
- KeineDaten := TRUE;
- GotoXY(promptx,prompty); ClrEol; GotoXY(promptx,23); Invers;
- Write(' Datei fuer ',Monat,' existiert nicht !! ');
- GotoXY(promptx,prompty); Normal;
- Write(' Weiter mit beliebiger Taste ! '); Key := Getkey;
- END;
- Close(Datei);
- END;
- (* ----------------------------------------------------------------------- *)
- (*$I HAKAINC.PAS *)
- (*$I HAKAJST.PAS *)
- BEGIN
- ClrScr; Initialisieren; Datum; Monats_Umwandlung(Mon);
- REPEAT
- mflag := TRUE;
- WHILE mflag DO BEGIN
- Ueberschrift;
- Say(Nmon,1,20,8); Say(Amon,1,20,10); Say(Mstat,1,20,12);
- Say(Jstat,1,20,14); Say(Mwe,7,20,16); Say(Ende,12,20,18);
- Key := Getkey;
- WHILE NOT(Key IN['N','A','M','E','J','W']) DO
- Key := Error_c(' Bitte nur N, A, M, J, W, E ! ');
- CASE Key OF
- 'N': Neuer_Monat;
- 'A': Aktueller_Monat;
- 'M': Mon_Stat;
- 'J': Jahr_Stat;
- 'W': BEGIN
- ClrScr; Invers;
- WriteLn('Bitte den zu bearbeitenden Monat (1..12) eingeben ');
- Write('oder RETURN fuer den aktuellen Monat : ');
- Normal;
- Tag := 1; Mon := 0; ReadLn(Mon);
- IF Mon = 0 THEN Datum;
- Monats_Umwandlung(Mon); ClrScr; Initialisieren;
- END;
- 'E': mflag := FALSE;
- END;
- END;
- UNTIL JaNein('Wollen Sie wirklich aufhoeren ');
- ClrScr;
- END.
-