5.9 Format-Funktionen
Die Format-Funktionen müssen wie folgt in der Anwendung definiert werden:
DM_Boolean DML_default DM_CALLBACK Funktionsname
(
DM_FmtRequest far * req,
DM_FmtFormat far * fmt,
DM_Pointer *fmtPriv,
DM_FmtContent far * cont,
DM_Pointer *contPriv,
DM_FmtDisplay far * dpy
)
Die Format-Funktion wird im Dialogskript wie folgt definiert:
{export} function formatfunc Funktionsname ();
Parameter
DM_FmtRequest far * req
In diesem Parameter wird die eigentliche Aufgabe, die von der Format-Funktion übernommen werden soll, übergeben. Dazu wird im Element task dieser Struktur die Aufgabe übergeben.
DM_FmtFormat far * fmt
In diesem Parameter wird ein Zeiger auf formatspezifische Informationen übergeben.
DM_Pointer *fmtPriv
Im diesem Parameter können von der Format-Funktion formatspezifische private Daten abgelegt werden. Diese Daten sind nur der Anwendung bekannt und werden daher vom Dialog Manager nicht ausgewertet.
DM_FmtContent far * cont
In diesem Parameter wird ein Zeiger auf eine Struktur übergeben, in der der eigentliche Inhalt des Feldes gespeichert werden soll. Dazu müssen hier die entsprechenden Elemente immer aktualisiert werden.
DM_Pointer *contPriv
In diesem Parameter können von der Format-Funktion inhaltsspezifische private Daten abgelegt werden. Der Inhalt dieser Daten ist nur der Anwendung bekannt und wird daher nicht vom Dialog Manager ausgewertet.
DM_FmtDisplay far * dpy
In diesem Parameter wird ein Zeiger auf die Struktur übergeben, in der die eigentliche Anzeigeinformation gespeichert wird. Diese Struktur muss immer, wenn es notwendig ist, aktualisiert werden, damit das zugehörige Eingabefeld im Fenstersystem richtig angezeigt werden kann.
Beispiel
/* function for special handling of edittext user input */
function formatfunc My_Formatter ();
/* format resource using a format function */
format MyFormat "NN.NN.NN" My_Formatter;
Die Zuordnung dieser Funktion zu einem Eingabefeld erfolgt dann wie folgt:
/* here the date can be entered */
/* the single entered keys are checked by the formatfunc */
child edittext E1
{
.width 10;
.xleft 10;
.ytop 1;
.format MyFormat;
}
Diese Funktion wird dann wie folgt in C realisiert:
DM_Boolean DML_default DM_CALLBACK My_Formatter __6(
(DM_FmtRequest far *, req),
(DM_FmtFormat far *, fmt),
(DM_Pointer *, fmtPriv),
(DM_FmtContent far *, cont),
(DM_Pointer *, contPriv),
(DM_FmtDisplay far *, dpy))
{
DM_Boolean retval;
switch (req->task)
{
/*
** implement a format for inserting a date
** like 'dd.mm.yy'
** there should be some more code for correct handling
** (especially when 'delete' or 'backspace' is pressed)
**
** if the input is less than max
** the input is ok and can be processed
** by the DefaultFormatter
*/
case FMTK_modify:
{
char max = GetMax(dpy);
if ((!req->targs.modify.strlength
&& (dpy->curpos == dpy->length))
|| ((req->targs.modify.strlength == 1)
&& (req->targs.modify.string[0] >= '0')
&& (req->targs.modify.string[0] <= max)))
{
retval = DM_FmtDefaultProc(req, fmt,
(DM_FmtFormatDef **) (DM_Pointer) fmtPriv, cont,
(DM_FmtContentDef **) (DM_Pointer) contPriv, dpy);
}
else
retval = FALSE;
}
break;
default:
/*
** if no special handling is neccessary
** use standard formatter
*/
retval = DM_FmtDefaultProc(req, fmt,
(DM_FmtFormatDef **) (DM_Pointer) fmtPriv,
cont, (DM_FmtContentDef **) (DM_Pointer) contPriv, dpy);
break;
}
return (retval);
}
Siehe auch
Attribut .formatfunc in der „Attributreferenz“
Ressource format in der „Ressourcenreferenz“