© 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