• XMLGUI ~ JSON

    Hallo Leute,

    ich möchte euch ein Skript vorstellen, mit diesem ihr eure GUI in XML (bzw. JSON) gestalten und bei eurem AutoIt Skript laden könnt.

    Das Projekt habe ich für mich geschrieben, damit ich mich nicht dem Form Editor und dem Layout beschäftigen muss.

    88542-prev-png


    Hinweis

    Der Umfang des Projekts ist noch überschaubar viele Funktionen sind noch nicht vorhanden. Sollte Interesse bestehen würde ich das Projekt fortführen und erweitern. Evtl. haben andere Interesse mitzumachen. Ich habe den aktuellen Stand hochgeladen bin mir bewusst das noch vieles fehlt, brauchte es für mich aber in keinem größeren Umfang.

    Wie funktionierst?

    Beispiel an einem Skript mit XMLGUI

    ExampleXML.au3

    ExampleApp.xml

    ExampleApp.json

    ExampleApp.xml in JSON umgewandelt => Test.json (Datei zu groß um hier zu posten)

    Die XMLGUI.au3

    XML-GUI.dll in PureBasic

    XML: Übersicht der Elemente und Attribute (Nicht alle Attribute funktionieren)

  • Hallo gem
    Klasse Idee. So ein Ansatz ermöglicht es ja auch, die Oberfläche während der Laufzeit anzupassen. Das finde ich sehr schön. Es gab hier auch schon andere Projekte dazu.
    Schade finde ich aber die Entscheidung für XML. Ich mag das nicht lesen und würde es bei der Erstellung sicher als großen Overhead betrachten.

    Grüße autoiter

  • Hallo autoiter,

    Danke. Ja Genau funktioniert allerdings nur teilweise. Lässt sich aber leicht erweitern.

    Was wäre deine Alternative zu XML?

  • Darüber habe ich mir jetzt ehrlich gesagt gar keine Gedanken gemacht.

    Wäre eine ini z.B. nicht weniger Overhead und könnte gleichsam alles aufnehmen?

    Grüße autoiter

  • Wäre nicht auch JSON eine mögliche Alternative ?

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Fände ich nicht so gut. Immerhin besser als so eine krasse Markup Variante. Aber es geht hier doch nicht darum, dass Daten von einer Maschine gespeichert werden oder effizient hin und her geschickt werden, sondern ein Mensch schreibt in der Datei rum und raus kommt eine GUI.
    Wer schreibt denn gerne selbst JSON? Wie übersichtlich ist das am Ende?

    Grüße autoiter

  • Zu JSON

    Fände ich nicht so gut. Immerhin besser als so eine krasse Markup Variante. Aber es geht hier doch nicht darum, dass Daten von einer Maschine gespeichert werden oder effizient hin und her geschickt werden, sondern ein Mensch schreibt in der Datei rum und raus kommt eine GUI.
    Wer schreibt denn gerne selbst JSON? Wie übersichtlich ist das am Ende?

    JSON bietet, was die Strukturierung der Daten angeht, doch deutlich mehr Möglichkeiten als z.B. .ini-Dateien. Sofern man es nicht übertreibt, lassen sich JSON-Daten durchaus gut lesen und editieren.

    Unterstützung (Funktionen, UDF's) seitens der AutoIt-Community gibt es auch reichlich, ebenso Drittsoftware zur Verarbeitung von JSON.

    Was den Overhead von XML angeht, da gebe ich Dir allerdings recht :).

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Unterstützung (Funktionen, UDF's) seitens der AutoIt-Community gibt es auch reichlich, ebenso Drittsoftware zur Verarbeitung von JSON.

    Das spielt aber doch eigentlich keine Rolle - oder habe ich das falsch verstanden. Es ging doch nicht darum einen Form Editor zu bauen, der die Dateien so ablegt, dass sie Standards einhalten und auch für einen Menschen leidlich lesbar sind. Ich dachte ein Mensch schreibt die Datei. Soll man da noch einen Parser schreiben, der einem sagt, wo man einen Fehler in der Notation gemacht hat, weil man gerne mal eine geschweifte Klammer vergisst?
    Ich habe ini nur ins Rennen geworfen, weil es sehr wenig zu beachten gibt.

    Grüße autoiter

  • Wow - wirklich klasse Ding :thumbup:

    Ein paar Fragen / Anmerkungen dazu:

    So wie ich das verstehe, ist ein direkter Zugriff auf die nativen AutoIt-Objekte selbst nicht vorgesehen (bzw. noch keine Funktion hierfür implementiert)?
    Also der Zugriff auf diese soll ausschließlich über die Funktionen der UDF erfolgen?
    Eigene Anpassungen der Controls sind damit also nicht möglich?

    Z. B. möchte ich einen Baloon-Tip auf einen Button setzen. In der XML-Struktur gibt es bislang keine Funktionalität hierfür und eine Funktion welche mir von einem der Elemente aus der XML-Struktur die Control-ID zurückgibt, habe ich auch nicht.

    Wenn du hier noch ein Möglichkeit schaffen würdest auf die darunterliegenden AutoIt-eigenen-Elemente zuzugreifen würde dies die Flexibilität und Einsatzmöglichkeiten wohl deutlich erhöhen.

    Du hast eine Pure-Basic-Dll als XML-Wrapper verwendet. Die Abhängigkeit zu dieser dll (die hier nur in 32Bit vorliegt und damit 64-Bit-Programme verhindert) ist sicher verschmerzbar aber eine Alternative wäre ja das Microsoft.XMLDom-Objekt gewesen welches ja bereits in Windows enthalten ist. Gibt es einen bestimmten Grund warum du den Pure-Basic-Wrapper bevorzugt hast?

    Zu der XML/JSON: Diskussion:
    Ne - XML ist schon die richtige Sprache dafür. Bisherige Formate für GUIs (Mozillas XUL, Microsofts XAML, das UI-Format vom Qt-Designer und und und) sind nicht ohne Grund XML-basiert.

    JSON kann zwar die Verschachtelung darstellen und damit die hierarchische Beziehung der Elemente gut abbilden, aber es existiert keine syntaktische Trennung von Elementattributen und Elementinhalt.

    Das müsste man über speziell benannte Attribute machen die schon optisch auf der selben Ebene stehen wie die Attribute des Elementes selbst.

    Wenn man es mit XML dann weiter treibt, kann man mit XSD die Struktur bis ins kleinste Detail festzurren so dass Abweichungen/Fehler gleich beim Parsen erkannt werden können (das geht sogar soweit, dass Wertebereiche für Values angegeben werden können und so weiter). In JSON müssten diese Checks wieder mit in den Programmcode und würden den entsprechend aufblähen (ja ich weiß es gibt JSON-Schema - aber mir ist kein in AutoIt verwendbarer Parser hierfür bekannt).

    Also XML ist schon die vernünftigste Wahl hierzu.

  • Danke für die Rückmeldungen

    Ich habe nun eine JSON Variante implementiert . Persönlich finde ich die XML Variante angenehmer. Der Aufbau der JSON Datei könnte natürlich angepasst werden.

    @AspirinJunkie

    Danke :D

    Wenn du Zugriff auf die Controls meinst kannst du dir mit theoretisch mit _XMLGUI_GetToken den Handle ausgeben, wenn ein Control erstellt wurden ist. Das Problem ist das dann keine Änderungen an der Struktur übernommen werden wenn Änderungen vorgenommen werden, deswegen der Umweg über die Funktion _XMLGUI_Query.

    Zitat

    Du hast eine Pure-Basic-Dll als XML-Wrapper verwendet. Die Abhängigkeit zu dieser dll (die hier nur in 32Bit vorliegt und damit 64-Bit-Programme verhindert) ist sicher verschmerzbar aber eine Alternative wäre ja das Microsoft.XMLDom-Objekt gewesen welches ja bereits in Windows enthalten ist. Gibt es einen bestimmten Grund warum du den Pure-Basic-Wrapper bevorzugt hast?

    Dachte die Trennung wäre hier Vorteilhaft. Sollte die DLL von einer anderen Anwendung aufgerufen werden wäre das Ergebnis beim Einlesen identisch. Evtl. Performance da nicht jedes mal beim Einlesen der Werte die DLL aufgerufen werden muss. Oder meinst du komplett ohne DLL nur mit Microsoft.XMLDom zur Verwaltung der Daten?

  • Oder meinst du komplett ohne DLL nur mit Microsoft.XMLDom zur Verwaltung der Daten?

    Ich glaube Aspirin wollte darauf hinaus. XMLDom kriegst du ja von Windows direkt gestellt und so würdest du beim Ausliefern deiner GUIs ein paar Dateien sparen.

    Wenn es sich performancetechnisch nichts bis wenig nimmt, ist die inhaus Variante mMn. eine bessere Wahl (dann hast du auch keine 32/64-Bit Probleme, je nachdem welche DLL du mitlieferst).

    Das Ergebnis nach dem Einlesen ist ja vollkommen irrelevant, solange die XML-Bibliothek die Spezifikation einhält, wird das korrekt geparst.

    Anders siehts natürlich nur bei den Queries aus, je nach dem mit welcher Art von Querysprache dort gearbeitet wird (XPath usw.)

    Übrigens reicht es vollkommen aus wenn du einfach nur @ tippst und danach den Anfang des Benutzernamens, WBB schlägt dir eine Liste an Usern vor und du musst das dann nur noch bestätigen.

    So erhält der User auch eine Benachrichtigung, wenn man es so wie du macht nicht.

  • alpines

    danke für den tipp. bei mir seh ich allerdings keine liste wenn ich @ eingebe. ich benutze chrome.

    ich kann die xml importier funktion alternativ über xmldon laufen lassen und mal vergleichen