PDA

View Full Version : DSPMOD (*DS3 oder *DS4) ermitteln



mahones
04-04-12, 09:03
Schönen guten Morgen!

Ich habe hier bereits einiges gelesen was die Ausgabe von Satzformaten, die eine unterschiedliche "Auflösung" haben, angeht.
Da geht es meistens darum, dass man 2 DSPF verwenden sollte, und diese dann je nach "Zustand" verwendet.

Meine Frage ist jetzt: wie komme ich an die Info, wie meine Emulation konfiguriert ist?
Sprich: steht in irgendeiner INFDS o.ä. etwas diesbezüglich?

Danke für eure Unterstützung

ExAzubi
04-04-12, 09:06
Über das API

QsnRtvMod

kannst du den "Kontext" ermitteln lassen, auf welcher Auflösung du jetzt unterwegs bist.

Viele Grüße

Fuerchau
04-04-12, 09:25
Ich definiere einfach die DSPF per USROPN (UC).
Schlägt der Open fehl (%error() oder *INxx), ist der Modus halt nicht verfügbar.

Zu beachten ist, dass eine DSPF mit beiden Modi nur geöffnet werden kann, wenn beide Modi auch zulässig sind.

mahones
04-04-12, 09:52
Danke schonmal für die schnellen Antworten!

In meinem konkreten Fall habe ich in der DSPF schon beide Fälle vorgesehen:

DSPSIZ(27 132 *DS4 24 80 *DS3)

und das Programm läuft auch in beiden Modi.
Aber ich will bei einem 24 x 80 andere Sachen steuern / anzeigen.
Zum Beispiel soll ein Text angezeigt werden wie "PGM für 27 x 132 optimiert" - also BZ-gesteuert...

Mit dem QsnRtvMod komme ich irgendwie nicht weiter - da fehlen noch Sachen, um die Bindeschritte zu schaffen!?

Gibt es da "gute" Beispiele, wie man das einsetzt? Wenn ich suche, finde ich nur Fragmente, bzw. Codeschnipsel, die aber auch die bei mir fehlenden Komponenten nicht erwähnen.

Pikachu
04-04-12, 09:57
Mit dem QsnRtvMod komme ich irgendwie nicht weiter - da fehlen noch Sachen, um die Bindeschritte zu schaffen!?
Welche Programmiersprache?

mahones
04-04-12, 10:02
Welche Programmiersprache?

ILE RPG

...meinetwegen auch CLLE - dort habe ich schon folgendes gefunden (Umwandlung schlug aber mit "CPD0791 - Keine Kennsätze im Programm verwendet" fehl):


PGM

DCL VAR(&DSPMODE) TYPE(*CHAR) LEN(1)
DCL VAR(&SSNID) TYPE(*INT) LEN(4)
DCL VAR(&ERRDS) TYPE(*CHAR) LEN(16) +
VALUE(X'0000000000000000')
CALLPRC PRC('QSNRTVMOD') PARM((&DSPMODE *BYREF) +
(&SSNID *BYREF) (&ERRDS *BYREF))
SNDPGMMSG MSG('DISPLAY SIZE IS SET TO ' *BCAT &DSPMODE)

ENDPGM

Pikachu
04-04-12, 10:09
"CPD0791 00 Keine Kennsätze im Programm verwendet." ist nur eine Warnung.

Beim CALLPRC ist der Fehler: "QsnRtvMod" schreibt sich mit Groß- und Kleinbuchstaben!

mahones
04-04-12, 11:31
Ich habe jetzt sowohl das CL korrigiert, als auch im RPGLE folgendes eingebaut:


D DSPMOD S 1A

D RetrieveDisplayMode...
D PR ExtProc('QsnRtvMod')
* Display Mode: '3' = Device is in 24x80 mode; '4' = 27x132 mode
D DspMod 1A
D EnvHandle 10I 0 options(*omit)
D ErrorCode likeds(#ErrorCode)
D options(*varsize : *omit)

D #ErrorCode DS qualified
D BytesProv 10I 0 inz(%size(#ErrorCode))
D BytesAvail 10I 0 inz(0)
D MsgId 7A inz('')
D 1A inz('')
D MsgData 128A inz('')

...

/FREE

RetrieveDisplayMode(DspMod: *omit : *omit);

/END-FREE

Aber ich bekomme immer nur den Wert '3' zurück - obwohl ich auf einer Sitzung definitiv 27x132 verwende - und das Programm dieses auch so anzeigt.

Wo ist der Fehler?

Fuerchau
04-04-12, 11:48
Ich denke nicht, dass es hilft:

The current display mode

Also, wenn das Terminal gerade ein 27x132-Format anzeigt, liefert es diese Info.

Wenn du allerdings deine DSPF implizit eröffnest, kommst du gar nicht soweit, da diese nicht geöffnet werden kann, wenn das Terminal den Modus nicht unterstützt!

Du benötigts halt 2 DSPF's, eine die nur den 24x80-Modus enthält, falls der Open mit dem 27x132-Modus fehlschlägt.