TE2000 TcHmiUserManagement Dropdown Auswahlfenster grösser machen?

blimaa

Level-3
Beiträge
1.070
Reaktionspunkte
123
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi
Wenn ich das Beckhoff Control "TcHmiUserManagement" verwende, dann ist die Benutzerauswahl viel zu klein. Sprich, wenn ich auf "Benutzer wechseln" drücke, dann kommt das Popup, welches ein Dropdown "Wählen sie einen Benutzer" hat. Die Auswahl darin ist mir viel zu klein. Wo kann ich das Ändern? Mehr Abstand zwischen den einzelnen Einträge und die Schriftgrösse hätte ich gerne grösser.

09-09-2025_19-08-34.png

Edit: Wenn ich im Firefox im Entwicklermodus etwas herum spiele, dann kann ich die Höhe einstellen, also Prinzipiell wäre es möglich. Auch könnte das Popup an sich auch grösser sein: 1757441323883.png
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Jup
Das beinflusst aber nur das erste Dropdown (Ausloggen, benutzerwechseln, Benutzereigenschaften, etc)

Wenn ich dann auf Benutzer wechseln drücke kommt ein PopUp zum Anmelden. Dieses müsste ich beeinflussen können.
 
Das geht mittels CSS. Einfach eine neue CSS Datei einfügen. Die Klassen, welche du mit der CSS Datei überschreiben musst, erfährst du aus den Developertools aus dem Browser.
Habe gerade mein Notebook mit TwinCAT nicht zur Hand, sonst könnte ich fix gucken.
 
Hi

Wäre cool wenn du das bei Gelegenheit mal nachschauen könntest.
Ich probiers auch gleich mal, bin da aber nicht sooooo erfahren :)
Hat das noch niemanden gestört, oder habt ihr die Eingabe selber gemacht?
 
Hab jetzt auch mal herum gestöbert.
Ich hab eine neue CSS Datei angelegt und dort folgendes reingeschrieben:
CSS:
#tchmi-system-topmostlayer-master .tchmi-combobox-template-dropdown-element {
    padding-top: 25px;
    padding-bottom: 25px;
}

Allerdings hat das dann auf alle PopUps (...Mostlayer-master...) einflüsse.
Immerhin sind die Schriften bei der Auswahl weiter auseinander (Fingerbedientauglich).
Am liebsten würde ich das ganze Popup grösser machen, die Grösse ist aber Fix als Inline definiert. Mit CSS habe ich es nicht geschaft zu überschreiben. Auch konnte ich die Schriften, etc. im Popup selber nicht beeinflussen. Schön wäre es, wenn ich auf eine ID greifen könnte, aber die einzige ID ist "id="tchmi-system-topmostlayer-master"" und jedes Popup bekommt diese ID.
 
Das beinflusst aber nur das erste Dropdown (Ausloggen, benutzerwechseln, Benutzereigenschaften, etc)
Stimmt. Die späteren Diaglog und Dropdownbox Texte werden mit TextFontSize konfiguriert.
Die Abstände (in der nativen Combobox dataheight genannt) sind nicht per Attribut konfigurierbar.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Deine Lösung per padding ist schon optimal.
Dank "combobox-template-dropdown-element" trifft das alle comboboxen, aber das ist ja schon von dir gewollt.
Andere popup inhalte werden nicht geändert.
 
Dein Problem an dieser Stelle ist die Art und Weise, wie dieses Control von Beckhoff aufgebaut ist. Normalerweise sind alle Elemente sehr umfangreich mit Klassennamen versehen, sodass sich eigentlich sehr gezielt CSS Änderungen durchführen lassen.

Für das Usermanagement erhalten bspw. (fast) alle Elemente eine CSS-Klasse im Stil TcHmi_Controls_Beckhoff_TcHmiUserManagement-<xyz>, wobei <xyz> den Zweck des jeweiligen Elements noch etwas genauer beschreibt. Jetzt hat dieses Control aber zwei unterschiedliche Arten von Dropdown-Auswahllisten. Einmal gibt es das Dropdown-Menü, welches dir deine Usermanagement Optionen anbietet:

1757574744984.png

Technisch ist diese Auswahl so realisiert, dass diese Auswahloptionen nur so aussehen wie ein Dropdown-Menü, tatsächlich technisch aber nur ein "fliegender" Div-Container ist - übrigens auch im tchmi-system-topmostlayer-master. Diese Auswahloptionen mitsamt dem Div-Container werden mittels Javascript zur Laufzeit der HTML-Seite hinzugefügt. Innerhalb des Javascript-Backends des Controls werden dabei auch die CSS-Optionen der Optionen entsprechend angepasst. Jede Option hat bspw. die CSS-Klasse TcHmi_Controls_Beckhoff_TcHmiUserManagement-template-Dropdown-Element und lässt sich darüber auch stylen, ohne dass andere Controltypen davon beeinflusst werden.
Das lässt sich hier auch ziemlich gut realisieren, da es nur eine begrenzte Anzahl an Optionen gibt. Einige Optionen können ggf. ausgeblendet werden. Der Umfang dazu lässt sich aber im Javascript gut abbilden.

In der Auswahlliste der Benutzer ist das anders.

1757575117839.png

Hier kann es eine prinzipiell beliebig lange Liste an möglichen Benutzern geben. Deshalb lässt sich das nicht so statisch im Code abbilden, wie das bei den Auswahloptionen oben geschehen ist. Technisch ist hier tatsächlich ein richtiges Dropdown-Menü, Beckhoff nennt dies Combobox, im Einsatz. Diese Combobox unterstützt eine beliebig lange Liste an Optionseinträgen. Und dabei instanziiert Beckhoff einfach dynamisch eine neue Combobox mit der beliebigen Anzahl an Benutzernamen, sobald diese Benutzerauswahl angezeigt werden soll.
Leider hat das Control der Combobox keinen zusätzlichen Aufrufparameter, über welchen zusätzliche CSS Klassen beim dynamischen Aufruf mittels Javascript angehängt werden können, welche dann entsprechend gerendert werden würden. Dann hätte Beckhoff hier auch wieder TcHmi_Controls_Beckhoff_TcHmiUserManagement-<xyz> Klassen mit übergeben können und das Styling wäre kein Problem.

Stattdessen sind alle Einträge hier aber Einträge einer Combobox, welche sich technisch nicht unterscheiden von anderen Combobox-Einträgen im topmost-Layer. Dies sieht man ja auch in deinem Codebeispiel.

Was kann man nun machen?

(A) Entweder kann man den Sachverhalt akzeptieren und fluchen. Vielleicht liest das Produktmanagement vom TcHMI ja auch hier mit und nimmt das in zukünftige Entwicklungen mit auf. Wann das aber dann verfügbar ist, muss man sicherlich selber rausfinden. (aaarg Beckhoff und seine Release-Notes... Das wäre dann das nächste Mal fluchen^^ Beckhoff plant aktuell wohl eine Informationsseite mit aktuellen Softwareupdates auf deren Webseite, was auch die bisherige Startseite aus TwinCAT 4024 mit den "Update-News" teilweise ersetzten soll. Dort soll es wohl auch wieder Release-Infos geben, ob diese aber über den Informationsgehalt von "xyz has been updated to version xyz and is available for download. Please consider updating." hinausgehen, habe ich nicht gefragt. Das wäre ja unglaublich und die Hölle würde sicherlich zufrieren.)

(B) Du könntest das Control forken und als eigenes Framework Control realisieren und dabei die Javascript Implementierung anpassen. Dazu bräuchtest du dann eventuell auch ein eigenes Combobox Control. Den Aufwand würde ich nicht eingehen.

(C) Wir nutzen diese Auswahloption "Benutzer wechseln" nicht, sondern nur "Ausloggen" kombiniert mit einer eigenen Login-Seite. Diese haben wir nach unseren Corporate Design Vorgaben gestaltet und lässt sich auch ansonsten weiter in HTML und CSS anpassen, sodass man solche Designwünsche umsetzen kann. Sind halt für ein Bediener ein paar zusätzliche Schritte. Ist uns aber egal, da das vergleichsweise selten vorkommt.
Aber auch in diesem Fall sind Änderungen am HTML und Javascript-Code nötig. Das Auswahlfeld wird hier als HTML <select>-Element mit einzelnen <option>-Elementen definiert. Dies wird aber hinsichtlich der Größe usw. vom Betriebssystem gerendert und kann hinsichtlich der Höhe nicht per CSS beeinflusst werden. Stattdessen kann man aber die Userauswahl selber mit einem anderen Javascript Framework, bspw. Select2, realisieren. Hier hat man vollständige Styling Möglichkeiten. Ausgangspunkt für die Anpassungen auf der Loginseite ist die Javascript-Funktion updateUserSelection(). Hierin (und natürlich im HTML-Template) muss man die Einbindung des verwendeten alternativen Select-Frameworks realisieren, damit auch die richtigen Elemente erscheinen. Außerdem die window.addEventListener-Funktion, damit der richtig ausgewählte EIntrag an den Login-Handler übergeben wird.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Auswahlfeld wird hier als HTML &lt;select&gt;-Element mit einzelnen &lt;option&gt;-Elementen definiert. Dies wird aber hinsichtlich der Größe usw. vom Betriebssystem gerendert und kann hinsichtlich der Höhe nicht per CSS beeinflusst werden.

Wenn du einen modernen Chrome benutzt (Mai 2025) gibt es experimentellen Support
Ob du in deiner Applikation auf sowas setzen möchtest, musst du entscheiden.
 
Ich setze jetzt mal Variante A+ um ;)

Das Fluchen geht im Rauschen unter, da ich wacker wegen meinen anderen Beckhoff Problemen... :ROFLMAO:
Ich lass jetzt mal meine eigene CSS Erweiterung. So ist immerhin die Auswahl per Finger möglich. Bei diesem Projekt habe ich keine weiteren Popups mit Dropdowns, so sollte der Impact auf andere Elemente relativ gering sein.
Und der Userwechsel sollte eigentlich auch nur im (seltenen?!) Servicefall sein.

Trotzdem vielen Dank für die Ausführungen.
 
Das hat mir jetzt doch keine Ruhe gelassen und ich habe noch etwas gespielt. Vielleicht hilft es irgendwem irgendwann. Der Aufwand für die Option B ist doch geringer als gedacht

1757579327637.png

Das Javascript vom User Management findet man im HMI Projekt im Ordner Packages\Beckhoff.TwinCAT.HMI.Controls.14.3.210\runtimes\native1.12-tchmi\TcHmiUserManagement\TcHmiUserManagement.js im jeweiligen Projektverzeichnis. Darin gibt es folgenden Abschnitt, so ab Zeile 6200 (mit Prettier kann man die Javascript Formatierung wiederherstellen. Bei Beckhoff ist das Javascript ja stark reduziert)

Javascript:
let SwitchUserPopup = (() => {
 
    // ...

    userCombobox = TcHmi.ControlFactory.createEx(
    "TcHmi.Controls.Beckhoff.TcHmiCombobox",
    `${this.__name}.userCombobox`,
    {
      "data-tchmi-combobox-text":
        "%l%Control::TcHmi.Controls.Beckhoff.TcHmiUserManagement::PopupPlaceholder_SelectAUser%/l%",
      "data-tchmi-drop-down-font-size": this.__textFontSize,
      "data-tchmi-drop-down-font-size-unit":
        this.__textFontSizeUnit
    },
    this.__parentControl,
  ),

    // ...

Von CreateEx() ist der dritte Aufrufparameter für Argumente, hier kann man die data-height angeben, bspw. so:
Javascript:
let SwitchUserPopup = (() => {
 
    // ...

    userCombobox = TcHmi.ControlFactory.createEx(
    "TcHmi.Controls.Beckhoff.TcHmiCombobox",
    `${this.__name}.userCombobox`,
    {
      "data-tchmi-combobox-text":
        "%l%Control::TcHmi.Controls.Beckhoff.TcHmiUserManagement::PopupPlaceholder_SelectAUser%/l%",
      "data-tchmi-drop-down-font-size": this.__textFontSize,
      "data-tchmi-drop-down-font-size-unit":
        this.__textFontSizeUnit,
      "data-tchmi-data-height": 50,
      "data-tchmi-data-height-unit":
        this.__textFontSizeUnit,
    },
    this.__parentControl,
  ),

    // ...

So ist das halt jetzt fest auf 50 px gecoded. Man könnte in der Description.json nun ein eigenes Attribut definieren, welches hier stattdessen übernommen wird, damit es über den TcHmi Editor einstellbar ist. Das könnte man sich am Beispiel von this._textFontSize abgucken. Das ganze sollte dann natürlich als eigenes Framework-Control umgesetzt werden, damit es nicht beim nächsten Beckhoff Update wieder weg ist.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe jetzt mal den Weg von roboticBeet umgesetzt, das mit der Dropdownbox vergrößern, das hat auch soweit geklappt. Und war auch einfacher als gedacht.

Jetzt stehe ich aber irgendwie vor dem Hindernis, dass ich keine Tastatur eingeblendet bekomme. Wie wäre denn das gedacht?

Also ich klicke auf "Benutzer wechseln", dann habe ich ja dieses Popup im Vordergrund. Dieses Popup liegt ja über allem im Hintergrund (also auch eine eventuell eingeblendete Tastatur (TcHmiKeyboard).

Und bei den "Common" Parametern des TcHmiUserManagement gibt es ja nur "Allow Logout" und "Allow Switch User".
 
Jetzt stehe ich aber irgendwie vor dem Hindernis, dass ich keine Tastatur eingeblendet bekomme. Wie wäre denn das gedacht?

Von welchem Dialog redest du?
Der Server kann in der Config umgestellt werden unter TcHmiSrv/Sicherheit/"Wähle Nutzer anhand von"/ Listbox oder Textfeld.

Der Switch User dialog hat damit entweder eine Auswahl, da braucht man keine Tastatur.

Oder ein Freitextfeld und dort geht die System-Tastatur (über dem Dialog!) sauber auf.
Also vielleicht ist das ein Problem, dass du das Keyboard händisch nutzt und nicht als SystemKeyboard (siehe HMI Config window).
 
Achso, da habe ich mich unklar ausgedrükct, aber ich meine das Feld zum Passwort eingeben.

Und ja, ich nutze tatsächlich nicht das "System Keyboard" aus der "TwinCAT HMI Configuration", sondern ziehe mir die Keyboards aus der Toolbox in die Seiten, wenn ich sie brauche.
Um ehrlich zu sein kannte ich die andere Methode auch gar nicht. Dann muss ich mich damit mal auseinander setzen (und vor allem auch wie man dort das Erscheinungsbild (Farben, Schriftarten, Positionen) anpassen kann.

Edit:
Vielleicht nutzt noch jemand die Tastaturen als separate Controls:
Mein Ansatz (ohne alles umkrempeln zu müssen) ist folgender:
Beim Klick auf das Login-Feld wird das "AutoOpen" aktiviert:
1759148461611.png

Und wenn das Keyboard geschlossen wird, dann deaktiviert es sich selbst wieder
(über ein Global Event)
1759148385585.png
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, das Keyboard aus der Toolbox bleibt "unten" und kann daher nicht in die Popups eingreifen.
Kannst du per Function (JS API und grafisch per Trigger) auch aktivieren und deaktivieren: TcHmi.Keyboard.setAutoOpenSystemKeyboard oder die HMI Function SetAutoOpenSystemKeyboard

Position hast du als Wahl ein Popup oder unten (verkleinert das HMI von unten).
Farben und co kannst du "nur" über das Theming des TcHmiKeyboard verändern.
 
Zurück
Oben