***ultimative Variablenfunktion***

  • Hey Leute: arbeite gerade an einem Großen Projekt und da kommt es doch öfter mal vor, dass man Doppelte VariablenName nehmen müsste, weil in nem Anderen Fenster auch ein 'OK' ist....
    Weil ich es unschön finde $ok1 oder $ok2 zu machen kahm mir gerade folgende idee...

    Altes Programm...

    [autoit]


    Enum $ok, $anzahl
    global $w_main[$anzahl]

    [/autoit][autoit][/autoit][autoit][/autoit]

    Hier ist der Mist, dass ja dann doch der 2e Button nicht als $ok deklariert werden kann, da $ok als const. für $w_main schon deklariert wurde...

    MEINE IDEE:

    Eine Funktion, die man aufruft, die Ein Array erstellt mit eben der Anzahl der Variablen... (also wie Enum)
    ANDERS wäre: Wenn ich dann $ok versuche schon zu erstellen, merkt die Funktion, dass $ok schon ein wert zugeordnet wurde (also für $w_main) und nimmt den entsprechenden schon zugeordneten Wert ....
    ...Den Satz kann man einfach nicht besser ausdrücken....


    ALSO EIN BEISPIEL:

    [autoit]


    ;Diese Funktion Deklariert IN der Funktion den Array als Global... Wüsste nich wies anders gehen sollte...
    _FunktionZumErstellenMeinesVariablenArrays($NameDesArraysDerErstelltWerdenSoll, 'Vaiablenname1+Variablenname2+Variablenname3...')

    [/autoit][autoit][/autoit][autoit]

    ;hier ist der Trick, bei dem es mit Enum zum fehler kommt und bei mir Funktionieren soll... Er sollte merken, dass Variablenname3 schoon einen wert hat und nimmt diesen...
    _FunktionZumErstellenMeinesVariablenArrays($name2, 'Variablenname3')

    [/autoit]

    Soweit verständlich??

    Kann mir jemand helfen?? ANregungen...??

    Mein Problem:
    Wie kann ich das Ganze meiner Funktion sagen... Bzw: Wie sage ich es, dass der zu deklarierende Variablenname Variabel ist...:D

    Oh, is das schwer... :huh::rock::rock:

    Einmal editiert, zuletzt von Mr_gitarre (11. Oktober 2010 um 20:51)

  • Warum machst nicht einfach den Fenstertital in deine Variabel rein also z.b. $HausfensterOk, $BaumschuleOK usw., dann siehst auch auf den ersten Blick zu was es nun genau gehört.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • weil meine Variablenname manchmal auch nen bisscehn(sehr) länger werden...

    Dadurch wird es unübersichtlich...

    Arrays find ichs besser

  • Ganz ehrlich, ich versteh deine Frage nicht so wirklich ...

    Willst du die Array erweitern ?
    Willst du dass er prüft ob sie nen Wert hat ?

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Hi!


    Soweit schon mal in die richtige richtung gedacht, mein vorschlag !

    [autoit]

    Local $aCtrlCreate[1][2]
    $aCtrlCreate[0][0] = GUICtrlCreateButton
    $aCtrlCreate[0][1] = ; Button - Name

    [/autoit]


    oder

    [autoit]

    Local $aCtrlCreate[1] = GUICtrlCreateButton
    GUICtrlRead($aCtrlCreate[0],1) ; Des control´s auslesn wobei das nicht mit jedem geht

    [/autoit]

    Edit:/ Beispiel, vieleicht noch groß-klein Schreibung prüfen!

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Local $aCtrlCreate[3], $Input
    Global $Form = GUICreate('Button', 300, 200, -1, -1)

    [/autoit] [autoit][/autoit] [autoit]

    $aCtrlCreate[0] = GUICtrlCreateButton('Enter', 20, 10, 80, 20)
    $aCtrlCreate[1] = GUICtrlCreateButton('OK', 20, 40, 80, 20)
    $Input = GUICtrlCreateInput('', 120, 40, 100, 20)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1 * Sleep(10)
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $aCtrlCreate[0]
    MsgBox(0, 0, GUICtrlRead($aCtrlCreate[0], 1) & ' ' & 'Wurde geklickt!')
    Case $aCtrlCreate[1]
    For $i = 0 To UBound($aCtrlCreate) - 1
    If GUICtrlRead($aCtrlCreate[$i], 1) <> GUICtrlRead($Input) And GUICtrlRead($Input) <> '' Then $aCtrlCreate[$i] = GUICtrlCreateButton(GUICtrlRead($Input), 20, 60, 80, 20)
    Next
    EndSwitch
    WEnd

    [/autoit]


    Lg Kleiner

    Einmal editiert, zuletzt von Kleiner (11. Oktober 2010 um 10:21)

    • Offizieller Beitrag

    Du kannst auch die Variablen in ein 2D-Array packen, um sie nach Fenstern (oder Subroutinen etc.) zu sortieren. Wobei die in der Enumeration verwendeten Variablen trotzdem eineindeutig sein müssen - es sei denn, du verwendest z.B. $OK immer an derselben Position im Array bei den einzelnen Dimensionen.
    Würde ich aber von abraten. Ein kurzes Präfix vereinfacht die Zuordnung.
    Mal ein Bsp., wie es aussehen könnte:

    Spoiler anzeigen
    [autoit]

    ; === Enumeration der verschiedenen Fenster (Main, Sub1, Sub2 [, etc.])
    Enum $main, $sub1, $sub2, $iCol

    [/autoit] [autoit][/autoit] [autoit]

    ; === Enumeration Variablen für die einzelnen Fenster
    ; === Main
    Enum $M_bla, $M_blub, $M_blob, $iRowMain
    ; === Sub1
    Enum $1_bla, $1_blub, $1_blob, $1_aha, $iRowS1
    ; === Sub2
    Enum $2_bla, $2_blub, $2_blob, $iRowS2

    [/autoit] [autoit][/autoit] [autoit]

    ; === max. Zeilenzahl(Variablen des Fensters) ermitteln
    Local $iMax = 0
    If $iRowMain > $iMax Then $iMax = $iRowMain
    If $iRowS1 > $iMax Then $iMax = $iRowS1
    If $iRowS2 > $iMax Then $iMax = $iRowS2

    [/autoit] [autoit][/autoit] [autoit]

    ; === ein Globales Array erstellen
    Global $aVar[$iMax][$iCol] ; [Variable][Fenster]

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; === Zugriff wäre dann so:
    $aVar[$M_bla][$main] = ....
    $aVar[$1_bla][$sub1] = ....
    $aVar[$2_bla][$sub2] = ....

    [/autoit]