-
Dialogprogramm zum Anzeigen von Nachrichten
Hallo,
ich habe vor das ich ein Dialogprogramm(Prototyp) schreibe,
wo Nachrichten dem User aller Art in einem Window (Sfl-Format) angezeigt werden soll.
Als Aufruf hätte ich mir wie folgt vorgestellt
TextBox(anzuzeigendenText:Titel vom Window)
Auf was sollte ich achten/berücksichtigen?
Gib es ein Beispiel im Internet?
Dank im Voraus
TARKI
-
Ruf' einfach das API QUILNGTX (Display Long Text) auf und übergib den Nachrichten-Text.
Alles andere wie Seitenwechsel und Zeilenumbruch wird automatisch gesteuert.
QUILNGTX (Display Long Text)
Birgitta
-
Auf das API bin ich vorher schon im Internet aufmerksam geworden.
Ich möchte ja nur einen Text ausgeben, aber das API benötigt ja paar Parameter mehr die ich nicht anzeigen möchte:
DMsgBox pr extpgm('QUILNGTX')
D LngTxt 65535A
D TextLen 10i 0 const
D TxtTitle 7a
D TxtMsgF 20a
D ErrCode 16a
Mein Programm das ich mal ausprobiert habe:
Code:
Hdftactgrp(*no) actgrp('QILE')
Hoption(*srcstmt:*nodebugio)
D*
DDSPTXTMSG PR
D InString 65535A
D InTitle 27 options(*nopass)
DDSPTXTMSG PI
D InString 65535A
D InTitle 27 options(*nopass)
DMsgBox pr extpgm('QUILNGTX')
D LngTxt 65535A
D TextLen 10i 0 const
D TxtTitle 7a
D TxtMsgF 20a
D ErrCode 16a
d Text s 65535A inz(*blank)
d String s 65535A inz(*blank)
d Title s 7a inz(*blank)
d MessageF s 20a inz(*blank)
d Error s 16a
dTitleString s 27 varying inz(*blank)
d tx s 2 0
dBlankString s 27 inz(*blank)
D JobType S 1
DRtvJobA pr extpgm('QUSRJOBI')
D rtv_Data 100a
Drtv_Length 10i 0const
Drtv_Format 8a
D rtv_Job 26a
Drtv_IntJob 16a
D p_Rcvr S 100
D p_Format S 8 INZ('JOBI0100')
Dp_ThisJob S 26 INZ('*')
D p_IntJob S 16
/FREE
title = *blanks;
messagef = *blanks;
IF %parms = 1;
String = inString;
ENDIF;
IF %parms = 2;
String = inString;
TitleString = %trim(inTitle);
ENDIF;
IF TitleString <> *blank;
IF %len(titlestring)< 27;
tx = ((27-%len(titlestring))/2);
titlestring =%subst(blankstring:1:tx) + titlestring;
titlestring = titlestring
+%subst(blankstring:1:%len(titlestring));
IF%subst(titlestring:1:1)=*blank;
%subst(titlestring:1:1)='[';
endif;
IF%subst(titlestring:27:1)=*blank;
%subst(titlestring:27:1)=']';
ENDIF;
title=%subst(titlestring:1:7);
messageF=%subst(titlestring:8:20);
ENDIF;
ENDIF;
Text=%trim(String);
Error='';
RtvJoba( p_Rcvr: %len(p_Rcvr): p_Format:p_ThisJob: p_IntJob);
JobType = %SUBST(P_Rcvr : 61 :1);
//* B/atch I/nteractive P/restart?
IF JobType = 'I';
Text=%trim(String);
Error='';
MsgBox(Text: %len(Text): Title:MessageF: Error);
ENDIF;
RETURN;
/END-FREE
Ist es möglich den Aufruf wie folgt zu gestalten?
MsgBox(Text:Title);
-
Was hindert dich daran?
Du solltest die Parameter als VARYING definieren, so dass du hier die Länge abfragen kannst.
D MyMsgBox PR
D Text 32765 varying const
D Title 132 varying const
Mehr als 32K Text liest sowieso niemand.
Was den Titel angeht, so kannst du dir in der QTEMP dynamisch eine MSGF anlegen und per
ADD/CHGMSGD (oder dem API dazu) einer festen Nachricht immer den Titel zuordnen.
-
Ich hätte das schon versucht,
Code:
D DSPTXTMSG PR
D InString 65535A
D InTitle 27 options(*nopass)
D*
D DSPTXTMSG PI
D InString 65535A
D InTitle 27 options(*nopass)
D*
D MyMsgBox PR extpgm('QUILNGTX')
D Text 32765 varying const
D Title 132 varying const
DMsgBox pr extpgm('QUILNGTX')
D LngTxt 65535A
D TextLen 10i 0 const
D TxtTitle 7a
D TxtMsgF 20a
D ErrCode 16a
MsgBox(Text: %len(Text): Title: MessageF: Error);
MyMsgBox(Text:Title);
aber bekomme die Fehlermeldung:
Code:
Nachrichten-ID . . . . : RNQ0202 Bewertung . . . . . . : 99
Nachrichtenart . . . . : Anfrage
Sendedatum . . . . . . : 14.06.12 Sendezeit . . . . . . : 12:04:48
Nachricht . . . : Der Aufruf an *LIBL/QUILNGTX wurde fehlerhaft beendet (C G
D F).
Ursache . . . . : RPG-Prozedur DSPTXTMSG in Programm H_TESTOBJ/DSPTXTMSG hat
bei Anweisung 007601 Programm oder Prozedur *LIBL/QUILNGTX aufgerufen; der
Aufruf wurde fehlerhaft beendet. Ist der Name *N, handelte es sich bei dem
Aufruf um einen Bindeaufruf nach Prozedurzeiger.
Fehlerbeseitigung: Das Jobprotokoll auf weitere Informationen zur
Fehlerursache prüfen und den für die Programmpflege verantwortlichen
Benutzer benachrichtigen.
Auswahlmöglichkeiten . . . . . . . . . . . . . . . . . . . . . . . . . :
D -- Einen RPG-formatierten Speicherauszug erstellen.
S -- Einen Systemspeicherauszug erstellen.
Was mache ich beim Aufruf Falsch?
Ist das API nur für MSGF oder ist es anderes auch nutzbar?
Dank im Voraus
-
ErrCode ist eine Struktur, die korrekt initialisiert werden muss:
d ErrCode ds qualified inz
d BytesAvalable 10I 0
d BytesReturn 10I 0
d MsgId 7
d Reserve 1
d MsgDta 512 <= kann beliebig sein
Für die Prozedurdefinition:
D pErrCode likeds(errCode)
c/free
ErrCode.BytesAvail = %size(ErrCode);
errCode.BytesReturn = *Zero;
callpr ... (...:ErrCode);
if (errCode.bytesReturn > *Zero);
// Fehler in ErrCode.MsgId
endif;
-
Ich hätte das so umgesetzt wie oben beschrieben, aber es funktioniert leider nicht.
Was mache ich falsch?
Code:
/TITLE
H dftactgrp(*no) actgrp('QILE')
H option(*srcstmt:*nodebugio)
H DECEDIT('0,') DATEDIT(*YMD)
H datfmt(*iso)
D* externe prozedur einer Messagebox
D DSPTXTMSG PR
D InString 65535A
D InTitle 132 options(*nopass)
D*
D DSPTXTMSG PI
D InString 65535A
D InTitle 132 options(*nopass)
D*
D MSGBOX PR EXTPGM('QUILNGTX')
D ParmTEXT 65535 varying const
D ParmTitle 132 varying const
D pErrCode LIKEDS(ErrCode)
D
D ErrCode DS QUALIFIED
D BytesAvalable 10I 0 INZ(*ZEROS)
D BytesReturn 10I 0 INZ(*ZEROS)
D MSGID 7 INZ(*BLANKS)
D RESERVE 1 INZ(X'00')
D EXCEPTDATA 65500 INZ(*BLANKS)
D
D MSGTEXT S 65535 VARYING
D MSGTITLE s 132 varying inz(*blank)
/FREE
ErrCode.BytesAvalable = %size(ErrCode);
ErrCode.BytesReturn = *ZEROS;
IF %parms = 1;
MSGTEXT = inString;
ENDIF;
IF %parms = 2;
MSGTEXT = inString;
MSGTITLE = %trimr(inTitle);
ENDIF;
MSGTEXT = '+
D -- Einen RPG-formatierten Speicherauszug erstellen. +
S -- Einen Systemspeicherauszug erstellen.';
callp MSGBOX(MSGTEXT: MSGTITLE: ErrCode);
Return;
/END-FREE
-
Du musst das API schon mit ALLEN REQUIRED! Parametern aufrufen und kannst nicht einfach irgendwo was weglassen!
Das war/ist meine Prozedur, die bereits seit ein paar Jahrhunderten problemlos läuft:
1. Parameter und Referenz-Datenstrukturen:
Code:
D DspWdwTxt PR ExtPgm('QUILNGTX')
D ParmText 65535 const options(*VarSize)
D ParmLenText 10I 0 const
D ParmMsgId 7A const
D ParmQualMsgFile...
D 20A const
D ParmError1 likeDS(DS_Error1)
* Error Datenstruktur
D DS_Error1 DS Qualified
D ByteProv 10I 0 inz(%Size(DS_Error1))
D ByteAvail 10I 0 inz(*Zeros)
D MsgId 7 inz(*Blanks)
D Reserved 1 inz(x'00')
D ExceptData 256 inz(*Blanks)
2. Aufruf aus RPG
Code:
H DEBUG
*-----------------------------------------------------------------*
D/COPY QPROLESRC,DSPWDWTXT
D BspText S 65535 varying
*-----------------------------------------------------------------*
/Free
BspText = 'Dies soll nur ein kurzer Text sein, um das +
API QUILNGTX auszuprobieren! +
Das UIM API QUILNGTX (Display Long Text) stellt eine +
einfache Möglichkeit dar, einen beliebigen Text +
in einem Fenster anzuzeigen. +
Das Erstellen einer Display-File +
ist dazu nicht erforderlich.';
DspWdwTxt(BspText: %Len(BspText): *Blanks: *Blanks: DS_Error1);
*InLR = *On;
/End-Free
3. Wrapper Procedure:
3.1. Prototyp
Code:
D DspWDW PR ExtProc('DSPWDW')
D ParmText 65535 const varying
3.2. Wrapper Prozedur
Code:
H DEBUG NoMain
*-----------------------------------------------------------------*
D/COPY QPROLESRC,DSPWDWTXT
*------------------------------------------------------------------*
P DspWDW B Export
D DspWdW PI
D ParmText 65535 const varying
/Free
DspWdWTxt(ParmText: %Len(ParmText): *Blanks: *Blanks: DS_Error1);
Return;
/End-Free
3.3. Aufruf Wrapper Prozedur
Code:
H DEBUG
*------------------------------------------------------------------*
D/COPY QPROLESRC,DSPWDWTXT
D BspText S 65535 const varying
*-------------------------------------------------------------------*
/Free
BspText = 'Dies soll nur ein kurzer Text sein, um das +
API QUILNGTX auszuprobieren!';
DspWDW(BspText);
DspWDW('Der Text kann auch direkt übergeben werden.');
*INLR = *ON;
/End-Free
Birgitta
-
Danke für die ausführliche Infos.
Eine allerletzte Frage:
Kann ich auch einen Zeilenumbruch einarbeiten?
Mit
D CrLf C const(x'0D25')
hat es leider nicht funktioniert.
-
Versuche es mal mit "/N".
Similar Threads
-
By Koelch400 in forum IBM i Hauptforum
Antworten: 4
Letzter Beitrag: 15-08-02, 09:53
-
By hpw in forum NEWSboard Windows
Antworten: 6
Letzter Beitrag: 12-02-02, 15:27
-
By sirdidi in forum IBM i Hauptforum
Antworten: 1
Letzter Beitrag: 11-01-02, 12:12
-
By Arbi in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 16-10-01, 19:06
-
By Burgy Zapp in forum NEWSboard Server Software
Antworten: 0
Letzter Beitrag: 03-04-01, 19:07
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks