• Hallo,

    Ich baue gerade ein TV Steuerung wo ich zumindest den Grundstein haben, wie ich es benötige.

    Ich suche noch ein paar tipps dies einfacher zu gestalten da ich noch etwas ratlos bin wie es besser schreiben kann.

    Ich habe in mein Script zb. 3 Tv mit einer aufklappfunktion, wo bestimmte Befehle hinterlegt werden können.

    Nur wie mach ich das wenn ich zb. 10 Tv´s brauche, da wird die Liste ja endlos lang :(
    Ich werden bei allen TV die gleiche Liste angezeigt das kann man sicher auch einfacher durchführen das ich nur mehr die Position des TV angeben muss.

    Könnte mir jemand helfen ?

  • Hi Speedy86 .

    Das was du suchst sind Arrays. Ich hab dein Script mal umgeschrieben, sodass es arrays nutzt. Du musst theoretisch nurnoch die globalen variablen anpassen und es sollte tun, was du möchtest und du kannst beliebig viele TVs und ContextMenuItems hinzufügen. Außerdem kannst du während das Tool läuft neue Tvs hinzufügen.

    Alle Positionen der Controls werden dynamisch berechnet, sodass es erweiterbar ist und die größe geändert werden kann.

    MfG Kanashius :)

  • Hallo Kanashius :)
    Danke für das Script.


    Werde mal mir das heute am Abend sehr genau anschauen. Weil so weit mit dem Lernen bin ich noch nicht.

    Da sind zurzeit meine Grundkenntnisse noch zu wenig.

    Was ich vieleicht noch einbauen werde das ich doch bei 2-4 TV andere command benötige.

    Was ich meine zb. TV Profil mir würde jetzt gerade 3 verschiedene Profile einfallen. die ich verwenden würde.

    Hoff das ich das in dein Script einbauen kann :)

    Danke einmal.

    mfg

    Speedy

  • Hi Kanashius,

    Leider muss ich zugeben das ich doch nicht ganz klar komme wie ich es brauche oder haben will.

    Mein plan war wenn ich es jetzt noch genauer ausführe:

    Ich möchte gerne mein Haus abbilden wo alle TV + Beamer + VLC am Pc´s zu steuern geht :), ich weiß etwas freaky...

    Ich würde gerne jeden TV selber einen Anzeigenamen vergeben und possition auch selber varabel bzw. über die Position von jeden einzelnen verschieben können.

    zb benötige ich auch bei den VLC andere Befehlen bzw. func wie bei den Telnet

    so in etwa

    Beim den Profilen würd ich gerne den context angeben können wie die funktion heist + Befehl zb. Telnet befehl oder http request befehl und dann hinter den context die func aus zb. telnet bzw für vlc http request.

    Ich hoff ich hab es verständlich erklärt :)

    mfg

    Speedy

  • Naja, in dem Script hast du oben ja die Arrays für die TVs und das Contextmenü. Das kannst du beliebig erweitern:

    würde mit dem was du dort haben möchtest zu:

    C
    Global $arTvList=[ _
            ["192.168.0.10",$iDefaultPort,"DisplayName1"], _
            ["192.168.0.11",$iDefaultPort,"DisplayName2"], _
            ["192.168.0.12",$iDefaultPort,"DisplayName3"] _
        ] ;All client IP´s

    Auf dieselbe weise kannst du das ganze auch das Array für die ContextMenuButtons erweitern und z.B. die Info speichern, ob der Eintrag für VLC oder TelNet ist,...

    Du kannst auch das Array für die ContextMenuButtons auf ein 3D array umstellen und dann in dem weiteren verfügbaren eintrag die information speichern, ob es ein vlc, telnet,... profil ist und beim tv das ebenfalls eintragen, auslesen und das passende profil nutzen um das contextmenü zu erzeugen.

    Arrays sind im Prinzip Listen (1D), Tabellen (2D) oder Tabellen mit Listeneinträgen (3D):

    Normal würde ich in anderen Programmiersprachen Objekte nutzen um diese Daten zu speichern, AutoIt bietet dies möglichkeit leider nicht (nativ ohne größere Umstände).

    Deshalb würd ich dein Projekt vermutlich in z.B. Java umsetzen. Dort kann man eine gute Struktur mit Objekten und Vererbung aufbauen, sodass es übersichtlich ist, und das Fenster wäre auch etwas einfacher zu individualisieren ;)

    PS: Die ausgelesenen Infos (die du im anderen Thread erwähnst) kannst du nehmen um das Array zu erstellen.

    MfG Kanashius

  • Hi,

    also mit den Arrays versteh ich ein bissal sogar das mit den 2d und 3d :) aber an der umsetzten das zu schreiben versteh ich es gar nicht .

    zb. das mit den Namen bekomme ich es auch nicht zusammen.

    Hab dies mal geändert:

    und logischerweise macht er ja noch immer TV 1 - TV 6

    Code
        For $i=0 to UBound($arTvList)-1 step 1
            $arTvListControls[$i][0][0]=GUICtrlCreateButton("TV "&($i+1),$arPointTvListStart[0]+($i*($iTvListItemWidth+$iTvListButtonSpace)),$arPointTvListStart[1],$iTvListItemWidth,$iTvListButtonHeight)

    Ich hab es schon versucht umzubauen aber dann kommt gar kein Button mehr oder Text fehlt komplett :(

    Wegen der Position:

    Kann ich hier auch noch die Position angeben wie zb.

    Code
     ["192.168.0.10",$iDefaultPort, "TV 1", 400, 750], _

    und dann noch etwas zb. fürs Profil:

    Code
     ["192.168.0.10",$iDefaultPort, "TV 1", 400, 750, $arContextMenuButtons], _
     ["192.168.0.10",$iDefaultPort, "VW", 400, 750, $arContextMenuButtons2], _
     ["192.168.0.10",$iDefaultPort, "PC", 400, 750, $arContextMenuButtons3], _

    Hoff das ich dich nicht schon Nerv, ich hab früher nur Windows Application mit Autoit durchgeführt, aber das Projekt ist doch aufwendiger mit den Arrays

    Die Button Add and Remove hab ich komplett entfernt da ich das nicht benötige.

    lg

    Speedy

  • Für das Ändern des Namens musst du als ersten Parameter den Eintrag des Arrays nehmen, also so:

    C
    $arTvListControls[$i][0][0]=GUICtrlCreateButton($arTvList[$i][2],$arPointTvListStart[0]+($i*($iTvListItemWidth+$iTvListButtonSpace)),$arPointTvListStart[1],$iTvListItemWidth,$iTvListButtonHeight)

    Die Position kannst du natürlich auch mit in das Array geben und dann beim erstellen der Buttons entsprechend nutzen.

    Was das Profil angeht: Ja du kannst auch ein Array in ein anderes Speichern und somit die $arContextMenuButtons dort angeben. Meist speichert man dort aus performance gründen eher den Index und ruft dann mit dem Index die passenden Daten aus einem anderen Array, da dann weniger Daten gespeichert werden,... sollte für deinen Anwendungszweck aber nicht relevant sein, denke ich :thinking:

  • Hi,

    Danke das mit den Namen hat super funktioniert, sogar das umschreiben mit den Positionen für jeden TV hab ich jetzt heraus wie es funktioniert. Ganz langsam aber doch versteh ich es immer mehr die Arrays.

    das mit den 3d Arrays würde mich schon interessieren da ich vor allem gerne lerne.

    hättest du in meinen fällen ein bsp. wie ich es mir vorstellen muss ?

    Es werden vermutlich doch mehrere Profile da ich ja auch für den Receiver oder Receivern für die channel-liste auch ein machen muss.

    lg

    Speedy

    und Danke jetzt schon mal für deine Bemühung, bin heil froh das es schöner geht als mein erstes scrpt :)

    • Offizieller Beitrag

    Übrigens ist es gerade bei mehrdimensionalen Array eine Hilfe, wenn man die Indizes "sprechend" enumeriert, d.h. ihnen Variablennamen zuordnet, die leicht auf den Inhalt schließen lassen.

  • Hi BugFix,

    was ich nicht ganz versthe ist warum greift die erste Enum auf die Global $aDevices zu

    und das 2 Enum auf Ports.

    Das will mir gerade nicht in mein Kopf rein.


    Zu den Thema mit den Profilen komm ich leider gar nicht weiter, ich hätte keine Ansatz wie ich das umschreiben könnt :(

    auch ist mir beim Testen aufgefallen das ich bei 2 Telnet Befehle oder bzw. sogar manchmal 4 benötige beider Videowall.

    Ich tu mir leider immer noch mit den Contextmenu schwer wie es sich mit den arrays erstellt.


    Aber so wie es ausschaut brauch ich ja nur ein 2d array für die Profile kein 3d das ist unnötig.

  • Also hab mal es so versucht.

    Aber er schreibt mir immer ein Error, warum bin ich mir noch nicht sicher.

    Ich würde dann die Profile auf $Default_Profile ect. umschreiben und hier dann die Context menü drauf legen.

    Hoff das ich es implementieren kann.

    lg und Gute Nacht

    Speedy

  • Hi,

    Hier noch ein anderen versuch der komplett in die hose geht :)

    Dachte das mann die Enum vor jedem array angeben kann :(

    • Offizieller Beitrag
    C++
    ConsoleWrite('IP  (D-Box): ' & $aDevices[$D_Box_receiver][$IP][$Y_pos][$X_pos][$Profile] & @CRLF) 
    ConsoleWrite('Port (TV 1): ' & $aDevices[$TV1][$Port][$Profile] & @CRLF)

    Du kannst nur immer auf EINEN Wert in einem Array zugreifen! Der definiert sich in diesem Bsp.-Array (2D-Array) über Angabe der Schnittstelle von Zeile und Spalte.

    Damit du nicht das Array nach dem zu verwendenden Gerät durchsuchen musst, haben wir für jedes Gerät (das ja in einer eigenen Zeile steht mit seinen Werten) eine Variable statt der Zeilennummer, bzw. enthält diese Variable die Zeilennummer.

    $TV1 ist die erste enumerierte Variable und hat somit den Wert 0. Zugriff im Array hast du damit also auf die Zeile 0 - die erste Zeile.

    $Profile ist die sechste enumerierte Variable für die Spalten und hat somit den Wert 5. Zugriff im Array hast du damit auf die Spalte 5 -die letzte Spalte.

    Das Profil für "TV 1" erfragst du also indem du sagst: arrayGeräte-inZeileTV1-inSpalteProfile: $aDevices[$TV1][$Profile]

    Das Profil für "Sky Receiver" wäre demzufolge: $aDevices[$Sky_receiver][$Profile].

    Der X-Wert für "D-Box" ist dann: $aDevices[$D_Box_receiver][$X_pos].

    Fast identisch mit einer Excel-Tabelle, nur dass dort standardmäßig die Adressierung über Spalte,Zeile erfolgt. Hier ist es umgekehrt.

    Ich empfehle dir zum besseren Verständnis mal mein Array-Tut durchzulesen (s. Signatur).

  • Hallo ihr Lieben,

    Also erst mal danke für deine Erklärung ich hab mal gerstern und heute sehr viele Aha Effekte :) gehabt.

    Das mit den Arrays hab ich jetzt verstanden auch wie ich es abrufe. (zumindest mal 1d und 2d Arrays, bei den 3D denk ich auch das ich in der Theorie verstehe)

    hab auch noch mal ein paar anderen Sachen durchgelesen.

    Hier hab ich noch ein paar Unklarheiten gefunden, was ich noch nicht genau versteht.

    Hier mal der Code vom Func _refreshTvButtons()

    Ich versteh schon wie hier es funktioniert aber warum macht man zb hier:

    Code
     ReDim $arTvListControls[UBound($arTvList)][$iStartOfContextMenuButtons+UBound($arContextMenuButtons)][2]

    ReDim und nach den $arTvListControls kein =

    des weiteren Ubound bedeutet ja den wert leeren, so wie ich es verstanden habe.

    was noch komisch ist warum Global $arTvListControls[0][0][2] ganz oben ?

    Würde meine Aussage stimmen:

    Ich man die Array $arTvListControls setzt mit Ubound den wert zurück, und setzt mir die $arTvList und auf alle Button Namen von Array $arContextMenuButtons [2]

    aber für was brauch ich den $iStartOfContextMenuButtons , das kann ich ja vom Array auch auslesen lassen.

    Und warum muss ich das so in diesen klammer setzen. Das ist mit leider auch noch ein kleines Rätzel :)

    Das Letzte wo ich noch bedänken habe ist:

    Code
       For $i=0 to UBound($arTvList)-1 step 1

    ich setzt for $i die zahl 0 dann wieder das Ubound mein Array aber warum -1 step 1 ???? das will auch nicht in meinen Kopf.

    Ich hoff das ich dann noch den richtigen weg finde wie ich das mit den 2 Profilen bewerkstelligen kann :)

    Da hät ich mir was einfallen lassen mit in den Array Global $arTvList an wert 1, 2 oder 3 für die unterschiedlichen profilen und in der Func oder im Gui Case Else ein if abfrage wen 1, 2 oder 3 ist dann nimm die Func

    sollte ja auch gehen.


    Liebe Grüße

    Speedy

  • Hi,

    Mach gerade mehrere Übungen mit Arrays :) ein kurze zwischen frage hätt ich.

    Beim Stringsplit

    Code
    $string = "abcdef"
    Global $aSplit = StringSplit($string, "") ; leerer Trennzeichenstring führt zu Trennung nach jedem Zeichen
    
     ConsoleWrite($aSplit[0] & @LF)

    Stimmt das wenn ich das array mit

    Local $aTest [5] deklariere ruf ich es mit

    $aTest [0] beginned ab.

    wenn ich zählen lass ist [0] immer die anzall der Elemente. und es beginnt mit [1] (1D array)

    lg

    Speedy

    • Offizieller Beitrag

    Achte auf die Parameter bei StringSplit! Das Standardverhalten liefert die Anzahl der Splitelemente an $array[0]. Das kannst du aber mit dem Parameter $STR_NOCOUNT (2) deaktivieren. Was dann auch zum entsprechenden Verhalten im Fehlerfall führt:


    If flag is not equal to $STR_NOCOUNT, $aArray[0] is set to 1 and the full string is returned in $aArray[1].

    If flag is equal to $STR_NOCOUNT, the full string is returned in $aArray[0].

  • Hallo,

    Hoff das ich euch nicht schon am nerv gehe.

    Langsam aber doch gefällt mir die array sache immer mehr, vor allem was man alles damit machen kann.

    Hier noch mal paar fragen. hoff das ich das jetzt schon halbwegs richtig beschrieben habe:

    Code
    #Region Func
    
    Func _refreshTvButtons()
        ;resize control array
        ReDim $arTvListControls[UBound($arTvList)][$iStartOfContextMenuButtons+UBound($arContextMenuButtons)][2]

    Es wird ein 3d Array erstellt mit einmal der arTvList wie viel Elemente als Liste enthalten sind, die zweite ist [$iStartOfContextMenuButtons+UBound ($arContextMenuButtons)] die als Spalten eingefügt werden von der Liste $arContextMenuButtons,und die dritte ist die 2 3d Dimension.

    Nur was ich hier nicht verstehe ist warum ich die Telnet befehle als Spanten anhänge das ist mir zurzeit noch zu hoch.

    Auch versuche ich die $iStartOfContextMenuButtons komplett zu entfernen da ich dies eh nicht benötige.
    Aber das bekomm ich auch nicht hin.

    Zb hab ich versucht ein 2. Telnet command hinzuzufügen was hintereinander ausgeführt werden soll.
    wo kann ich den 2 befehle hinzufügen. Im Array $arContextMenuButtons als nächste spalte nur beim:

    Code
    telnet_send($arTvList[$i][0],$arTvList[$i][1],$arTvListControls[$i][$j][1], ???????????)

    schaff ich es nicht das der 2. Command dem Telnet func mitübergeben wird.

    Wie komm ich darauf das der 2. command vom $arContextMenuButtons [2] abgerufen wird.


    lg

    Speedy

    Einmal editiert, zuletzt von Speedy86 (9. März 2020 um 08:46)

  • Hallo Ihr lieben,

    Ich habe endlich wieder weiter gemacht mit meiner Tv Steuerung.

    Ein komischer Bug hab ich bemerkt wo ich nicht so ganz weiter kommt.

    Wisst Ihr eine Lösung in den Script weiter Oben.

    Wenn ich in der

    Code
    Global $arTvList=[ _
                         ["192.168.55.225",        $i_nec_port,     "TV 1",         100, 100], _
                         ["192.168.55.225",        $i_nec_port,     "TV 7",         700, 100] _
                      ] ;All client IP´s

    weniger als 3 Tv erstelle zb. nur 2 funktioniert das Contextmenü nicht mehr zum aufklappen. komisch das es mit der Linken Mausstate geht.

    Wenn 3 oder mehr sind funktioniert alle ohne Probleme.

    Das hab ich in der zwischen zeit geändert da ich kein:
    Global $iStartOfContextMenuButtons=X

    haben möchte wird ja eh von der Array Liste selbst gezählt.

    Hier noch die änderung dazu:

    Hat hier Irgendwer eine Idee ?

    lg

    Speedy