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.
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);
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.
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