WinCC Unified Auflösung auslesen

Balu_der_Bär

Level-2
Beiträge
116
Reaktionspunkte
44
Zuviel Werbung?
-> Hier kostenlos registrieren
TIA V18
unified comfort panel

Hallo zusammen,
mit Version 18.01.01 wurde die Funktion UI.ActiveScreen geändert.
Wenn EA-Feld in einem Bildfenster oder einem Faceplate den Eingabefokus besitzt, gibt
ActiveScreen also das Bild zurück, das im Bildfenster bzw. im Faceplate dargestellt wird. Wenn
Sie ActiveScreen genutzt haben um zum Bespiel die Koordinaten in der Skriptfunktion
"OpenFaceplateInPopup" zu verarbeiten kann dies dazu führen, dass das Popup an anderer Stelle
geöffnet wird als in vorherigen Versionen.

Das fällt mir in meinem Script nun auf die Füße.
Kennt jemand den Befehl wie ich die Auflösung des Comfort Panels auslesen kann auch wenn ich das gerade in einer Runtime Simuliere?
Es gibt zwar andere Möglichkeiten aber nichts passt wenn ich das auf nem größeren Monitor simulieren will:
In meinem fall mit dem 700er Panel will ich also als rückgabewert die 480 bekommen.

UI.RootWindow.Height ( Höhe des Sichtbaren Bereiches im Browserfenster)
UI.Enums.HmiClientInfoType.PrimaryDisplayHeight ( Auflösung des Monitors)

Zur Zeit mache ich es notgedrungen mit Screen.ParentScreen.Height aber das geht ja nur einen screen nach oben. ich hätte das gerne unabhängig von der tiefe der Screens.

Hat jemand ne Idee?

Grüße

Balu
 
Zur Zeit mache ich es notgedrungen mit Screen.ParentScreen.Height aber das geht ja nur einen screen nach oben. ich hätte das gerne unabhängig von der tiefe der Screens.
ist zwar ganz billig, aber wie wär's mit solange den Parentbaum hochkrabbeln, bis es nicht mehr weiter geht, dann müsste ja irgendwann dein Layoutbild kommen

Hab's nur mit V17 hier probiert, aber ich denke wenn die Ursprungslösung klappt, dann sollte das auch gehen.

1679589571540.png
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hey,
danke, das wäre auch ne Möglichkeit. Setzt wie bei meinem code natürlich vorraus, dass der oberste Parentscreen der Auflösung des Panels Entspricht.
Ich spiele gerade mit Standardbildern herum die sich an Auflösungen anderen Panels anpassen um sich bei neuen projekten etwas arbeit zu sparen wenn das Panel größer /kleiner wird. Da dürfte dein Vorschlag genau wie meiner nicht funktionieren.

grüße

Balu
 
export function Bildschirmaufloesung( {
// Variablen
let _oBildschirmaufloesung = [];

try {
_oBildschirmaufloesung = [UI.GetClientInfo(UI.Enums.HmiClientInfoType.PrimaryDisplayWidth), UI.GetClientInfo(UI.Enums.HmiClientInfoType.PrimaryDisplayHeight)];
return _oBildschirmaufloesung;
}
catch (err) {
HMIRuntime.Trace("Fehler in Bildschirmaufloesung" + err);
}

}
 
Wie würde ich vorgehen, wenn ich die Funktion aus einem Faceplate heraus aufrufen möchte?

Mein Ziel ist folgendes: Ich habe einige Icon-Faceplates, die bei Touch ein Popup-Faceplate aufrufen. Und zwar immer etwas nach links unten versetzt. Ich möchte aber abfangen, dass das Popup außerhalb des sichtbaren Bereichs aufgerufen wird. Natürlich könnte ich den Aufruf als IndependentWindow deklarieren und das Popup absolut positionieren, aber schöner wäre es, den relativen Versatz zu behalten, und nur dann einzugreifen, wenn das Popup den Bildschirmrand überschreitet.

Ist das möglich?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo @Januar ,

wenn ich es richtig verstanden habe, möchtest du vor dem öffnen des Popups prüfen, ob das Popup überhaupt angezeigt werden kann. Dabei stellt sich mir noch eine Frage. Öffnest du das Popup-Faceplate im Icon-Faceplate oder gibst du vom Icon-Faceplate das Event klicken über die Ereignisschnittstelle nach außen und öffnest erst dann das Popup-Faceplate?

Für den Fall, dass du ein Popup Faceplate in dem Icon-Faceplate öffnest:
1. mit Faceplate.Parent.Top bzw. Faceplate.Parent.Left kannst du die Position des Faceplate-Containers des Icon-Faceplates abfragen. Wenn du nun die Größe/Breite des Popups, den Versatz, die Position des Faceplate-Containers und die Bildschrimauflösung berücksichtigst, solltest du wissen wann das Popup über den Bildschirmrand gelangt.
Wenn es nicht im Icon-Faceplate selbst geöffnet wird, kannst du einfach über die Screen.Items('...').Top bzw. ...Left die Position ermitteln können.

Grüße
 
Aktuell nutze ich die von dir beschriebene Variante. Ich habe im Icon-Faceplate eine Schaltfläche, die ein Detail-Popup öffnet. Ich gehe also NICHT den Umweg über die Ereignis-Schnittstelle. Das mit "Faceplate.Parent.Left" habe ich inzwischen auch schon heraus gefunden.
Jetzt bleibt zu klären, wie ich die Auflösung des Bildes ermitteln kann, das das ursprüngliche Icon-Faceplate beinhaltet.
Außerdem weiß ich noch nicht, wie ich die Breite/Höhe des aufgerufenen Popups bestimmen kann. Das könnte ich natürlich auch fest vorgeben, schließlich weiß ich ja, welches Faceplate es ist, aber falls sich das Design hier ändert, wäre es natürlich schön, die Werte dynamisch zu ermitteln.
 
Aktuell nutze ich die von dir beschriebene Variante. Ich habe im Icon-Faceplate eine Schaltfläche, die ein Detail-Popup öffnet. Ich gehe also NICHT den Umweg über die Ereignis-Schnittstelle. Das mit "Faceplate.Parent.Left" habe ich inzwischen auch schon heraus gefunden.
Jetzt bleibt zu klären, wie ich die Auflösung des Bildes ermitteln kann, das das ursprüngliche Icon-Faceplate beinhaltet.
Außerdem weiß ich noch nicht, wie ich die Breite/Höhe des aufgerufenen Popups bestimmen kann. Das könnte ich natürlich auch fest vorgeben, schließlich weiß ich ja, welches Faceplate es ist, aber falls sich das Design hier ändert, wäre es natürlich schön, die Werte dynamisch zu ermitteln.
Man kann auch auf die Eigenschaften der Pop-Ups per Skript zugreifen und diese manipulieren. Diese liegen unter UI.PopupScreenWindows(...)

Es ist hier auch gezeigt.

Genauso wie der Trick aus dem Faceplate auf das komplette UI-Objektmodell außerhalb des Faceplates zuzugreifen.
Hier am Beispiel der Anzahl der offenen Popups.
Javascript:
let ui = UI;
let count = ui.PopupScreenWindows.Count;
 
Zurück
Oben