Abrufen eines HMI-Komponentenobjekts

Patrick1008

Level-2
Beiträge
15
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe mehrere TcHmiTextBlock-HMI-Komponenten auf der Seite. Wie kann ich den Namen der Komponente (oder des Komponentenobjekts) im Doppelklick-Ereignishandler abrufen? Ich möchte für alle Komponenten denselben Ereignishandler verwenden, aber eine unterschiedliche Logik verwenden, je nachdem, auf welche Komponente doppelgeklickt wurde. // TF2000.
 
Ich möchte für alle Komponenten denselben Ereignishandler verwenden, aber eine unterschiedliche Logik verwenden, je nachdem, auf welche Komponente doppelgeklickt wurde.
Bei der Pflege stell ich mir das schwierig vor. Kannst ja nicht an einer Stelle die Logik pflegen. Damit hast du ja bei jedem TextBlock eine Kopie...

Geht aber:
Seit 1.14 (oder 1.14.2?) werden Control Events relativ modelliert (über den Context). Damit kannst du die ID des aktiven Controls abfragen.

1730971236485.png
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei der Pflege stell ich mir das schwierig vor. Kannst ja nicht an einer Stelle die Logik pflegen. Damit hast du ja bei jedem TextBlock eine Kopie...

Geht aber:
Seit 1.14 (oder 1.14.2?) werden Control Events relativ modelliert (über den Context). Damit kannst du die ID des aktiven Controls abfragen.

Anhang anzeigen 82808
Es sieht so aus, als müsste ich für 1.14 zum Package Manager migrieren, was ich derzeit aufgrund der Produktionsumgebung nicht tun kann. Funktioniert „owner::id“ auch von Javascript aus?

Ich stimme zu, dass dieser Ansatz keine zentralisierte Logik etabliert. Was würden Sie empfehlen, wenn ich viele ähnliche Steuerelemente habe und wissen möchte, welcher Benutzer von Javascript/Typescript aus doppelgeklickt hat?
 
Funktioniert „owner::id“ auch von Javascript aus?

In 1.12 nicht. Mit 1.14 schon (wenn man es richtig anstellt).

Aber ich verstehe deine ganze Problematik nicht. Per JS hast du doch schon alles in der Hand und (schon immer) alle Möglichkeiten.
Ich glaube dir fehlte einfach die Infos, dass der Name des Events verfügbar ist.
Hier mal Typescript code:

Javascript:
// get somehow the control instances of the subcontrols
const controlA = TcHmi.Controls.get(this.getId()+'.SubControlA')!;
const controlB = TcHmi.Controls.get(this.getId() + '.SubControlB')!;


const genericHandler: Parameters<typeof TcHmi.EventProvider.register>[1] = (event, data) => {
    const ctrlName = event.name.split('.')[0];   // event.name is '<controlname>.onPressed'
    if (ctrlName === 'ControlA') {
        // do smart things with Control A
        TcHmi.Log.infoEx(controlA.getId() + ' clicked'  );
    } else if (ctrlName === 'ControlB') {
        // do smart things with Control B
        TcHmi.Log.infoEx(controlB.getId() + ' clicked');
    }
};
const destroyRegPressedA = TcHmi.EventProvider.register(controlA.getId() + '.onPressed', genericHandler);
const destroyRegPressedB =TcHmi.EventProvider.register(controlB.getId() + '.onPressed', genericHandler);

// both destroyRegPressed destroy callbacks should be called at the correct time to prevent memleak
// if register was done in __attach destroy it in __detach
// if register was done before __attach destroy it in __destroy

Mehr in der API referenz
 
Zuletzt bearbeitet:
Zurück
Oben