Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: GEOS-InfoBase-Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

Donnerstag, 9. Oktober 2014, 18:55

Datenübergabe durch einen Trigger

Hallo zusammen!

Laut Dokumentation soll es möglich sein, mit der GTI_actionMsg eines Triggers beliebige Daten (in einer Struktur) an den MsgHandler zu übergeben. Ich habe das Beispiel nachgestellt, mich dabei aber auf nur eine Komponente beschränkt, denn ich möchte nur einen String übergeben. Bei der Ausführung bekomme ich im Handler aber offenbar nicht meinen String sondern einen "Müll"-String. Hat jemand so etwas schon mal versucht?

Gruß

Wilfried

2

Freitag, 10. Oktober 2014, 18:47

Ich hab bisher nur mit ATTR_GEN_TRIGGER_ACTION_DATA ein Word übergeben. Das geht Super. Strings und Strukturen hab ich noch nicht versucht.
Rainer
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

3

Montag, 13. Oktober 2014, 10:29

Mit int-Werten gehts auch bei mir. Mit char-Inhalten gelingt es mir nicht:-(

Wilfried

4

Montag, 13. Oktober 2014, 16:28

Poste oder schick mal den Code (Trigger UI und ggf. reelvantes, Message-Handler). Ich tippe darauf, dass eigentlich nur ein Pointer übergeben wird, der aber auf eine Speicherbereich zeigt, der schon nicht mehr gültig / gelockt ist wenn der Handler ausgeführt wird.
Gruß
Rainer
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

5

Dienstag, 14. Oktober 2014, 18:15

Ok:

@class GCalcProcessClass, GenProcessClass;
@message void MSG_TEXT_UEBERGABE(@stack char txt[5]);
@endc;
@classdecl GCalcProcessClass, neverSaved;

@class TriggerDataTriggerClass, GenTriggerClass;
typedef struct {
char MS_txt{5];
} MyStruct;

@vardataAlias (ATTR_GEN_TRIGGER_ACTION_DATA) MyStruct ATTR_MY_STRUCT_TO_PASS;
@endc
@classdecl TriggerDataTriggerClass;

@object TriggerDataTriggerData TasteSin = {
GI_visMoniker = "sin";
GTI_destination = process;
GTI_actionMsg = MSG_TEXTUEBERGABE;
ATTR_MY_STRUCT_TO_PASS = "sin(";
}

@method GCalcProcess, MSG_TEXTUEBERGABE
{
@call Rechenfenster::MSG_VIS_TEXT_REPLACE_SELECTION_PTR(text, strlen(text));
}


Wilfried

6

Mittwoch, 15. Oktober 2014, 13:46

Compiliert er das? Wenn ja, wie sieht die Bytefolge aus, er an den Messagehandler übergibt?
Zumindest bei
ATTR_MY_STRUCT_TO_PASS = "sin(";
hab ich schlechtes Bauchgefühl. Ich hätte geschrieben
ATTR_MY_STRUCT_TO_PASS = {"sin("};

Mit den Klammern ist es (hoffentlich) für ihn eine Struktur, ohne ist es vielleicht ein Char-Pointer.

Ich denk noch mal drüber nach.
Rainer
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

7

Mittwoch, 15. Oktober 2014, 14:53

Spannendes Ergebnis.

Hi Wilfried,

1. Ob du dem Trigger die Klammern gibst oder nicht, scheint egal zu sein.

@object TriggerDataTriggerClass TasteSin = {
GI_visMoniker = "sin";
GTI_destination = process;
GTI_actionMsg = MSG_TEXTUEBERGABE;
ATTR_MY_STRUCT_TO_PASS = {"sin("};
}


2. Du hast dein Vardata als Struktur definiert. Folglich übergibst du auch eine Struktur. So musst du dann auch die Message vereinbaren.
@message void MSG_TEXTUEBERGABE(MyStruct ms);

3. Im Handler greifts du dann auf die Struktur zu:
@method ValueProcessClass, MSG_TEXTUEBERGABE
{
MessageBox(ms.MS_txt);
@call Rechenfenster::MSG_VIS_TEXT_REPLACE_SELECTION_PTR(ms.MS_txt, 0);
}
Die Länge Null sagt: Nullterminierter String.

So gehst auch durch swat.

Gruß
Rainer
(der auch wieder was gelernt hat)
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

8

Mittwoch, 15. Oktober 2014, 16:35

Hei, so funktioniert es:-). Du bist gut! Danke!

Ich hatte mich nur stur an die Dokumentation und an das Sample Triggerdata gehalten.

Hast du dir MessageBox selber gebaut oder gibt es das tatsächlich irgendwo?

Wilfried

9

Mittwoch, 15. Oktober 2014, 19:34

Ist eigentlich nicht schwer.
Gruß
Rainer

#ifndef MessageBox
#define MessageBox(txt) { \
UserStandardDialog ( (char *)0,(char *)0,(char *)0,(char *)0,txt, \
(( CDT_NOTIFICATION << CDBF_DIALOG_TYPE_OFFSET) | \
( GIT_NOTIFICATION << CDBF_INTERACTION_TYPE_OFFSET)) ); \
}
#endif

#ifndef QuestionBox
#define QuestionBox(txt) \
UserStandardDialog ( (char *)0,(char *)0,(char *)0,(char *)0,txt, \
(( CDT_QUESTION << CDBF_DIALOG_TYPE_OFFSET) | \
( GIT_AFFIRMATION << CDBF_INTERACTION_TYPE_OFFSET)) );
#endif
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

Ähnliche Themen

Thema bewerten