„Weisung“, ein Programm zum Drucken von Überweisungsformularen

Die Idee für das Programm entstand, nachdem ich etliche Überweisungen mühsam geschrieben habe. Sogleich habe ich mich mit den Anforderungen für ein solches Programm auseinandergesetzt und kam zu folgenden Leistungsmerkmalen :

Abb. 1: Hardcoppy von Eingabe-Menü

Arbeitsmaterial

Ich habe das Programm mit dem Megamax Compiler und dem Megamax Construction-Set erstellt. Die Gerätekonfiguration des Atari ST spielt keine Rolle, jedoch kann es bei den Druckern Schwierigkeiten geben, da sie unterschiedliche Steuercodes haben.

Dieses Problem wird aber mittels einer Druckeranpassung komfortabel gelöst. Es ist wünschenswert, daß der Drucker einen Traktor für Endlospapier besitzt, da die Überweisungsformulare der Banken als Endlospapier erhältlich sind. Das abgedruckte Programm läuft auf dem Epson RX-80 einwandfrei und dürfte auch für alle anderen Epson-kompatiblen Drucker ohne Änderungen laufen.

Abb. 1: Hardcoppy von Eingabe-Menü

Damit das Programm nicht zu umfangreich wurde, habe ich mich begnügt, mit einer großen Dialogbox zu arbeiten, die während des gesamten Programmablaufs auf dem Bildschirm steht. Diese Dialogbox enthält das Überweisungsformular, welches editiert werden kann und außerdem noch vier Knöpfe, die für die folgenden Funktionen „Überweisungladen“, „-speichern“, „-drucken“, „Programm beenden“ und „aktuelles Datum in die Überweisung eintragen“, dienen. GEM übernimmt die Eingabe aller Felder der Überweisung, und erst wenn ein Knopf betätigt worden ist, übernimmt das Programm die Kontrolle. Hierdurch ist gewährleistet, daß zu jedem Zeitpunkt im Formular gearbeitet werden kann und nur bei der Ausführung der Funktion über die Knöpfe das Editieren nicht möglich ist. Hiermit ist die Funktionsweise des Programms bereits komplett erklärt. Damit Sie beim Abtippen kein Programmfragment erstellen, welches nicht funktioniert, will ich einige Tips geben:

Es ist Ihnen freigestellt, Namen und Routinen umzuschreiben, doch möchte ich Ihnen empfehlen, erst einmal meine Vorschläge zu übernehmen, damit es keine Komplikationen zwischen den Namen, die Sie mit dem Construction-Set eingeben, gibt.

  1. Erstellen Sie sich mit dem Construction-Set eine Dialogbox und geben Sie ihr den Namen „FORMULAR“. Diese Dialogbox enthält eine weiße Box, die Sie mäglichst auf volle Größe ziehen sollten, damit genügend Platz vorhanden ist. Den dünnen Rand können Sie entfernen, und das Füllmuster kann frei gewählt werden.
  2. Erstellen Sie sich vier Knöpfe mit mindestens dem Status EXIT, damit Sie die Dialogbox beim Anklicken der Knöpfe auch verlassen können. Geben Sie diesen Knöpfen mit der Namensfunktion des Construction-Sets folgende Namen: „LOAD“, „SAVE“, „PRINT“, „QUIT“ und „DATE“. Die Beschriftung und die Maße der Knöpfe können Sie frei wählen.
  3. Als nächstes ist es empfehlenswert, eine weitere Box (das eigentliche Überweisungsformular) in die Dialogbox zu holen. Diese bekommt keinen Namen, da sie lediglich der Optik dient.
  4. Nun können Sie zur visuellen Trennung der Felder acht kleinere Boxen auf die Überweisungsbox holen. Namen sind hier auch unerheblich.
  5. Beschriften Sie die Boxen mit .TEXT', wobei Sie die Schriftgröße auf klein setzen (,SM‘).
  6. Nun kommen die eigentlichen Eingabefehler, die Sie sich in die Dialogbox holen und auf die entsprechenden Längen ändern. Danach geben Sie den einzelnen Feldern die Namen, die hier in einer kurzen Liste zusammengefaßt worden sind:(Siehe Abbildung 3)
    Sehen Sie sich die Hardcopy des Formulars an, in dem die Namen in den Feldern eingetragen sind. Wichtig ist beim Erstellen, daß Sie die Zeile mit den Festvorbesetzungen mit /—/ auf die entsprechende Länge auffüllen. Die Eingabemöglichkeiten sind mit ,X‘ auszufüllen, da wir in jedem Feld alle Zeichen, Zahlen und Sonderzeichen zulassen wollen. In der Vorbesetzung sollten eingegeben werden, da sonst Komplikationen auftreten.
  7. Mit ,STRING' können Sie eine Punktreihe für die Unterschrift erzeugen.
  8. Speichern Sie die so erstellte Dialogbox unter dem Namen „WEISUNG“ ab.
  9. Tippen Sie das Programm möglichst fehlerfrei ab, kompilieren und linken es, und schon sind Sie fertig.

Haben Sie jetzt noch Schwierigkeiten mit der Reihenfolge, in der die Edit-felder abgearbeitet werden, so können Sie die Felder austauschen, so daß der Cursor (Strich) beim Drücken von „CRSR UP“, „SHIFT-TAB“, „CRSR DOWN“ und „TAB“ in der gewünschten Reihenfolge springt. Dabei ist nicht nur der Name zu ändern, sondern das gesamte Feld muß verschoben und die entsprechenden Längen geändert werden. Dies liegt an der Struktur, die das Construction-Set beim Erstellen festlegt. Dies ist nämlich ein Baum mit einer Wurzel, und für jedes Objekt wird ein Knoten angelegt, der auf das nächste Objekt zeigt. Diese Reihenfolge können Sie nicht im Baum ändern, da - wenn der Baum einmal festgelegt ist - seine Struktur in den Grundzügen erhalten bleibt, sondern nur, indem Sie die Felder geschickt auf dem Bildschirm austauschen.

- „EMPF_1“ mit 40 Zeichen für Name und Anschrift des - „EMPF_2“ mit 40 Zeichen Empfängers; - „BLZ“ mit 13 Zeichen für die Bankleitzahl; - „KTO_EMPF" mit 13 Zeichen für die Kontonr. des Empfängers; - „BANK“ mit 40 Zeichen für das Bankinstitut des Empf.; - „ZWECK_1“ mit 40 Zeichen für den Verwendungszweck; - „ZWECK_2“ mit 40 Zeichen - „ZWECK—3“ mit 40 Zeichen - „BETRAG“ mit 11 Zeichen für den Überweisungsbetrag; - „KTO_AUFT“ mit 13 Zeichen für das Konto des Auftraggebers; - „ANSCHR_1“ mit 40 Zeichen für die Anschrift des Auftraggeb.; - „ANSCHR—2“ mit 40 Zeichen - „DATUM“ mit 10 Zeichen für das Datum.

Abbildung 3

Nun dürften aber alle Schwierigkeiten beseitigt sein, und ich möchte Ihnen nun noch kurz die Funktionsweise der einzelnen Programmteile erklären:

main (), gem init ():

Der Programmablauf startet bei ,main ()‘ und verzweigt direkt zu gem_init ()‘, wo einige nötige Initialisierungen vorgenommen werden. Außerdem wird das Resource-File nachgeladen und die Adresse der Dialogbox ermittelt. Wenn das File „WEIUNG.RSC“ nicht gefunden worden ist, bricht das Programm mit einer Fehlermeldung ab. Da aber meist alles ohne Fehler abgelaufen ist, kehren wir in ,main ()‘ zurück, um eine Statuszeile oben auf dem Bildschirm zu zeichnen. Anschließend werden Pointer auf die Editfelder gesetzt, damit wir sie vorbesetzen und auslesen können. Dann wird die Dialogbox ,FORMULAR1 auf dem Bildschirm unterhalb der Statuszeile gezeichnet. GEM übernimmt nun die Verwaltung der Knöpfe und der Editfelder mit ,form_do‘. Sobald ein Knopf gedrückt wird, gibt GEM die Kontrolle an unser Programm ab, und wir verzweigen - je nachdem welcher Knopf gedrückt worden ist - in die Unterroutinen.

Wird der Knopf namens ,QUIT‘ angeklickt, so wird nachgefragt, ob man das Programm auch wirklich verlassen möchte. Beim Verlassen des Programms wird die Dialogbox geschlossen und die Arbeitsstation abgemeldet.

laden ():

In der Prozedur ,laden ()‘ wird die Funktion ,file_box' aufgerufen.

Diese habe ich selbst geschrieben, damit die Handhabung der Box um einiges leichter wird. Die Routine sorgt dafür, daß der Pfad, in dem man zuletzt war, bei erneutem Aufruf wiederbenutzt wird. Außerdem wird ein selektierter Filename auch wieder angezeigt. Die Funktion gibt den fertigen Filenamen zum Laden zurück. Wird die Filebox mit .Abbruch' beendet, so ist der Funktionswert 0. Nach dem Auswählen eines Formular-Files wird der Bildschirm durch erneutes Zeichnen der Dialogbox restauriert. Dies ist zwar nicht die feinste Methode, jedoch die einfachste. Nun wird die gewählte Datei zum Lesen geöffnet. Um eine Zeile in der Datei zu lesen, wird immer nur ein Zeichen gelesen un auf ,/n' (Line Feed) geprüft. Dabei wird ein Zeilenstring aufgebaut, der anschließend ins entsprechende Editfeld geschrieben wird. Werden weniger als 12 Zeilen gelesen, wird die Datei als fehlerhaft erkannt. Wenn Sie in der Filebox einen Fantasienamen eingegeben haben, und diese Datei damit nicht vorhanden ist, wird ebenfalls eine Warnmeldung ausgegeben.

speichern ():

Die Prozedure .speichern ()‘ läuft in etwa so wie .laden ()‘ ab, nur daß hier für jedes Editfeld eine Zeile in die Datei geschrieben wird, die vorher zum Schreiben geöffnet worden ist.

drucken ():

In der Prozedure .drucken ()‘ kann man, falls man irrtümlich hierher geraten ist, in die Dialogbox zurückkehren. Außerdem kann man erst drucken, wenn der Drucker eingeschaltet ist. Die Funktion .Cprnos ()‘ liefert den Wert 1, wenn der Drucker angeschlossen und eingeschaltet ist. Danach kann man eine von drei Schriftarten wählen. Natürlich ist es Ihnen überlassen, zum Beispiel Doppeldruck in NLQ im Programm abzuändern. Jedoch müssen Sie in der darunterliegenden CASE-Anweisung die entsprechenden Steuercodes einsetzen. Nun wird der deutsche Zeichensatz im Drucker angewählt und der Zeilenvorschub auf die Hälfte reduziert. Ab jetzt werden nur noch halbe Zeilen pro Zeilenvorschub vorgeschoben, (normal Vt> Zoll - halbe Weite V: Zoll also 6/72 Zoll). In den nächsten 27 Zeilen werden die jeweiligen Druckzeilen zusammengesetzt und gedruckt. Dann wird der Zeilenabstand wieder auf Vt Zoll (normaler Zeilenabstand) gesetzt und es wird auf das nächste Überweisungsformular vorgeschoben. Nun müssen noch eventuell eingeschaltete Schriftarten ausgeschaltet werden.

Protokoll ():

In der Prozedure ,Protokoll ()' werden die wichtigsten Daten der Überweisung gespeichert. Dies geschieht, indem man einfach eine Datei zum Anhängen öffnet; ist keine vorhanden, wird sie automatisch kreiert. Damit erhält man eine Liste der gedruckten Überweisungen auf Diskette. Diese können Sie als Übersicht mit einem Textverarbeitungsprogramm weiterverarbeiten oder in eine Datenbank aufnehmen. Wem dies unnötig erscheint, kann die Prozedure .Protokoll ()‘ und den Aufruf in .drucken ()' weglassen.

print ():

Außerdem habe ich noch eine Prozedure schreiben müssen, damit die Druckeranpassung berücksichtigt wird. Zudem kann mit dem Befehl .Cprnout ()‘ nur ein Zeichen gedruckt werden. ,print ()‘ ist eine Prozedur, die es ermöglicht, einen String zu drucken und dabei nötige Konvertierungen vorzunehmen. Wenn Sie Probleme mit falschgedruckten Zeichen haben, können Sie diese in der Switch-Anweisung unterbringen. Die Variable ,flag' dient zur Unterscheidung, welcher Zeichensatz zum Drucken eines Zeichens angewählt werden soll. Wenn flag = () ist, muß auf den amerikanischen Zeichensatz umgeschaltet werden, und das entsprechende Zeichen kann dann gedruckt werden. Anschließend wird wieder der deutsche Zeichensatz angewählt.

akt datum ():

In dieser Prozedur wird das aktuelle Computerdatum ausgelesen und in das Überweisungsformular geschrieben. Dies ist natürlich nur sinnvoll, wenn Sie eine Echtzeituhr haben oder die im Tastaturprozessor befindliche Uhr gepuffert haben, da sonst eventuell ein veraltetes Datum erscheint.

file box ():

Anschließend möchte ich noch die Funktion ,e = file_box(a,b,c,d) näher erläutern, da sie als nützliche Unterroutine auch in anderen Programmen verwendet werden kann.

In ,a‘ übergibt man eventuell Laufwerk und/oder Pfadvorgaben („“, „/.“, „E:“, „C:/MEGAMAX“, „/1ST_WORD“).

In ,b‘ gibt man ein eventuelles Auswahlkriterium an „/.“, „/FORMULAR.“, ,,/.DAT“).

Mit dem Parameter ,c‘ können Sie schon einen Filenamen angeben, der dann erscheint.

Auf ,d‘ erhalten Sie dann den Filenamen mit Laufwerksangabe, Pfadangaben und dem ausgewählten Filenamen.

Schließlich gibt der Funktionswert an, ob mit OK (e=l) oder mit Abbruch (e = 0) die Fileselectbox verlassen wurde.

An dieser Stelle möchte ich noch auf einen Fehler in der Betriebssystem-Routine ,fsel_input ()‘ hinweisen. Während des Aufrufs dieser Fileselect-Routine passiert es, daß bei Eingabe von in der Pfadzeile das System sich mit mehreren Bomben verabschiedet. Schade, daß es sich hierbei um einen Systembug handelt, den wir nur mit einem Austausch der ROMs beseitigen können. Wenn wir den Fehler ganz umgehen wollen, müßten wir eine komplett neue Routine schreiben. Das dies aber recht aufwendig ist, habe ich mich entschieden, die alte Systemroutine weiterzuverwenden, der Fehler tritt bei normalem Gebrauch nur selten auf, und unter Berücksichtigung des Bug’s dürfte es zu keinem Absturz führen.

Beschaffung des Überweisungspapiers und Einspannen in den Drucker:

Auf Ihrer Bank bekommen Sie bestimmt kostenlos die benötigten End-los-Überweisungsformulare. Die meisten Formulare entsprechen den genormten Formularen. Beim Einspannen kann ich Ihnen den Tip geben: das Formular so einspannen, daß das zu druckende Formular (in diesem Fall das zweite) genau vor dem Druckkopf plaziert werden kann. Die genaue Position in Ihrem Drucker müssen Sie selber durch Probedrucke in Erfahrung bringen.

Und nun viel Spaß mit dem Programm und beim Drucken Ihrer Überweisungen.


/***********************************************************************/
/*                                                                     */
/*                  Druckprogramm für Überweisungsformulare            */
/*                                                                     */
/* programmiert von Ulrich und Holger Stumm im März 1987 (UHS-Software)*/ 
/*                                                                     */
/***********************************************************************/

int mo_hiden=0;	/* Steuerung des Mauszeiger */

#define hidemaus() {if (mo_hiden==0) {graf_mouse(256,0L); mo_hiden=1;}} 
#define showmaus() {if (mo_hiden=1) {graf _mouse(257,0L); no_hiden=0;}} 
#define pfeilmaus() graf_mouse(0,0L)	/* Mausform als Pfeil */
#define bienemaus() graf_mouse(2,0L)	/* Mausform als Biene */

#include "gembind.h" 
#include "taddr.h" 
#include "obdefs.h" 
#include "osbind.h" 
#include "stdio.h"
#include "Weisung.h" /* Datei muß erst mit Construction-Set erstellt werden */

#define tiefe 3	/* Ebenen der Dialogbax 'formular1 */

int contrl[12],intin[128],ptsin[128],ptsout[128],intout[128]; 
int work_cut[57],work_in[12];

int xd,yd,wd,hd;	/* Dialogboxgrößen */

int handle;			/* Arbeitsstationsnumner */
FILE *file_handle;	/* für Dateiverwaltung */

long form_addr;		/* Adresse des Dialogbaums 'FORMULAR' */
long tree;			/* Adresse für beliebigen Dialogbaum */

char pfad[64],		/* Laufwerk + Suchpfad 'C:\MEGAMAX' */
	wahl[13],		/* Auswahlkriterium	'\*.*' */
	name[13],		/* Filename der Ausgewählt wurde */
	pfad_name[64];	/* Laufwerk + Suchpfad + Filename */

char protoname[64];	/* Pfad und Namen für Protokolldatei */

char *text;	/* allgemiener Textpointer */
char ***p_form[13];	/* Enthält Felder für ein Oberweisungsformular */

int knopf,taste;	/* für Rückmeldungen aus Funktionen */
int xy[4];			/* für v_bar (weißes Rechteck als Leiste ) */

/***********************************************************************/

gem_init()			/* nötige Initialisierungen für den Betrieb mit GEM */
{
	int i;

	appl_init();	/* Anwendung anmelden */
	for (i=0;i<10;i++) 
		work_in[i]=1; 
	work_in[10]=2;

	v_opnvwk(work_in, &handle,work_out);	/* Arbeitsstation öffnen */
	if (rsrc_load("WEISUNG.RSC")=0)	/* RSC-File laden */
	{
		text="[3][Achtung Fehler| |Das RSC-File ist nicht vorhanden.][Abbruch]"; 
		form_alert (1, text); 
		gemdos(0x0); /* Abbruch */
	}
	rsrc_gaddr(0,FORMULAR,&form_addr);	/* Adresse	für Dialogbaum ermitteln */
}

/***********************************************************************/

laden()		/* Überweisungsformular von Diskette laden */
{
	int fehler,i,k; 
	char zeile[255];

	taste=file_box(pfad,wahl,name,pfad_name);	/* Dateinamen auswählen */
	objc_draw(form_addr,5,tiefe,0,19,639,399);	/* Bildschirm restaurieren */
	if (taste=1)
	{
		bienemaus();
		if ((file_handle=fopen(pfad_name,"r")) !=0)	/* Datei zum Lesen offen */
		{
			i=0;
			while((fehler!=0)&&(i<=12))	/* 12 Zeilen sollen gelesen werden */
			{
				k=0;
				do
				{
					fehler=(int)(fgets(&zeile[k],2,file_handle)); /* ein Zeichen lesen */
				}
				while((fehler!=0)4&(zeile[k++]!='\n')); 
				zeile[k-1]='\0';
				sprintf(**p_form[i++],"%s",zeile); /* Textzeile in Editfeld eintragen*/
			}
			if ((fehler=0)S&(i!=13)) 
				form_alert(1,"[3][Die Formulardatei|ist fehlerhaft][Abbruch]"); 
			fclose(file_handle);	/* Datei schließen */
		}
		else	/* wenn Datei nicht vorhanden ist */
			form_alert(1,
				”[3][Die Formulardatei konnte|nicht geöffnet werden][Abbruch]"); 
		pfeilmaus();
	}	/* end of if */
}	/* end	of	prozedure */

/***********************************************************************/

speichern()	/* speichern eines Oberweisungsformulars auf Diskette */
{
	int i;

	taste=file_bax(pfad,wahl,name,pfad_name);	/* Dateinamen auswählen */
	objc_draw(form_addr,5,tiefe,0,19,639,399);	/* Bildschirm restaurieren */
	if (taste=1)	/* wenn Fileselectbox mit "OK" beendet */
	{
		bienemaus();
		file_handle=fopen(pfad_name,,'w");	/* Datei zum Schreiben offen */
		for (i=0; i<=12; i++) 
			fprintf(file_handle,”%s\n”,**p_form[i]); /* Editfelder rausschreiben */ 
		fclose(file_handle);	/* Datei schließen */
		pfeilmaus();
	}
}

/***********************************************************************/

drucken()	/* druckt Editfelder auf Überweisungs-Endlospapier */
{
	int i;
	char zeile[81];		/* nimmt immer eine Druckzeile auf */

	do					/* drucken ? und Drucker einschalten */
		taste=form_alert(1,
			"[3][Überweisung drucken?|Drucker einschalten!][ drucken | Abbruch ]");
	while((!Cprnos())&&(taste=1));	/* ist der Drucker eingeschaltet */

	if (taste=1)	/* wenn mit 'drucken' beendet worden ist */
	{				/* Schriftart für Drucker wählen */
		taste=form_alert(1,
			"[1][Wählen Sie eine Schriftstärke][ NORMAL | DICK | SUPER ]"); 
		bienemaus(); 
		switch(taste)
		{
			case 1:	/* Doppeldruck */
				print("\033G"); 
				break;
			case 2:	/* Fettschrift */
				print("\033E"); 
				break;
			case 3:	/* Doppeldruck + Fettschrift */
				print("\033G"); 
				print("\033E"); 
				break;
		}
		print("\033R\002");	/* ESC "R” 2 (Zeichensatz DEUTSCH) */
		print("\033A\006");	/* ESC "A" 6 (Zeilenabstand auf 6/72 inch) */
		sprintf(zeile," %s\n",**p_form[0]);
		print(zeile);			/* Empfänger 1. Zeile */
		sprintf(zeile,"%43s%s\n","",**p_form[2]);
		print(zeile);			/* Bankleitzahl */
		sprintf(zeile," %s\n\n\n\n",**p_form[1]);
		print(zeile);			/* Empfänger 2. Zeile */
		sprintf(zeile," %s",**p_form[3]);
		print(zeile);			/* Kontonummer Empfänger */
		sprintf(zeile,"\r%16s%s\n\n","",**p_form[4]);
		print(zeile);			/* Bankinstitut */
		sprintf(zeile,"\n\n%s\n\n",**p_form[5]);
		print(zeile);			/* Verwendungszweck 1. Zeile */
		sprintf(zeile,"%s",**p_form[6]);
		print(zeile);			/* Verwendungszweck 2. Zeile */
		sprintf(zeile,"%s",**p_form[8]);
		if (strlen(zeile)!=0)	/* Nur wenn Betrag vorhanden */
			sprintf(zeile,"\r%41s**%s**\n\n","",**p_form[8]) ;
		else
			sprintf(zeile,"\n\n"); 
		print(zeile);			/* überweisungsbetrag */
		sprintf(zeile,"%s\n\n\n\n",**p_form[7]);
		print(zeile);			/* Verwendungszweck 3. Zeile */
		sprintf(zeile,"%15s%s\n","",**p_form[10]) ;
		print(zeile);			/* 1. Zeile Anschrift Auftraggeber */
		sprintf(zeile," %s\n",**p_form[9]);
		print(zeile);			/* Kontonummer des Empfänger */
		sprintf(zeile,"%15s%s\n\n\n\n\n","",**p_form[11]);
		print (zeile);			/* 2. Zeile Anschrift Auftraggeber */
		sprintf(zeile, "%17s%s\n","",**p_form[12]);
		print(zeile);			/* Datum */
		print("\0332");			/* Zeilenabstand auf 1/6 inch */
		for (i=1; i<=12; i++)	/* auf nächste Seite mit LF's */
			print("\n");
		print("\033F");			/* Fettschrift ausschalten */
		print("\033H");			/* Doppeldruck ausschalten */
		protokoll();			/* Überweisung in Liste sichern */
		pfeilmaus();
	}
}

/***********************************************************************/

print(string)	/* konvertiert	und druckt einen String aus */
char string[255];
{
	int i=0,flag=1;
	while(string[i]!='\0')	/* Solange	das Ende nicht erreicht ist */
	{
		switch(string[i])	/* eventuelle	Konvertierung für Drucker */
		{
			case 'I':	string[i]=64;	flag=1;	break;	/* mit DEUTSCH-Zeichensatz */
			case 'A':	string[i]=91; flag=1;	break;
			case 'Ü': string[i]=93; flag=1; break; 
			case 'Ö': string[i]=92; flag=1; break; 
			case 'ä': string[i]=123; flag=1; break; 
			case 'ö': string[i]=124; flag=1; break; 
			case 'ü': string[i]=125; flag=1; break; 
			case 'ß': string[i]=126; flag=1; break;
			case '@': string[i]=64; flag=0; break; /* mit USA-Zeichensatz */
			case '[': string[i]=91; flag=0; break;
			case '\\': string[i]=92; flag=0; break;
			case ']': string[i]=93; flag=0; break;
			case '{'; string[i]=123; flag=0; break;
			case '|': string[i]=124; flag=0; break;
			case '}': string[i]=125; flag=0; break;
			case '~': string[i]=126; £lag=«; break;
		}

		if (flag==0)	/* warn flag 0 mit USA-Zeichensatz drucken */
		{
			print("\033R\000");		/* ESC "R" 0 (Zeichensatz USA) */
			Cprnout(string[i++]);	/* ein Zeichen an Drucker senden */
			print("\033R\002");		/* ESC "R" 2 (Zeichensatz DEUTSCH) */
			flag=1;
		}
		else			/* sonst mit DEUTSCH-Zeichensatz drucken */
			Cprnout(string[i++]);	/* ein Zeichen an Drucker senden */
	}
}

/***********************************************************************/

protokoll()	/* Speichert Daten der Überweisung in Liste auf Diskette ab */
{
	int i;

	file_handle=fopen(protoname,”a");	/* Datei zum Anhängen öffnen */
	fprintf(filejiandle,”%13s i %s\n",**p_form[12],**p_form[0]);
	fprintf(file_handle,"%13s | %s\n","" ,**p_form[1]);
	fprintf(file_handle,”%13s | %s\n",**p_form[3],**p_form[4]);
	fprintf(file_handle,"%13s | %s\n","" ,**p_form[5]);
	fprintf(file_handle,"%13s | %s\n",**p_form[	8],**p_form[6]);
	fprintf(file_handle,"%13s | %s\n",""	,**p_form[7]);
	fprintf(file_handle,"%13s | %s\n”,**p_form[ 9],**p_form[10]);
	fprintf(file_handle,"%13s | %s\n",”"	,**p_form[11]);
	fprintf(file_handle,
		"---------------------------------------------------------\n")	;
	fclose(file_handle);	/* Datei schließen */
}

/***********************************************************************/

akt_datum()	/* aktuelles Datum aus der Canpteruhr auslesen */
{
	int date;
	char zr,datestr[11];

	date=Tgetdate();	/* Datum	auslesen */
	zr=((char)date)&0x1f;
	datestr[0]=zr/10+'0';	/* Zehnerstelle des Tages */
	datestr[1]=zr%10+'0';	/* Einerstelle	des Tages */
	zr=((char)(date>>=5))&0xf; 
	datestr[2]='.';
	datestr[3]=zr/10+'0';	/* Zehnerstelle des ffonats */
	datestr[4]=zr%10+'0';	/* Einerstelle des Monats */
	zr=((char)((date>>4)+80L)%100)&0x7f; 
	datestr[5]='.'; datestr[6]='1'; datestr[7]='9';
	datestr[8]=zr/10+'0';	/* Zehnerstelle	des Jahres */
	datestr[9]=zr%10+'0';	/* Einerstelle	des Jahres */
	datestr[10]='\0';
	sprintf(**p_form[12],"%s",datestr);	/* Datum in Formular eintragen */
}

/***********************************************************************/

file_box(path, choise,word, path_name)	/* eigene Fileselectbox-routine */
char *path,*choise,*word,*path_name;
{
	int key,ii,kk; 
	char kette[64];

	ii=strlen(path);	/* Länge des Vargabepfades */
	while(ii!=0)&&(path[ii]!=':'))	/* Laufwerkangaben suchen (vor */
		ii--;
	if (ii==0)	/* Wenn	kein ':' vorhanden dann Laufwerkangabe holen */
	{
		kette[0]=Dgetdrv()+'A';	/* aktuelles Laufwerk auslesen */
		strcpy(&kette[1],":");
		strcat(kette,path);	/* Laufwerk + restl. Pfadvorgabe */
		strcpy(path,kette);	/* zurück auf path kopieren */
	}
	if (strlen(choise)==0)	/* Wenn noch kein Auswahlkriterium */
		sprintf (choise,"\\*.*");	/* absolutes Suchkriterium */
	strcat(path,choise);	/* Kriterium anhängen */
	
	fsel_input(path,word,&key);	/* eigentlicher Fileselectaufruf für GEM */

	ii=strlen (path);	/* nach ''\ vcn hinten suchen */
	while ((ii!=0)&&(path[ii] !='\\')) 
		ii--;
	path[ii]='\0';	/* Suchkriterien abschneiden */

	if (key!=0)	/* wenn mit OK abgeschlossen */
	{
		ii=strlen(word);	/* nach '.' von hinten suchen */
		while((ii!=0)S&(word[ii]!='.'))
			ii--;
		if (ii=0)	/* Wenn kein Extention dran ist */
		{
			ii=strlen(choise);	/* Position des '.' im Extention suchen */
			while(choise[ii]!='.')
				ii--;
			for (kk=ii; kk<=strlen(choise); kk++)	/* ab dieser Position bis Ende */
				kette[kk-ii]=choise[kk];	/* Extenticn kopieren und ... */
			kette[++kk]='\0';
			strcat(word,kette);	/* ... anhängen (z.B. '.FRM') */
		}
			/* Filename besteht aus Laufwerk + Pfad und ausgewähltem Namen */ 
		sprintf(path_name,"%s\\%s",path,word);
	}
	else
		path_name[0]='\0';	/* mit	Abbruch	beendet => kein Name gewählt */
	return(key);
}

/***********************************************************************/

main()	/* Hauptprogranm übernimmt Kontrolle des Prograrrmablaufs */
{
	int k;
	char drive[2];	/* für aktuelles Laufwerk */

	gem_init();	/* Arbeitsstation anmelden und RSC-File laden */

	Dgetpath(pfad,0); /* aktuellen Pfad auslesen und als 1. Vorgabe verwenden */ 
	sprintf(wahl,"\\*.FRM"); /* Auswahlkriterium nach allen FoRMat-Dateien */
	
	drive[0]=Dgetdrv()+'A';	/* aktuelles Laufwerk holen */
	strcpy(&drive[1],":");
	sprintf(protoname,"%s%s\\PROTOKOLL.DAT',drive,pfad);	/* Protokollpfad */

	hidemaus(); 
	pfeilmaus();
	xy[0]=0; xy[1]=0; xy[2]=639; xy[3]=18; 
	vsf_interior(handle,0); 
	vsl_color(handle,0);
	v_bar(handle,xy);	/* weiße Leiste an oberen Bildschirmrand Zeichen */
	vsl_color(handle,1);
	v_gtext(handle,16,14,	/* und mit Textbeschreiben */
		"Druckprogramn für Überweisungsformulare - programmiert von UHS-Soft März ‘87");
	tree=form_addr;	/* Pointer auf Editfelder setzen */
	p_form[00] = (char ***) (OB_SPEC(EMPF_1));
	p_form[01] = (char ***) (OB_SPEC(EMPF_2));
	p_form[02] = (char ***) (OB_SPEC(BLZ)); 
	p_form[03] = (char ***) (OB_SPBC (KTO_EMPF)); 
	p_form[04] = (char ***) (OB_SPEC (BANK)); 
	p_form[05] = (char ***) (OB_SPEC (ZWECK_1)); 
	p_form[06] = (char ***) (OB_SPEC (ZWECK_2)); 
	p_form[07] = (char ***) (OB_SPEC (ZWECK_3)); 
	p_form[08] = (char ***) (OB_SPEC (BETRAG)); 
	p_form[09] = (char ***) (OB_SPEC (KTO_AUFT)); 
	p_form[10] = (char ***) (OB_SPEC (ANSCHR_1)); 
	p_form[11] = (char ***) (OB_SPEC (ANSCHR_2)); 
	p_form[12] = (char ***) (OB_SPEC (DATUM));
	for (k=0; k<13; k++)	/* Editfelder mit Leerstring */
		sprintf(**p_form[k],"\0");	/* vorbesetzen */

	form_center(form_addr,&xd,&yd,&wd,&hd);	/* Dialogbox zentrieren */
	form_dial(FMD_START,xd,yd,wd,hd);	/* Dialogbox vorbereiten */
	form_dial(FMD_GROW,1,1,1,1,xd,yd,wd,hd);	/* wachsendes Rechteck */
	objc_draw(form_addr,0,tiefe,0,19,639,399);	/* Dialogbox Zeichen */
	showmaus();

	do
	{
		knopf=form_do(form_addr,EMPF_1);	/* GEM verwaltet Dialog */
		switch(knopf)	/* mit welchem Knopf */
		{				/* wurde Box beendet ??? */
			case LOAD: 
				laden();
				objc_change(form_addr, LOAD,0,xd,yd, wd,hd,SHADOWED,1); 
				if (taste=1)	/* wenn neue Texte vorhanden, */
					objc_draw(form_addr,5,tiefe,0,19,639,399);/* dann auch ausgeben */ 
				break;

			case SAVE:
				speichern();
				objc_change(form_addr,SAVE,0,xd,yd,wd,hd,SHADOWED,1); 
				break;

			case PRINT:
				drucken();
				objc_change(form_addr,PRINT,0,xd,yd,wd,hd,SHADOWED,1); 
				break;

			case QUIT:
				text="[3][Wollen Sie das Programm|wirklich beenden?][beenden|zurück]"; 
				taste=form_alert(1,text); 
				if (taste=1)
				{
					form_dial(FMD_FINISH,1,1,1,1,xd,yd,wd,hd); /* Dialogbox beenden */ 
					form_dial(FMD_SHRINK,1,1,1,1,xd,yd,wd,hd); /* schrumpfendes Rec */ 
					v_clsvwk(handle);	/* Arbeitsstation schließen */
					gemdos(0x0);	/* zurück zum Desktop */
				}
				objc_change(form_addr,QUIT,0,xd,yd,wd,hd,SHADOWED,1); 
				break;

			case DATE:
				akt_datum();
				objc_change(form_addr,DATE,0,xd,yd,wd,hd,NORMAL,1);  
				objc_draw(form_addr,DATUM,tiefe,0,19,639,399); 
				break;
		}	/* end of switch */
	} while(1);	/* Endlosschleife */
}	/* end of main */
Abb.2: Abgedruckte Überweisung

Ulrich Stumm
Aus: ST-Computer 06 / 1987, Seite 112

Links

Copyright-Bestimmungen: siehe Über diese Seite