Resourcen von C nach Pascal

So vorteilhaft die Arbeit mit dem Entwicklungspaket ST PASCAL+ sich in der Version 2.0 auch gestaltet, es gibt - insbesondere im Rahmen größerer Programm-Projekte - immer wieder Situationen, in denen der genervte Programmierer sich einen Interpreter vom Schlage des GFA-Basic wünscht.

Verkürzt eine compilerorientierte Arbeit insgesamt sicher die Turn-around-Zeiten und garantiert leidlich schnellen und optimierten Code, so verlangsamt diese Arbeitsweise doch in ausgewählten Situationen das Vorankommen. Dies gilt insbesondere für die Arbeit mit grafischen Objekten, die viele Überraschungen beinhalten können.

Für den ATARI ST sind vor allem die Dialogboxen wichtige Bestandteile größerer Projekte.

Gerade hier wäre es wünschenswert, wenn zu ST PASCAL+ ein RCS gehören würde, das eine bequeme Erzeugung dieser Boxen ermöglicht. Es ist nun mal nicht jedermanns Sache, über den rsc_load-Befehl eine komplette Resource_Datei eines fremden RCS zu laden; dagegen sprechen Speicherplatzgründe und die Ladezeiten.

Es ist andererseits auch nicht jedermanns Sache, den Umlauf Editor-Compiler-Linker-Programm mehrfach zu starten, bis eine Box den eigenen Vorstellungen entspricht. Aus diesen Erfahrungen und Überlegungen habe ich eine relativ einfache Routine konzipiert, die es ermöglicht, Dialogboxen komfortabel mit einem beliebigen RCS zu erstellen und diese dann in eine für ST PASCAL+ lesbare Form zu bringen. Die Vorgehens weise ist folgende :

Das von RSC_PAS.TOS erstellte INC-File enthält bereits die benötigten Variablen-Deklarationen mit Ausnahme der Integer-Variablen, die die Arbeit mit dem Dialog steuert, [ z.b.:pushed ; integer; ]

Das Programm zeigt während seiner Arbeit die Anzahl der in der Box vorhandenen Objekte sowie die der verwendeten Strings und Textfelder an.

Das einzige, was Sie ‘zu Fuß’ machen müssen, ist, sich die Nummer des ersten edierbaren Textfeldes und ihrer Exit-Objekte zu merken, damit Sie den do_dialog-Aufruf korrekt bestücken können und auch wissen, wo der Ausgang ist.

Zum Programm

Es ist von der Oberfläche her sehr knapp gehalten, um Platz zu sparen. Bei der Wahl der Algorithmen stand ich vor der Entscheidung, entweder lexikalisch oder interpretierend zu verfahren. Ich habe mich für eine lexikalische Arbeitsweise entschieden, weil dies den Programmaufwand reduziert. Pro-grammtechnisch muß also folgendes geschehen:

Schwierig gestaltet sich dieser Vorgang nur, weil ST PASCAL+ aus nicht nachvollziebaren Gründen in seinen Prozeduraufrufen erheblich von den C-Aufrufen abweicht, sowohl in der Anzahl als auch in der Typendeklaration von Parametern ;

Die ‘Väter’ von GEM - reine ‘C’-Freaks - haben eine dreifach gegliederte Struktur geschaffen, um ein Dialogobjekt zu beschreiben. (Siehe Tabelle)

Die Objekt-Struktur besteht aus 11 Informationen, von denen eine (die Nr.7: object-specifikation) wiederum zwei Informationen beinhalten kann (nämlich Farbe incl. Muster, Darstellungsart, Rahmenbreite und Farbe);

eine Objekt-Struktur (‘OBJECT name eine TED-Struktur (‘TEDINFO name[]..’); eine STRINGS-Struktur (‘STRINGS name[]..);

Die dreifach gegliederte Struktur eines Dialogobjektes

Für die Objekte, die formatierbare Texte beinhalten, ist die Information Nr.7 ein Zeiger auf eine TED-Struktur, die wiederum 11 Informationen beinhaltet, von denen die Informationen 1-3 erneut Zeiger sind, diesmal auf die String-Struktur. Man sieht, das ist alles ganz hübsch verschachtelt, aber logisch.

Anders hingegen bei ST PASCAL+: Hier werden nicht benutzerorientiert vergleichbare Strukturen (z.B. arrays of re-cord..) geschaffen, sondern der Aufruf eines Objekt vollzieht sich über bis zu drei Prozeduraufrufe; hierbei werden gegenüber dem C-Original teilweise die Parameter vertauscht (im Set_Dtext-Aufruf die Parameter text,template und valid), teilweise im Typ modifiziert (so wird die Ausrichtung eines Texts in C mit einem Integerwert erfaßt, in ST PASCAL+ mit einen Pseudo-Typ TE_JUST = [TE_CENTER,TE_LEFT,TE_RIGHT]). Ähnliche Irritation kann die Positionierung von Objekten hervorrufen; während im C-File die Position eines Objekts immer absolut an der Position des übergeordneten Objekts orientiert ist, läßt ST PASCAL+ nur eine Orientierung an den Ursprungskoordinaten des Root-Objekts (also der Dialog_Box selbst) zu. Diese Unebenheiten sind auch in der Version 2.0 nicht beseitigt; ob in der neuen Version des Handbuchs davon die Rede ist, weiß ich nicht.

Aus diesen Vorüberlegungen resultiert das Vorgehen im Programm; die Informationen des C-Files werden häppchenweise in records abgelegt, diese in arrays gespeichert. Dabei habe ich es vorgezogen, mit pointer-arrays zu arbeiten, um evtl. Platzprobleme zu verhindern. In diesen records werden die Informationen dann zu Parametern der Pascal-Prozedur umformuliert, so daß die Programmtext-Formulierung auf sie zurückgreifen kann.

In der vorliegenden Fassung verarbeitet RSC_PAS.TOS jeweils nur eine Dialogbox pro Duchlauf mit maximal 100 Objekten, 100 tedinfos und 300 strings. Das wäre im Extrem eine Box mit 100 edierbaren Textfeldern, und wer macht schon so was? Eine erweiterte Fassung, die auch eine Bearbeitung mehrerer Dialoge zuläßt und dabei auch die in einem *.I-File abgelegte Namensgebung berücksichtigt, ist programmtechnisch leicht zu bewerkstelligen und kann bei mir abgefordert werden.

Ergebnis des Demo-Programmes

Implementations-Hinweis

Vorliegende Fassung läuft unter Version 2.0 von PASCAL +; wer noch mit der alten Fassung arbeitet, muß die Includes der Bibliothek PASTRIX (also trixtype.pas und trixsubs.pas) streichen und die alte Datei screen.inc einbinden, um die benutzten VT52-Codes für die Bildschirmsteuerung belassen zu können. Die mehrfach benutzten Befehle writev und readv müssen dann durch geeignete Routinen zur Transformation string - zahl und umgekehrt ersetzt werden.

program rsc_pas; { — convertiert RCS.C zu PASCAL ST+.INC }

TYPE
	object	=	record
				next,head,tail,xp,yp:integer; 
				typ,flag,state,spec,pos : string[255] 
				END; {* objektstructur *}	]
	tedinfo	=	record
				text,temp,valid,font,just,sp,rahmen :string[255] 
				END; {* ted_structur *} 
	str255	=	string[255] ;
	ob_ar	=	array[1..100] of ^object;
	ted_ar	=	array[1..100] of ^tedinfo;
	st_ar	=	array[1..200] of ^string;
{$I TRIXTYPE.BIB}

VAR
	name, name_2	: string;
	quelle			: text;
	obj				: ob_ar;
	ted				: ted_ar;
	st				: st_ar;
	ob_zahl,ted_zahl,st__zahl,n : integer;
{$1 TRIXSUBS.BIB}

PROCEDURE conv_hex (VAR hexzahl : string);
	VAR result	: array[1..4] of integer;
		m,n		: integer;
		ch1,ch2,ch3,ch4 : char;

	FUNCTION hex_convert (ch : char) : long_integer;
	VAR zahl : integer;
	BEGIN
		CASE ch of	'A' : zahl := 10;
					'B'	: zahl := 11;
					'C'	: zahl := 12;
					'D'	: zahl := 13;
					'E'	: zahl := 14;
					'F'	: zahl := 15;
		OTHERWISE BEGIN
					zahl := (ord(ch) - 48);
				END;
		END;	{ OF CASE }
		hex_convert := zahl;
	END;

BEGIN
	m := pos ('x',hexzahl); IF m > 0 THEN delete (hexzahl,1,m);
	m := pos ('L',hexzahl); IF m > 0 THEN delete (hexzahl,m,1);
	m := length(hexzahl);
	IF m > 3 THEN ch4 := hexzahl[4];
	IF m > 2 THEN ch3 := hexzahl[3];
	IF m > 1 THEN ch2 := hexzahl[2]; 
	ch1 := hexzahl[1];
	FOR n:=1 TO m DO
		result[n] : = hex_convert(hexzahl[n]);
	IF m = 1 THEN writev(hexzahl, result[1]);
	IF m = 2 THEN 
	BEGIN
		result[1] :=result[1] * 16; result[1] :=result[1]+ result[2];
		writev(hexzahl,result[1]) ;
	END;
	IF m = 3 THEN 
	BEGIN
		result[1] := result[1] * 256; result[2] :=result[2]* 16;
		result[1] := result[1] +result[2]+result[3]; 
		writev(hexzahl,result[1]);
	END;
	IF m = 4 THEN 
	BEGIN
		result[1] := result[1] * 256 * 16; result[2]:= result[2] * 256; 
		result[3] := result[3] * 16;
		result[1] := result[1] + result[2] +result[3] + result[4];
		writev(hexzahl,result[1]);
	END;
END;

{ ------------------------------------- }

PROCEDURE suche_wort (VAR wort, source : string);
VAR zeilen_pos : integer;
BEGIN
	IF length(source)>1 THEN 
	BEGIN
		wort :='';	zeilen_pos := 1;
		REPEAT		zeilen_pos := succ(zeilen_pos);
		UNTIL source [zeilen_pos] = ' ';
		wort := copy(source, 1, zeilen_pos - 2);
		delete(source,1,zeilen_pos);
	END;
END;	{	liefert in < wort > das gesuchte und kürzt < source > }

{------------------------------------- }

PROCEDURE clean_string (VAR s : string);
VAR m: integer;
BEGIN
	IF s ='""' THEN s:='' {leere zeile wird zu leerem string} 
	ELSE 
	BEGIN
		IF s[1] = '"' THEN	{ Anführung eliminieren }
			delete(s,1,1); 
		m := length(s);
		REPEAT
			delete(s,m,1); {solange unnötige Zeichen da sind,}
			m := length(s); { wird weiter von hinten gekürzt } 
		UNTIL NOT ( s [m] in [',','}',';','"']);
	END;
END;

{ ----------------------------------- }

PROCEDURE teile_long ( d: string; VAR high, low: string); 
VAR m: integer;
	s : string;
BEGIN 
	s := d;
	m := length(s);
	IF s[m] = 'L' THEN { falls übergebenes Wort mit <L> endet, }
	   s[0] := chr(m-1);{ Stringlänge um eins reduziere }
	m := pos('x',s);
	IF m > 0 THEN { wenn übergebenes Wort <x> enthält, s }
		delete(s,1,m);{ bis zum <x> von vorne kürzen } 
	m := length(s);
	IF m > 4 THEN { wenn high und low vorhanden }
	BEGIN
		high:= copy (s,1,m-4) ; {high von [1] bis [länge - 4]} 
		low := copy (s,m-3,4) ; {low von [länge - 3] bis [länge] }
	END;
	IF NOT (m > 4) THEN { wenn nur low vorhanden }
	BEGIN
		high := '0' ; { high auf <0> setzen. . . } 
		low := s; { string = low }
	END;
END;

{ ----------------------------------- }

PROCEDURE lese_strings (VAR st : st_ar; VAR st_zahl : integer);
VAR zeile	: string;
	zi		: integer;
BEGIN
	REPEAT readln(quelle,zeile);
	UNTIL zeile = 'char *rs_strings [] = {'; {bis hier ignorieren }
	zi := 1;	{ zaehler auf 1 }
	LOOP readln(quelle,zeile);
	EXIT IF zeile = ''; { raus bei Leerzeile } 
	new(st[zi]); { neuen string holen } 
	clean_string(zeile); { string säubern } 
	st[zi]^ := zeile; { ab ins Lager .. } 
	zi := succ(zi); { weiterzaehlen }
	END;
	st_zahl :=pred(zi);{ anzahl strings korr. }
END;

{ ----------------------------------- }

PROCEDURE lese_teds (VAR ted : ted_ar; VAR ted_zahl: integer);
VAR zeile	: string;
	zi		: integer;
BEGIN
	REPEAT readln(quelle,zeile);
	UNTIL zeile = 'TEDINFO rs_tedinfo[] = {'; { ignorieren .. )
	zi := 1; { zaehler auf 1 }
	LOOP readln(quelle,zeile);
	EXIT IF zeile = ''; { raus bei Leerzeile } 
	new (ted[zi]) ; { neuen ted holen } 
	clean_string(zeile); { string säubern ) 
	suche_wort(ted[zi)^.text,zeile); { text_zeiger holen} 
	suche_wort(ted[zi]^.temp,zeile); { template_zeiger holen }
	suche_wort(ted[zi]^.valid, zeile); { valid_zeiger holen) 
	suche_wort(ted[zi]^.font,zeile); { font holen } 
	suche_wort(ted[zi]^.just,zeile); { dummy } 
	suche_wort(ted[zi]^.just,zeile); { justfikation holen } 
	suche_wort(ted[zi]^.sp,zeile); { specifikation holen } 
	suche_wort(ted[zi]^.rahmen,zeile); { dummy }
	suche_wort(ted[zi]^.rahmen,zeile); { rahmenbreite holen }
	zi := succ(zi); { weiter zaehlen }
	END;
	ted_zahl :=pred(zi); zi:= 1;{ ted_zahl korrigieren } 
END;

{ ----------------------------------- }

PROCEDURE lese_objects (VAR obj : ob_ar; VAR ob_zahl: integer);
VAR zeile, dummy: string;
	zi,m,n		: integer;
BEGIN
	REPEAT readln(quelle,zeile);
	UNTIL zeile = 'OBJECT rs_object[] = ' ';{ignorieren} 
	zi := 1;
	LOOP readln(quelle,zeile);
	EXIT IF zeile = w;{ raus, wenn Leer zeile } 
	new(obj[zi]); { neues Objekt holen } 
	clean_string(zeile); { string reinigen } 
	suche_wort(dummy,zeile); readv(dummy,obj[zi]^.next); { next,head & }
	suche_wort(dummy,zeile); readv(dummy,obj[zi]^.head); { tail lesen & }
	suche_wort(dummy,zeile); readv(dummy,obj[zi]^.tail); { zu integer } 
	suche_wort(obj[zi]^.typ,zeile); { obj_typ lesen } 
	suche_wort (obj [zi]^.flag, zeile); { obj_flag lesen } 
	suche_wort (obj[zi]^.state, zeile); { obj_state lesen) 
	suche_wort(obj[zi]^.spec,zeile); { obj_spec lesen } 
	obj[zi]^.pos : = zeile ; { rest der zeile in obj.pos } 
	n: =pos (', ', obj[zi]^.pos) ; { x-position isolieren } 
	FOR m:=1 to n - 1 DO 
		dummy[mj : = obj[zi]^.pos[m]; 
	dummy[0]:=chr(n-1); { in dummy übertr.} 
	delete(obj[zi]^.pos,1,n);{ aus obj.pos loeschen } 
	readv(dummy,obj[zi]^.xp);{ als integer in obj.xp...} 
	n := pos(',' ,obj[zi]^.pos);{ dasselbe für obj.yp } 
	FOR m :=1 to n - 1 DO 
		dummy[m] : = obj[zi]^.pos[m]; d
	dummy[0]:=chr(n-1); 
	delete(obj[zi]^.pos,1,n);
	readv(dummy,obj[zi]^.yp);{ der Rest bleibt obj.pos } 
	zi := succ(zi);{ weiter zaehlen }
	END;
	ob_zahl := zi - 2;{ zaehler korrigieren, Wurzel raus } 
END;

{ ----------------------------------- }

PROCEDURE obj_offset (VAR obj : ob_ar) ;
VAR n,i : integer;
BEGIN
	FOR n:=2 TO ob_zahl+1 DO 
	BEGIN
		IF obj[n]^.head > 1 THEN
		BEGIN
			FOR i: = obj[n]^.head + 1 TO obj[n]^.tail+1 DO 
			BEGIN
				obj[i]^.xp := obj[n]^.xp + obj[i]^.xp; 
				obj[i]^.yp := obj[n]^.yp + obj[i]^.yp;
			END;
		END;
	END;
END;

{ --------------------------------- }

PROCEDURE make_item ;
VAR n,nummer	:	integer;
	high,low,zeile, 
	d_s,d2_s	: string;
BEGIN
	nummer := length(name_2);
	LOOP
		nummer := pred(nummer);
		EXIT IF name_2 [nummer] =' \' ;
	END;
	delete(name_2,1,nummer); 
	writeln(quelle,' { ',name_2,' }'); 
	writeln(quelle, ' VAR wurzel : dialog_ptr; '); 
	writev(zeile,ob_zahl); 
	zeile :=
	concat( ' box : array [1..',zeile,'] of integer; ');
	writeln(quelle,zeile);
	writeln(quelle,'BEGIN ');
	writev(zeile,ob_zahl); 
	zeile :=
	concat ('wurzel := new_dialog(',zeile,',0,0,obj[1]^.pos,');');
	writeln(quelle,zeile);
	FOR n := 2 TO ob_zahl + 1 DO 
	BEGIN 
		writev(zeile,n-1);
		zeile := concat('box[',zeile,'] := add_DITEM(wurzel,');
		zeile := concat (zeile, obj[n]^.typ, ',');
		IF NOT (obj[n]^.flag = 'SELECTABLE') AND NOT(obj[n]^.flag ='NONE')
		AND NOT(obj[n]^.flag = 'DEFAULT') AND NOT(obj[n]^.flag ='EXIT_BTN') 
		AND NOT(obj[n]^.flag = 'EDITABLE')AND NOT(obj[n]^.flag ='RADIO_BTN')
		AND NOT (obj[n]^.flag = 'TOUCH_EXIT' ) AND NOT (obj[n]^.flag='LASTOB')
			THEN
			BEGIN
				teile_long(obj[n]^.flag,high,low):
				IF (pos('x',low)>0) THEN 
					delete(low,1,pos('x',low)); 
				zeile := concat(zeile,',low,',');
				END
				ELSE
				IF obj[n]^.flag = 'LASTOB' THEN zeile := concat(zeile,'LAST_OB',',')
				ELSE
					zeile := concat(zeile,obj[n]^.flag, ','); 
				writev(d_s,obj[n]^.xp); writev(d2_s,obj[n]^.yp); 
				zeile : =concat(zeile,d_s,',',d2_s,',',obj[n]^.pos,','); ) ;
				IF (obj[n]^.typ = 'G_BOX' ) OR (obj[n]^.typ = ' G_IBOX' ) THEN
				BEGIN
					teile_long(obj[n]^.spec,high,low);
					high := concat('$',high); 
					zeile := concat(zeile,high,',','$',low,');');
				END;
				IF (obj[n]^.typ ='G_BUTTON') OR (obj[n]^.typ 'G_STRING') THEN
					zeile := concat(zeile,'0,$1140);');
				IF (obj[n]^.typ ='G_TEXT') OR (obj[n]^.typ ='G_FTEXT')
				OR (obj[n]^.typ ='G_BOXTEXT') OR (obj[n]^.typ ='G_FBOXTEXT') THEN
				BEGIN
					teile_long(obj[n]^.spec,high,low); 
					conv_hex(low); 
					readv(low,nummer); 
					teile_long(ted[nummer + 1]^.rahmen,high,low);
					zeile := concat (zeile, low, ','); 
					teile_long(ted[nummer + 1]^.sp,high,low); 
					zeile := concat(zeile,'$',low,');');
				END;
			writeln(quelle,zeile);
	END;
END;

{ ---------------------------------- }

PROCEDURE make_text ;
	VAR d_s,zeile	:	str255;
	ted_nummer,m,n,nummer,xx : integer;
BEGIN
	zeile := ''; writeln(quelle,zeile);
	FOR n:=2 TO ob_zahl + 1 DO 
	BEGIN
		IF (obj[n]^.typ ='G_BUTTON' ) OR (obj[n]^.typ='G_STRING') THEN
		BEGIN
			d_s := obj[n]^.spec; m:=pos('L',d_s); 
			delete(d_s,m,1); m:=pos('x',d_s); delete(d_s,l,m);
			conv_hex(d_s) ;
			readv (d_s, nummer) ; d_s := st [nummer +1]^; 
			writev(zeile,n-1); 
			zeile := concat ('Set_DText (wurzel,box[',zeile, ' ],',chr (39), d_s,chr(39),',system_font,TE_CENTER);'); 
			writeln(quelle,zeile) ;
		END;
		IF (obj[n]^.typ ='G_TEXT') OR (obj[n]^.typ ='G_BOXTEXT') THEN
		BEGIN
			d_s := obj[n]^.spec; m := pos('L',d_s);
			delete(d_s,m,1); m:= pos('x',d_s); delete(d_s,1,m);
			readv(d_s,ted_nummer);
			d_s := ted[ted_nummer+1]^.text;
			m := pos('L',d_s); IF m > 0 THEN delete (d_s,m,1); 
			m := pos('x',d_s); IF m > 0 THEN delete(d_s,m,1);
			readv(d_s,nummer); nummer := succ(nummer); 
			readv(ted[ted_nummer + 1]^.just,xx);
			IF xx=0 THEN ted[ted_nummer+1]^.just:='TE_LEFT';
			IF xx=1 THEN ted[ted_nummer+1]^.just:='TE_RIGHT';
			IF xx=2 THEN ted[ted_nummer+1]^.just:='TE_CENTER' 
			writev(zeile,n-1); 
			zeile := concat('SET_DTEXT(wurzel,box[',zeile,'],',chr(39) , st[nummer]^,chr(39),',');
			zeile := concat(zeile,ted[ted_nummer+1]^.font,',',ted[ted_nummer + 1]^.just,');');
			writeln(quelle,zeile);
		END;
		IF (obj[n]^.typ ='G_FTEXT') OR (obj[n]^.typ ='G_FBOXTEXT') THEN
		BEGIN
			d_s := obj[n]^.spec; m := pos('L',d_s);delete(d_s,m,1);
			m:=pos('x',d_s); delete (d_s, 1, m); conv_hex (d_s); readv(d_s,ted_nummer); 
			d_s :=ted[ted_nummer+1]^.text; conv_hex(d_s); 
			readv(d_s,nummer);writev(zeile,n-1); 
			zeile :=concat('Set_DEDIT(wurzel,box[',zeile,'],',chr(39), st[nummer+2]^,chr(39)); 
			zeile := concat(zeile,',',chr(39),st[nummer+3]^,chr(39),',');
			zeile := concat(zeile,chr(39),st[nummer+1]^,chr(39),',',ted[ted_nummer +1]^.font,','); 
			IF ted [ted_nummer+1]^.just = '1' THEN ted[ted_nummer+1]^.just :='TE_RIGHT';
			IF ted[ted_nummer+1]^.just = '0' THEN ted[ted_nummer+1]^.just :='TE_LEFT';
			IF ted[ted_nummer+1]^.just = '2' THEN ted[ted_nummer+1]^.just :='TE_CENTER';
			zeile = concat(zeile,ted[ted_nummer+1]^.just, ');');
			writeln(quelle,zeile);
		END;
	END;
END;

{ ----------------------------------- }

PROCEDURE make_state;
VAR n : integer;
	zeile : string;
BEGIN
	FOR n: = 2 TO ob_zahl + 1 DO 
	BEGIN
		IF NOT (obj[n]^.state = 'NORMAL') THEN 
		BEGIN 
			writev(zeile,n-1); 
			zeile :=concat('Obj_SetState(wurzel,box[',zeile,'],',obj[n]^. state, ',FALSE);');
			writeln(quelle,zeile);
		END;
	END;
	writeln(quelle); writeln(quelle,'center_dialog(wurzel);');
END;

{ ---------------------------------- }

BEGIN { of MAIN PRORAM } 
	clear_home;
	gotoxy(10,3);writeln('****Ressource-Converter****'); 
	gotoxy(10,4);writeln('RCS.C - Files zu Pascal ST+.INC - Files');
	gotoxy(10,5);writeln('S.Behler 1988 ’ ); gotoxy(10,8);
	writeln('Bitte geben Sie den Namen der zu konvertierenden *.C -Datei an' );
	gotoxy(10,9);
	writeln('und benutzen Sie unbedingt den vollständigen Pfadnamen...!');
	gotoxy(10,10);readln(name);
	gotoxy(10,13);writeln('Name der Eingabedatei: ',name);
	gotoxy(10,8 ); end_of_line;
	writeln('Bitte geben Sie den gewünschten Namen für das *.INC - File an '); 
	gotoxy(10,10); end_of_line; readln(name_2); 
	gotoxy(10,14);writeln('Name der Ausgabedatei:',name_2);
	reset(quelle,name); 
	lese_strings(st,st_zahl);
	gotoxy(10,15); writeln('Anzahl der Strings in der Resource: ',st_zahl);
	lese_teds (ted,ted_zahl);
	gotoxy(10,16); writeln('Anzahl der Textobjekte:',ted_zahl);
	lese_objects(obj,ob_zahl); 
	obj_offset(obj);
	gotoxy(10,17); writeln('Anzahl der Objekte in der Ressource: ',ob_zahl);
	close(quelle); 
	rewrite(quelle,name_2);
	make_item; make_text; make_state; close(quelle); 
	gotoxy (10,19); writeln ( 'Konvertierung abgeschlossen.');
END.

Listing 1: Ergebnis des Demo-Programmes

#define TOOBJ 0 
#define FREEBB 0 
#define FREEIMG 0 
#define FREESTR 17

char *rs_strings[] = {
"RSC - Konverter",
"",
"",
"gefaellt mir",
"gut",
"mittel",
"gar nicht",
"_____",
"Anregungen:____________",
"XXXXXXXXXXXXXXXXX",
"ABBRUCH",
"by Seth Behler",
"",
"",
"programmiert in ST PASCAL +",
"",
""};

long rs_frstr[] = {
0};

BITBLK rs_bitblk[] = {
0};

long rs_frimg[] = {
0};

ICONBLK rs_iconblk[] = {
0};

TEDINFO rs_tedinfo[] = {
0L, 1L, 2L, 3, 6, 2, 0x1141, 0x0, -3, 16,1,
7L, 8L, 9L, 3, 6, 2, 0x1180, 0x0, -1, 7,29,
11L, 12L, 13L, 5, 6, 0, 0x1180, 0x0, -1, 15,1,
14L, 15L, 16L, 5, 6, 2, 0x280, 0x0, -1, 28,1};#

OBJECT rs_object[] = {
-1, 1, 10, GJBOX, NONE, OUTLINED, 0x21100L, 0,0, 61,18, 
2, -1, -1, G_BOXTEXT, NONE, NORMAL, 0x0L, 16,1, 30,1,
7, 3, 6, G_BOX, NONE, NORMAL, 0xFE1111L, 10,4, 42,5,
4, -1, -1, G_STRING, NONE, NORMAL, 0x3L, 15,1,	12,1,
5, -1, -1, G_BUTTON, 0x15, NORMAL, 0x4L, 1,3, 8,1,
6, -1, -1, G_BUTTON, 0x15, NORMAL, 0x5L, 17,3, 8,1,
2, -1, -1, G_BUTTON, 0x15, NORMAL, 0x6L, 30,3, 10,1,
8, -1, -1, G_FBOXTEXT, EDITABLE, NORMAL, 0x1L, 10,10, 42,2,
9, -1, -1, G_BUTTON, 0x47, NORMAL, 0xAL, 10,13, 42,2,
10,	-1, -1, G_TEXT, NONE, NORMAL, 0x2L, 25,3, 1034,1536, 
0, -1, -1, G_BOXTEXT, LASTOB, NORMAL, 0x3L, 12,16, 37,1 };

long rs_trindex[] = {
0L};

struct foobar { 
	int	dummy;
	int	*image;
	} rs_imdope[] = {
0};

#define NUM_STRINGS 17 
#define NUM_FRSTR 0 
#define NUM_IMAGES 0 
#define NUM_BB 0 
#define NUM_FRIMG 0 
#define NUM_IB 0 
#define NUM_TI 4 
#define NUM_OBS 11 
#define NUM_TREE 1

Listing 2: C-File einer Dialogbox ( mit DRI-RCS erstellt)


{ demo.inc }

VAR wurzel	: dialog_ptr;
	box 	: array [1..10] of integer;
BEGIN
	wurzel := new_dialog(10,0,0, 61,18);
	box[1] := add_DITEM(wurzel,G_BOXTEXT,NONE,16,1, 30,1,-3, $1141);
	box[2] := add_DITEM(wurzel,G_BOX, NONE, 10,4, 42,5,$FE, $1111);
	box[3] := add_DITEM(wurzel,G_STRING,NONE,25,5, 12,1,0, $1140);
	box[4] := add_DITEM(wurzel,G_BUTTON, $15,11,7, 8,1,0, $1140);
	box[5] := add_DITEM(wurzel,G_BUTTON,$15,27,7, 8,1,0, $1140);
	box[6] := add_DITEM(wurzel,G_BUTTON,$15,40,7, 10,1,0, $1140);
	box[7] := add_DITEM(wurzel,G_FBOXTEXT,EDITABLE,10,10, 42,2,-1,$1180);
	box[8] := add_DITEM(wurzel,G_BUTTON,$47,10,13, 42,2,0, $1140);
	box[9] := add_DITEM(wurzel,G_TEXT,NONE,25,3, 1034,1536, -1,$1180);
	box[10]:= add_DITEM(wurzel, G_BOXTEXT, LAST_OB, 12,16,37,1,-1,$280);
	Set_DText(wurzel,box[1],'RSC - Konverter',3,TE_CENTER); 
	Set_DText(wurzel,box[3],'gefaellt mir',system_font,TE_CENTER);
	Set_DText(wurzel,box[4],'gut',system_font,TE_CENTER); 
	Set_DText(wurzel,box[5],'mittel',system_font,TE_CENTER); 
	Set_DText(wurzel,box[6],'gar nicht',system_font,TE_CENTER);
	Set_DEDIT(wurzel,box[7],'Anregungen:____________', 'XXXXXXXXXXXXXXXXX','_______',3,TE_CENTER);
	Set_DText(wurzel,box[8],'ABBRUCH',system_font,TE_CENTER) ;
	Set_DText(wurzel,box[9],'by Seth Behler',5,TE_LEFT); 
	Set_DText(wurzel,box[10],'programmiert in ST PASCAL +',5,TE_CENTER);

	center_dialog(wurzel);

Listing 3: Das als Pascal-Include-File gewandelte C-File

program rsc_demo;
$I
{ demonstriert die Lauffähigkeit des Programms rsc_pas.tos und }
{ der damit erzeugten Include-Dateien..}

const
	{$I gemconst.bib}
type
	{$I gemtype.bib}
	{$I gemsubs.bib}

PROCEDURE do_it;
{$I A:\demo.inc} { die mit rsc_to_pas erzeugte datei }
	show_dialog(wurzel) ;
	readln;
	end_dialog(wurzel);
	delete_dialog(wurzel);
END;	{	of	do_it}

BEGIN
	IF init_gem >=0 THEN
	BEGIN
		clear_screen;
		hide_mouse;
		do_it;
		show_mouse;
	END;
	EXIT_GEM;
END.

Listing 4: Einbindung des Include-File in den Quelltext


Seth Behler
Aus: ST-Computer 10 / 1988, Seite 80

Links

Copyright-Bestimmungen: siehe Über diese Seite