Frage zur Gui bzw GUICtrlSetState

  • Hi, ich habe folgendes Dilemma.

    Bei meiner Funktion werden erstmal alle GUIGroups erstellt und Disabled sowie Versteckt.


    So mit dieser Funktion und den Aufrufen aus einem Array heraus werden alle erstellt, Disabled und Versteckt.

    Nun wollte ich die durch Klick auf die zugehörigen Radiobuttons wieder Enablen und Anzeigen.


    Allerdings Funktioniert das nicht, irgendwie habe ich heute echte Knoten.
    Wäre Super wenn mir da auch noch jemand einen Anstoss in die richtige richtung geben könnte.

    Vieln Dank im Voraus

  • Ja genau, also wie im Handbuch beschrieben:
    State values can be summed up as for example $GUI_DISABLE (128) + $GUI_HIDE (32) sets the control in an disabled and hidden state

    So müsste ja 80 das folgende tun:
    $GUI_ENABLE (64)
    Control will be enabled.
    $GUI_SHOW (16)
    Control will be visible. On Tabitem control will select the first tab to be
    displayed.

    Oder habe ich das Falsch verstanden?
    Ich meine bei 160 tut er ja auch was er tun soll.

    Danke im Voraus

  • Dieser Teil will sich mir absolut nicht erschließen.

    Du erstellst ein globales Array mit einer bestimten Anzahl und versuchst dann die States zu setzen.
    Schau mal mit _ArrayDisplay() nach ob das Array auch wirklich voll ist, normalerweise müsste es wegen der Neu-Deklaration leer sein.

    Außerdem ist die 2. For-Schleife mir ebenfalls schleierhaft, du gehst durchs Array aber veränderst nur den Index 0.

  • Ja, du hast recht.
    Man sollte eine Funktion nicht einfach Kopieren und die States ändern und nicht alles dabei berücksichtigen.
    Erstens muss das Global weg, zweitens füllt er mir bei der ersten Funktion zwar das Array, aber ich fülle es immer nur mit den letzten werten.
    Gibt es ausser mit Eval noch eine Möglichkeit Variablen zusammen zu führen?


    Hier beim setzen des Arrays $arFuellung ist der Hund im Pfeffer begraben :(
    Dieses Array wird bei mir immo durch eine Dynamische Anzahl neu befüllt, und natürlich ist immer nur das Letzte befüllen vorhanden.

    Ich sagte ja ich denke ich muss da nochmal komplett drüber :(
    Danke dir

  • Dieses Array wird bei mir immo durch eine Dynamische Anzahl neu befüllt, und natürlich ist immer nur das Letzte befüllen vorhanden.

    Was du suchst ist ReDim. Wenn du ReDim $aArray[UBound($aArray) + 1] verwendest, wird das Array um eins vergrößert aber alle Elemente bleiben erhalten.
    Wenn du es verkleinerst werden alle Indizes die abgeschnitten worden sind entfernt aber der Rest bleibt erhalten.

    Gibt es ausser mit Eval noch eine Möglichkeit Variablen zusammen zu führen?

    Eval solltest du im Normalfall überhaupt nicht verwenden. Wo nutzt du das im Script überhaupt bzw. was willst du erreichen mit "Variablen zusammenführen"?

  • Danke dir für deine Geduld mit einem Begriffsstutzigen Menschen :)
    Ich habe mir das ganze jetzt nochmal überlegt, ich denke ich sollte das wie ich es in PHP auch machen würde mit einem Array lösen.
    Nur habe ich jetzt ein Problem mit den Array in AutoIT.
    Ich setze das hier Falsch: Global $arFuellung[$Anzahl]
    Hier sollte ich das einfügen denke ich Global $arFuellung[$auswahl][$Anzahl]
    Nur $auswahl ist ein String.
    Da bringt mir AutoIT einen Fehler :(
    Jetzt habe ich das versucht als String einzusetzen, ["&"$auswahl&"] aber auch da bringt er mir einen Fehler :(

    Ich denke mal ich habe keine Ahnung mehr :(

  • Danke dir für deine Geduld mit einem Begriffsstutzigen Menschen

    Da gabs schon schlimmere.

    Nur habe ich jetzt ein Problem mit den Array in AutoIT.

    In "AutoIT" kenne ich mich nicht aus aber in AutoIt kann ich dir weiterhelfen.

    Ich denke mal ich habe keine Ahnung mehr

    Die Lösung liegt doch auf der Hand. Wenn $auswahl ein String ist und du das als Zahl haben willst, wie wäre es denn wenn du es mal in die Funktion Number gibst?

  • Das hast du jetzt Falsch verstanden^^
    Aber ich habe auch Geduld mit dir^^

    Ne das soll ja als String kommen.
    In PHP kann ich ja sowas machen über eine DB-Abfrage: $db[Schuh]
    In "AutoIt" :) bekomme ich das aber irgendwie nicht hin :(

    Danke

  • Hm, also ich habe das jetzt nochmal neu Definiert in meinem Code sprich etwas überarbeitet.(Also genau das was ich bin nämlich überarbeitet)

    Sieht nun so aus:

    Wie man sieht übergebe ich nun noch eine $setini.
    Das ist der Indexwert den ich zusätzlich benötige.
    Jetzt stelle ich mir die Frage wie kann ich es machen das alles was Relevant ist und Eindeutig sein muss diesen WErt mit zugewiesen bekommt.
    $wahl ist ja nun nach der IniReadSection schon ein Array.
    Ich hätte das nun gerne so gemacht z.B.:

    AutoIt
    $wahl_&$setini = IniReadSection("produktini\"&$auswahl&".ini,$auswahl)

    So hätte ich eindeutige namen für die Controls.
    Aber irgendwie will AutoIt das so nicht schlucken.
    Hat mir da vielleicht nochmal jemand einen rat?
    Das mit dem ReDim hab ich mir durchgelesen, muss aber zugeben immo übersteigt das mein Verständnis.
    Da brauch ich erst wieder etwas ruhe das ich mir das mal verinnerlichen kann.

    Danke schonmal im Voraus

    P.s: Wahrscheinlich habe ich wieder das offensichtliche übersehen, habt aber bitte nachsicht mit mir

    MfG

  • Hallo @Rigobert,

    Ich meine mit Assign kann es so in der Art machen. Allerdings wäre es wohl am besten ein Array mit den einzelnen IniReadSection-Arrays zu machen, wo dein setini den Index markiert.

    AutoIt
    Func fuellungenarray($auswahl,$setini)
    $aArrayWahlen[$setini] = IniReadSection("produktini\"&$auswahl&".ini,$auswahl)

    Grüße autoiter

  • Hi, es geht mir dabei eigentlich nichtmal so um die ReadIniSections.
    Mir geht es Hauptsächlich um die eindeutigkeit bei den Controls.
    Z.b.:

    AutoIt
    $groupauswahl[$setini] = GUICtrlCreateGroup($group, $groupsettings[1][1], $groupsettings[2][1], $groupsettings[3][1], $groupsettings[4][1])


    Hier ist das ja noch ok.
    Aber hier :

    Da komme ich immo nicht klar.
    Ok, ich denke statt $arFuellung, kann ich da ja $Anzahl einsetzen.
    Was dann so aussehen würde:

    AutoIt
    For $i = 0 To UBound($Anzahl) -1
    	If $i = 0 Then
    		$wahl[0][1] = 'Nichts gewählt'
    	EndIf
    	$auswahl[$i] = GUICtrlCreateRadio($wahl[$i][1], $controlstart[1][1], $controlstart[2][1] + 20*$i, $controlstart[3][1], $controlstart[4][1])
    		GUICtrlSetState($auswahl[$i], 160)
     Next
    For $i = 0 To UBound($Anzahl) -2 Step 2
        GUICtrlSetState($auswahl[0], $GUI_CHECKED)
    Next

    Hier denke ich sollte ich irgendwie das Array erweitern.
    Also das aus $auswahl[$i] gleich sowas wird wie $auswahl[$setini][$i]
    Aber das ist der Punkt wo bugfix ja auch meint das der Knoten im Kopf entsteht

    P.s: Ich glaube das ich hier mein Verständnisproblem habe.
    Weil ich irgendwie der Meinung bin das es hier ja schon Eindeutig ist, aber die Arrays sagen mir da was anderes immo.
    Oder ich bin zu Doof das wirklich zu verstehen :(
    Und genau das würde ich gerne ändern.

    Die IniReads sind da eher uninteressant, da ich die ja immer Aktuell auslese wenn ich die Controls erstelle.
    Wirklich erreichen will ich dadurch eigentlich nur das wie schon gesagt meine Controls alle Eindeutig sind, was sie immo nicht sind.
    Beim Befüllen werden diese immo dauernd überschrieben bis zum letzten und das ist dann auch das einzige das ich wirklich ansprechen kann :(
    Denn diese Funktion wird ja in der GUI erstellung aufgerufen:

    AutoIt
    For $i = 1 To $AnzahlProduktKategorien
     	fuellungenarray($auswahlKategorien[$i][1],$i)
    Next

    Hier sollen die GuiControls erstellt werden und dann entsprechend Hide und Disable.
    Da die Erste Auswahl Gruppe in der Gui immer an 2ter Stelle steht also feste gleiche Coords haben.
    Je nach Auswahl aus der ersten Gruppe die ja "Dynamisch" Statisch ist, soll dann die 2te Gruppe Angezeigt werden.
    Dann nach Auswahl aus der 2ten Gruppe wird die 3te angezeigt usw. usw.
    Das ganze soll eine Art Beschreibungstext Maschine werden.
    Da wir sehr viele gleiche Produkte haben die sich im Text und in der Beschreibung nur in ein paar dingen unterscheiden, diese will ich hier zusammenfassen um dann den Text aus einem Block mit den Entsprechenden werten anzupassen.
    Also z.B. Textblock: Dies ist ein [Produkt] aus der [Kategorie], es hat die Maße: [Groesse] und das Gewicht beträgt: [Gewicht] die Farbe ist: [Farbe]

    usw. usw.
    Dabei geht es mir darum das solche Fehler beim Copy und Paste nicht mehr vorkommen die man macht wenn man diese Texte Tausendfach von Hand bearbeitet.
    Ich will das nur noch oben Auswählen und dann wird der Textblock geladen und die Vars im Text mit den Daten aus der Auswahl der Gui gefüllt.

    Ich hoffe das war soweit verständlich erklärt.
    Was ich sonst noch habe sind verschiedene Textblöcke, diese habe ich aber in der Gui schon drin.
    Also die Inis werden aus der gleichen Gui befüllt.
    In dieser sind einfach verschiedene Tabs und verschiedene kleine Guis die für die Einstellungen zuständig sind.
    Dies ist alles schon fertig.
    Nur hier mit der sache tu ich mich echt schwer.
    Der Rest der Guis ist mit seinen Controls eh Statisch also kein Problem gewesen.
    Schön Aufgebaut und selbst erklärend^^

    Danke im Voraus für eure Geduld

    MfG

  • Hey @Rigobert,
    ich verstehe den Code nicht komplett. Aber ändere doch mal bei deinem ersten Code..

    Grüße autoiter

  • Oh sorry, das war ein versehen wegen dem Copy und Paste :)
    Darum dieses Script.

    Hier soll ja das State der [0] auf Checked gesetzt werden.
    Da muss ich die For entfernen, danke für den Hinweis.
    Das muss eigentlich nur heisen:

    GUICtrlSetState($arFuellung[0], $GUI_CHECKED)

    An der stelle geht es ja um den Initialen Aufruf der Gui.
    Glatt übersehen

  • Hmmm... So wie ich das Verstanden hab wäre die Verwendung von Comboboxen recht sinnvoll. Dort trifft man ja aus mehreren Werten eine Auswahl...
    Ich hab da mal zum erstellen von SQL-Befehlen was gebaut, vielleicht ist das in etwa deine Struktur/was du brauchen könntest:

    Hierbei wird bei der Auswahl eines Operanden die nächste Combobox erstellt und das ganze beliebig oft.
    Zusätzlich kann man beliebig viele Spalten erstellen.
    Bei dir wäre das: Je Produkt wird die 1te Auswahl getroffen, dann die 2te,...
    Sollte recht leicht anpassbar sein :)

  • Ich finde deine paar Zeilen Code schon schwer zu lesen ^^

    Die For Schleife sollte da also gar nicht hin? Dann bezieht sich

    Ok, ich denke statt $arFuellung, kann ich da ja $Anzahl einsetzen.

    nur auf die erste Schleife?

    Im ersten Code (Beitrag 16) schreibst du

    AutoIt
    Local $arFuellung[$Anzahl]

    dann meinst du, "$arFuellung, kann ich da ja (durch) $Anzahlkönnte" ersetzen und machst im zweiten Code:

    AutoIt
    For $i = 0 To UBound($Anzahl) -1

    Ist Anzahl hier die selbe Variable wie oben? (Hier hast du die Deklaration nicht mit im Code, daher kann ich nicht sicher sein).
    Wenn ja, dann ist das ein Fehler. Wenn $Anzahl nur eine Variable mit der Anzahl der Elemente eines Arrays ist, brauchst du kein/kannst du kein Ubound verwenden, womit du die Anzahl der Elemente eines Array ermittelst. Auf eine Variable angewendet führt das zu einem Fehler.
    Du könntest das durch

    AutoIt
    For $i = 0 To $Anzahl ; oder $Anzahl -1, wenn notwendig.

    ersetzen. Dann passiert hier auch etwas in der Schleife.


    Hierzu frage ich mich,

    Also das aus $auswahl[$i] gleich sowas wird wie $auswahl[$setini][$i]

    was ist denn $setini? Wenn du $setini einen Zahlenwert wie 0, 1, 2 usw. gibst, kann das doch als Indexwert von $auswahl dienen. $auswahl[1] ist dann gleich $auswahl[$setini], wenn $setini den Wert 1 hat. Das wäre eindeutig.


    Prinzipiell schau dir mal das hier an: https://www.autoitscript.com/wiki/Best_coding_practices

    Der Code wäre viel leichter nachvollziehbarer, wenn du dich an Regeln für die Benennung deiner Variablen halten würdest. (Ausführbare Beispiele sind auch nie schlecht ;) ).

    Grüße autoiter