PDA

View Full Version : Displayfile Pointer



THH
19-12-05, 09:52
Hallo allesamt

Nochmal Pointer displayfile

Trotz der Antworten kann ich mir das nicht vorstellen das es nicht geht
deswegen nochmal
mit etwas source

Funktion wie folg
unterroutine
in #feld ist der Displayfedname (bekommen mit return courser lock)
in dspfld1 ist dann der wert, der da hinein soll
deklaration wie folgt

BILD *
DSPFLD *
D FELD_PTR *
D FELD_PTR1 S 10 BASED (F)
D PTR1 S 10 BASED (P)

D DSPFLD1 DS 0
D FLDNAME1 10 INZ(' ')
D FLDADR1 *

Subroutine

$PROMPT begsr
MOVEL #FELD FLDNAME1
EVAL F = %ADDR(#FELD)
EVAL DSPFLD= %ADDR(WSKENN)
CALL 'PS228'
PARM #PGM
PARM DSPFLD1
EVAL P = %ADDR(DSPFLD1)
EVAL DSPFLD = %ADDR(PTR1)
ENDSR

ev weiss doch jemand Rat.
ev kann auch der Ausgabepuffer
geändert werden, da ja zeile und spalte
des feldes mitkommt.

hoffe doch auf rat (ev mit beispiel)

mfg
THH

Fuerchau
19-12-05, 10:32
%ADDR liefert immer nur die Adresse des benannten Feldes, dass zur Compile-Zeit bekannt ist !!!
Eine indirekte Adressierung ist in RPG nicht möglich. Genausowenig gibt es die Möglichkeit an den Inhalt eines Feldes per %ADDR zu kommen.
%ADDR(#FELD) liefert also die Adresse von #FELD und nicht des Feldnamens, der darin steht.

Da du deine Displayfile ja kennst, musst du halt einen select kodieren:

select
when #feld = 'NAME1'
eval fldadr1 = %addr(name1)
when #feld = 'NAME2'
eval fldadr1 = %addr(name1)
:
:
endsl

Dein aufgerufenes Programm kann dann mittels Referenz direkt auf das Zielfeld updaten:

D DSPFLD1 DS
D FLDNAME1 10
D FLDADR1 *

D FLDINH S 10 based(FLDADR1)

*entry plist
parm dspfld1


Einfacher und übersichtlicher ist es aber, wenn du ganz einfach ein Prototype deines PromptPGM's deklarierst und im Select direkt das Programm mit den benannten Argumenten aufrufst:

select
when #feld = 'NAME1'
callpr myprog(#feld:name1)

when #feld = 'NAME2'
callpr myprog(#feld:name2)
:
:
endsl