5.6 Datenfunktionen
Funktionen, die in der Dialogbeschreibung als Datenfunktionen deklariert sind, müssen in C wie folgt deklariert werden:
DM_Boolean DML_default DML_CALLBACK <Funktionsname> (DM_DataArgs *args);
wenn die Funktion als
{ export | reexport } function datafunc <Funktionsname> ();
im Dialogskript definiert ist
oder als
DM_Boolean DML_c DML_CALLBACK <Funktionsname> (DM_DataArgs *args);
wenn die Funktion als
{ export | reexport } function c datafunc <Funktionsname> ();
im Dialogskript definiert ist.
Der Parameter dieser Funktion ist fest vom ISA Dialog Manager vorgegeben und kann nicht verändert werden. Sie repräsentiert ein Datenmodell (Model-Komponente) welches die Präsentationsobjekte (View-Komponente) mit Datenwerten versorgt oder diese speichert und verwaltet.
Diese Funktion wird aufgerufen wenn eine Synchronisation zwischen View- und Model-Komponente erforderlich wird. Dies kann entweder automatisch geschehen, entsprechend den Steuerungsoptionen im .dataoptions[]-Attribut an den beteiligten Komponenten. Der Aufruf kann aber auch ausgelöst sein durch explizite Nutzung der Methoden :collect(), :propagate(), :apply() oder :represent(). Der Aufruf erfolgt einzeln für jedes Model-Attribut.
dialog D
function datafunc FuncData();
function void Reverse(integer Idx);
window Wi
{
.title "Datafunc demo";
.width 200; .height 300;
edittext Et
{
.datamodel FuncData;
.dataget .text;
.dataset .text;
.xauto 0;
.xright 80;
}
pushbutton PbAdd
{
.text "Add";
.xauto -1;
.width 80;
on select
{
this.window:apply();
}
}
listbox Lb
{
.xauto 0; .yauto 0;
.ytop 30; .ybottom 30;
.datamodel FuncData;
.dataget .content;
on select
{
PbReverse.sensitive := true;
}
}
pushbutton PbReverse
{
.xauto 0; .yauto -1;
.text "Reverse element";
.sensitive false;
on select
{
Reverse(Lb.activeitem);
}
}
on close { exit(); }
}
#ifdef VMS
# define EXITOK 1
# define EXITERROR 0
#else
# define EXITOK 0
# define EXITERROR 1
#endif
#include <IDMuser.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "datafuncfm.h"
#define DIALOGFILE "~:datafunc.dlg"
static DM_ID data_id = (DM_ID)0;
static DM_Value data_vec;
static DM_String data_str;
void DML_default DM_CALLBACK FuncData __1((DM_DataArgs *, args))
{
if (!data_id)
data_id = args->object;
switch (args->task)
{
case MT_get:
switch(args->attribute)
{
case AT_text:
args->retval.type = DT_string;
args->retval.value.string = data_str;
break;
case AT_content:
if (args->index.type == DT_void)
{
args->retval = data_vec;
}
else if (args->index.type == DT_integer)
{
DM_ValueGet(&data_vec, &args->index, &args->retval, 0);
}
break;
default:
break;
}
break;
case MT_set:
switch(args->attribute)
{
case AT_text:
if (args->data.type == DT_string)
{
if (DM_ValueChange(&data_vec, NULL, &args->data, DMF_AppendValue))
DM_DataChanged(data_id, AT_content, NULL, DMF_Verbose);
}
break;
default:
break;
}
break;
default:
break;
}
}
void DML_default DM_ENTRY Reverse __1((DM_Integer, Idx))
{
DM_Value index, data;
char *cp, ch;
size_t len, i;
DM_ValueInit(&data, DT_void, NULL, 0);
index.type = DT_integer;
index.value.integer = Idx;
if (DM_ValueGet(&data_vec, &index, &data, 0) && data.type == DT_string)
{
if (DM_StringChange(&data_str, data.value.string, 0))
DM_DataChanged(data_id, AT_text, NULL, DMF_Verbose);
/* reverse the string */
cp = data.value.string;
if (cp)
{
len = strlen(cp);
if (len>2)
{
len--;
for (i=0; len>0 && i<len/2; i++)
{
ch = cp[i];
cp[i] = cp[len-i];
cp[len-i] = ch;
}
}
}
if (DM_ValueChange(&data_vec, &index, &data, 0) && data_id)
DM_DataChanged(data_id, AT_content, &index, DMF_Verbose);
}
}
int DML_c AppMain __2((int, argc), (char **,argv))
{
DM_ID dialogID;
DM_Value data;
/* initialize the Dialog Manager */
if (!DM_Initialize (&argc, argv, 0))
{
DM_TraceMessage("Could not initialize.", 0);
return (1);
}
/* load the dialog file */
switch(argc)
{
case 1:
dialogID = DM_LoadDialog (DIALOGFILE,0);
break;
case 2:
dialogID = DM_LoadDialog (argv[1],0);
break;
default:
DM_TraceMessage("Too many arguments.", 0);
return(EXITERROR);
break;
}
if (!dialogID)
{
DM_TraceMessage("Could not load dialog.", 0);
return(EXITERROR);
}
data.type = DT_type;
data.value.type = DT_string;
DM_ValueInit(&data_vec, DT_vector, &data, DMF_StaticValue);
data.type = DT_string;
data.value.string = "^ Enter a string";
DM_ValueChange(&data_vec, NULL, &data, DMF_AppendValue);
data.value.string = "and press 'Add'";
DM_ValueChange(&data_vec, NULL, &data, DMF_AppendValue);
DM_StringInit(&data_str, DMF_StaticValue);
DM_StringChange(&data_str, "Change me!", 0);
/* install table of application functions */
if (!BindFunctions_D (dialogID, dialogID, 0))
DM_TraceMessage ("There are some functions missing.", 0);
/* start the dialog and enter event loop */
if (DM_StartDialog (dialogID, 0))
DM_EventLoop (0);
else
return (EXITERROR);
return (EXITOK);
}
Siehe auch
Funktion DM_DataChanged