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.

Task

Bedeutung

FMTK_parseformat

Bei dieser Task soll der angegebene Formatstring geparst und eine Initialisierung der zu dem Format gehörenden Strukturen durchgeführt werden.

FMTK_cleanformat

Diese Task soll die abgelegten privaten Format-Informationen wieder freigeben, da das Format nicht mehr benötigt wird.

FMTK_create

Diese Task soll die Initialisierung der privaten Daten für den eigentlichen Inhaltstring durchführen, sodass nach dieser Task auf den Inhaltstring zugegriffen werden kann.

FMTK_destroy

Diese Task soll die in contPriv abgelegten privaten Daten wieder freigeben.

FMTK_setcontent

Es wird ein neuer Inhaltstring gesetzt. Dieser muss nach cont übertragen werden. Gegebenenfalls müssen die Daten in contPriv aktualisiert werden. Falls eine Display-Struktur vorhanden ist, muss der neue Inhaltstring formatiert werden und das Ergebnis in der Display-Struktur abgelegt werden.

FMTK_setselection

Es werden neue Positionen des Cursors und des Anfangs des Selektionsbereichs bezüglich des Inhaltsstrings gesetzt. Diese Werte müssen nach cont übertragen werden. Gegebenenfalls müssen die Daten in contPriv aktualisiert werden. Falls dpy vorhanden ist, müssen die entsprechenden Positionen bezüglich des formatierten Darstellungsstrings aktualisiert werden.

FMTK_setmaxchars

Es wird eine neue Maximallänge des Inhaltstrings gesetzt. Dieser muss nach cont übertragen werden. Gegebenenfalls müssen der Inhaltstring und die Daten in contPriv aktualisiert werden. Falls dpy vorhanden ist, muss der neue Inhaltstring formatiert werden und das Ergebnis in dpy abgelegt werden.

FMTK_formatcontent

Falls die Display-Struktur vorhanden ist, muss der neue Inhaltstring formatiert werden und das Ergebnis in dieser Struktur abgelegt werden.

FMTK_enter

Diese Task wird aufgerufen, wenn der editierbare Text, der dieses Format benutzt, den Fokus erhält. Sie muss keine speziellen Aufgaben durchführen.

FMTK_leave

Diese Task wird aufgerufen, wenn der editierbare Text, der dieses Format benutzt, den Fokus verliert. Sie muss keine speziellen Aufgaben durchführen.

FMTK_modify

Diese Task wird aufgerufen, wenn der formatierte Darstellungsstring in der Display-Struktur modifiziert werden soll. Die gewünschte Modifizierung muss so im Inhaltstring durchgeführt werden, dass dessen erneute Formatierung den modifizierten Darstellungsstring ergibt. Der Darstellungsstring muss ebenfalls entsprechend modifiziert werden.

FMTK_keynavigate

Diese Task wird aufgerufen, wenn die Positionen im Darstellungsstring relativ zu den bisherigen Positionen verändert werden sollen. Die jeweiligen Positionen im Inhaltsstring in "cont" sind so zu berechnen, dass sie den neuen Positionen im Darstellungsstring entsprechen. Die neuen Positionen im Darstellungsstring müssen in neuen Positionen im Inhaltstring umgerechnet und in der Display-Struktur abgelegt werden.

FMTK_setcursorabs

Diese Task wird aufgerufen, wenn die Positionen im Darstellungsstring auf einen neuen Wert gesetzt werden sollen. Die jeweiligen Positionen im Inhaltsstring in cont sind so zu berechnen, dass sie den neuen Positionen im Darstellungsstring entsprechen. Die neuen Positionen im Darstellungsstring müssen aus den neuen Positionen im Inhaltsstring umgerechnet und in der Display-Struktur abgelegt werden.

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“