©
serviceprofessionalgmbh
Wer kennt das Problem nicht? Man braucht mal kurz ein kleines Panel um einen Benutzerhinweis auszugeben. Klar, schnell gemacht. Aber:
Das alles in ein einziges Programm? Ja! Das einzige Problem dabei: Der Window-Parameter im Panel erlaubt keine Variablen
für die Größenangaben Breite und Höhe. Hier haben wir uns (leider) so behelfen müssen, dass
wir 6 Panels unterschiedlicher Größe kodiert haben, die das Programm aber abhängig von der darzustellenden Nachricht
selbst auswählt. Grundsätzlich hätte man das Panel natürlich zur Laufzeit aus dem Programm heraus schreiben können,
aber dagegen spricht die Performance. Ein zweiter Grund ist, dass viele Leute nicht damit klarkommen, ein Panel (siehe PANELID ON)
nach Dialogende in der Panelverkettung nicht zu finden.
Aufrufbeispiel:
puwinm#i = "Panel-Tilel" ,
"|[" ,
"|[Möchten Sie fortfahren?" ,
"|[" ,
"|Eingabeø ](J/N)"
address ispexec "vput puwinm#i"
call msgwin$e "AUTO"
address ispexec "vget (puwinm#o pulstrc)"
if pulstrc > 0 then return
parse var puwinm#o . "ø" antwort "]"
Das Programm
/* REXX * MSGWIN$E ****************************************************
* *
* Funktion: Window fuer wahrfreie Meldungsausgabe *
* RC 0 ==> Verlassen des Panels mit ENTER *
* RC 8 ==> Verlassen des Panels mit END *
* Texteingabe PUWINM#I aus SHARED-Pool *
* Textausgabe PUWINM#O in SHARED-Pool falls ENTER *
* *
**********************************************************************/
parse source . PGMTYP .
if PGMTYP = "FUNCTION" then arg CSR_POS,ZEILE,SPALTE,DUMMY
else arg CSR_POS ZEILE SPALTE DUMMY
address ispexec
"control errors return"
"vget (PUWINM#I)"
call parse_message
call set_panel_parms
call center_high
call set_msgdata
if CSR_POS = "AUTO" then CSR_POS = pos("ø",MSGDATA) + 1
if CSR_POS < 1 ! CSR_POS > MAXC then CSR_POS = 1
"addpop row("ZEILE") column("SPALTE")"
"display panel(&PANEL) cursor(msgdata) csrpos("CSR_POS")"
PULSTRC = RC
PUAKTRC = RC
"rempop"
drop MSGTITLE ZWINTTL
if pos("ø",MSGDATA) > 0 & PULSTRC = 0 then do
PUWINM#O = MSGDATA
"vput (PUWINM#O)"
end
else "verase (PUWINM#O)"
"vput (PULSTRC PUAKTRC)"
return PULSTRC
parse_message:
/******************************************************************
* Erzeugen der Meldungszeilen. Separator ist "|" *
******************************************************************/
drop W.
MAX_B = 0
MAX_H = 0
P = pos("|",PUWINM#I)
parse var PUWINM#I MSGTITLE "|" MSG
do I = 1 while strip(MSG) <> ""
MAX_H = MAX_H + 1
parse var MSG W.I "|" MSG
if length(W.I) > MAX_B then MAX_B = length(W.I)
end
return
center_high:
/******************************************************************
* Zentriert hoch, wenn mehr als eine Zeile nach unten uebrig *
******************************************************************/
TMP = H - MAX_H
if TMP < 2 then return
do I = 1 while W.I <> "W."I
TEMP.I = W.I
end
CNT = TMP % 2
do I = 1 to CNT
W.I = "["
end
do I = 1 while TEMP.I <> "TEMP."I
CNT = CNT + 1
W.CNT = TEMP.I
end
MAX_H = CNT
return
set_msgdata:
/******************************************************************
* Concatiniert den Meldungs-String (Dynamic AREA) *
******************************************************************/
MSGDATA = ""
do LINES = 1 to MAX_H
MSGDATA = MSGDATA !! center(W.LINES,B)
end
return
set_panel_parms:
/******************************************************************
* Variablen dynamische Panelansteuerung *
******************************************************************/
NAMES = "MSG1D MSG2D MSG3D MSG4D MSG5D MSG6D"
BREIT = "35 40 50 60 65 75"
HOCH = "5 8 10 12 15 22"
ZPOS = "8 7 6 5 3 1"
SPOS = "20 15 9 5 3 0"
MPOS = "185 320 500 720 975 1716"
do I = 1 to words(BREIT)
B = word(BREIT,I)
if MAX_B-1 <= B then do
leave
end
end
do I = 1 to words(HOCH)
H = word(HOCH,I)
if MAX_H <= H then do
leave
end
end
interpret "P = max("wordpos(B,BREIT)","wordpos(H,HOCH)")"
if datatype(ZEILE,"W") = 0 then ZEILE = word(ZPOS,P)
if datatype(SPALTE,"W") = 0 then SPALTE = word(SPOS,P)
B = word(BREIT,P)
H = word(HOCH,P)
PANEL = word(NAMES,P)
MAXC = word(MPOS,P)
return
Die Panels
)ATTR default($+_)
# area(dynamic) extend(on)
] type(dataout) intens(low) caps(off) color(white)
[ type(dataout) intens(low) caps(off) color(blue)
} type(dataout) intens(low) caps(off) color(yellow)
{ type(dataout) intens(low) caps(off) color(red)
~ type(dataout) intens(low) caps(off) color(red) hilite(reverse)
õ type(dataout) intens(low) caps(off) color(turq)
\ type(dataout) intens(low) caps(off) color(green)
^ type(dataout) intens(low) caps(off) color(pink)
ø type(datain) intens(low) caps(on)
)BODY window(35,5) /* MSG1D
)BODY window(40,8) /* MSG2D
)BODY window(50,10) /* MSG3D
)BODY window(60,12) /* MSG4D
)BODY window(65,15) /* MSG5D
)BODY window(75,22) /* MSG6D
#msgdata #
)INIT
if (&msgtitle = &z)
&zwinttl = &z
else
&zwinttl= &msgtitle
)END
zurück zu REXX mit Dialog Manager