5.4 Objektcallback-Funktionen
Funktionen, die in der Dialogbeschreibung als Objektcallback-Funktionen deklariert sind, müssen in C wie folgt deklariert werden:
DM_Boolean DML_default DM_CALLBACK Funktionsname
(
DM_CallBackArgs *data
)
wenn die Funktion im Dialogskript als
{export | reexport } function callback Funktionsname() for Ereignisse;
definiert ist, oder als
DM_Boolean DML_c DM_CALLBACK Funktionsname
(
DM_CallBackArgs *data
)
wenn die Funktion im Dialogskript als
{export | reexport} function c callback Funktionsname() for Ereignisse;
definiert ist.
Der Parameter dieser Funktion ist fest vom Dialog Manager vorgegeben und kann nicht verändert werden. Diese Funktion wird immer dann aufgerufen, wenn ein bei der Funktion angegebenes Ereignis beim entsprechenden Objekt eingetreten ist.
Die Rückgabe des Wertes TRUE bedeutet dabei, dass nach dem Aufruf dieser Funktion die normale Regelbearbeitung ausgeführt werden soll; die Rückgabe des Wertes FALSE unterbindet eine solche Regelausführung.
Beispiel
Die Definition einer Callback-Funktion im Dialog-Skript sieht wie folgt aus:
function callback CheckFilename() for deselect, modified;
Die Zuordnung zu einem Objekt erfolgt bei dem betroffenen Objekt:
child edittext File
{
.xleft 14;
.ytop 0;
.width 20;
.function CheckFilename;
.content "list.dlg";
}
Die nachfolgende Funktion soll bei erfolgter Eingabe überprüfen, ob die Eingabe des Benutzers einen gültigen Dateinamen darstellt.
DM_Boolean DML_default DM_CALLBACK CheckFilename __1(
(DM_CallBackArgs *, data))
{
DM_Value value; /* structure for DM_SetValue */
FILE *fptr; /* file pointer */
DM_ID id; /* Identifier of object */
/* get the current content*/
if (DM_GetValue(data->object, AT_content, 0,
&value, DMF_GetLocalString))
/* check the datatype */
if(value.type == DT_string)
{
/* try to open the file */
if(!((fptr = fopen(value.value.string, "r"))))
{
/*
* the file can not be opened for reading
* activate the edittext again
*/
value.type = DT_boolean;
value.value.boolean = TRUE;
DM_SetValue(data->object, AT_active, 0, &value,
DMF_Inhibit);
/*
* the file can not be read
* so don't continue processing with the rules
*/
return (FALSE);
}
else
fclose(fptr);
/*
* everything is ok
* so let the rule be processed normally
*/
return(TRUE);
}
/* to many errors don't continue the rule processing */
return (FALSE);
}