Controls als Arrays

  • So, hi erstmal.

    Ich habe Quellcode der Form

    [autoit]

    $Label[$i][$j] = GUICtrlCreateLabel(IniRead($inifile, "Sektion"&$j, "key", "standart value"), 10, 10+10*$i)

    [/autoit]


    Den ich per schleifen fülle, das tut auch alles wunderbar, ich kann die gui initialisieren auf diese Art und Weise.
    Nun solllte sich bei Klick auf $Label[3][23] was tun, genauso wie bei Klick auf $Label[12][1] usw, aber was sich tut, ist immer von den beiden Indizes abhängig, wird sozusagen daraus errechnet oder eine Funktion mit diesen Indizes als Parameter führt dann irgendwas mithilfe dieser Indizes aus. Leider finde cih keinen Weg, an diese Indizes zu kommen.

    Weiß jemand eine Lösung?

    Meine Idee war es, im OnEventMode das passende Makro per Stringoperation zu zerstückeln, um an die beiden Indizes zu kommen, aber das tut nicht, da es eben Handles und keine Strings sind, und ich keine Funktion gefunden habe, die es mir erlaubt, den Namen der Handles zu bekommen, sprich den Variablennamen des Controls letztenendes.

    Einmal editiert, zuletzt von Weisgarnix (23. März 2011 um 17:06)

  • Hallo Weisgarnix,

    wenn es nicht alzu geheim ist, solltest du schon dein bisheriges Skript und die dazugehörige INI posten. Denn es wird wohl kaum einer dir dafür eine Musterlösung präsentieren,

    mfg autoBert

  • Da ich den bisherigen Quellcode teilweise von jemand anderem habe, der mir erlaubt hat, dran weiterzuarbeiten, weil er momentan nicht so viel Zeit hat, weiß ich nicht, wie einverstanden er damit ist, dass cih den Quellcode hier veröffentliche. Wie dem auch sei, ohne Veröffentlichung komme cih nicht weiter :(

    die beiden Ini-Dateien:
    1. Ini-Datei:

    Spoiler anzeigen


    2. Ini-Datei:

    Spoiler anzeigen

    Desweiteren hat er die initialisierung aufgrund der Codelänge ausgelagert, was hoffentlich kein Problem macht, sonst lager ichs halt wieder ein.

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <ComboConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <TabConstants.au3>
    #include <WindowsConstants.au3>

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

    Func _InitializeGui()
    Dim $onlineoffline
    $ping = Ping("www.google.com")
    If $ping > 0 then
    $onlineoffline = "data\website_online.jpg"
    Else
    $onlineoffline = "data\website_offline.jpg"
    EndIf

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

    $Form2 = GUICreate("Autoinstall Software-Collection ", 1024, 769, 208, 145)
    $Pic15 = GUICtrlCreatePic("data\header_left.jpg", 0, 0, 174, 48)
    GUICtrlSetTip(-1, "Website im Webbrowser öffnen")
    GUICtrlSetCursor (-1, 0)
    $Pic16 = GUICtrlCreatePic("data\background.jpg", 174, 0, 706, 48)
    $Help = GUICtrlCreatePic("data\help.jpg", 880, 0, 48, 48)
    GUICtrlSetTip(-1, "Hilfe und Anleitung")
    GUICtrlSetCursor (-1, 4)
    $About = GUICtrlCreatePic("data\about.jpg", 928, 0, 48, 48)
    GUICtrlSetTip(-1, "Über dieses Programm")
    GUICtrlSetCursor (-1, 4)
    $Combo1 = GUICtrlCreateCombo("Combo1", 648, 56, 369, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
    $Label33 = GUICtrlCreateLabel("Fertige Zusammenstellung auswählen", 464, 61, 181, 17)
    $Install_Markierte = GUICtrlCreateButton("Installiere markierte Software jetzt!", 8, 56, 193, 25)
    $Settings = GUICtrlCreatePic("data\settings.jpg", 976, 0, 48, 48)
    GUICtrlSetTip(-1, "Einstellungen")
    GUICtrlSetCursor (-1, 0)
    $PageControl1 = GUICtrlCreateTab(8, 88, 1012, 672)
    GUICtrlSetFont(-1, 8, 400, 0, "MS Sans Serif")

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

    $AnzKategorien=IniRead("settings.ini","Einstellungen","Kategorien","1")
    $AnzZusammenstellungen=IniRead("settings.ini","Einstellungen","Zusammenstellungen","1")
    ; An Stelle [n][1] im Array steht ein Name, an Stelle [n+1][1] steht der Pfad zur Konfigurationsdatei, für alle ungeraden n.
    $Kategorien=IniReadSection("settings.ini","Kategorien")
    ; Legt die Kategorien als Reiter-Array an.
    Dim $TabSheetKategorien[($AnzKategorien*2)-1]
    ; Legt die in jedem Reiter vorhandenen Elemente an...
    Dim $AktuellBildBox[$AnzKategorien]
    Dim $AktuellBild[$AnzKategorien]
    Dim $Software[$AnzKategorien]
    Dim $AktuellBeschreibungBox[$AnzKategorien]
    Dim $AktuellBeschreibung[$AnzKategorien]
    Dim $Beschreibung[$AnzKategorien]
    Dim $Grafik[$AnzKategorien]
    Dim $AktuellWebsite[$AnzKategorien]
    Dim $AktuellSprache[$AnzKategorien]
    Dim $AktuellInstall[$AnzKategorien]
    Dim $AktuellFreeware[$AnzKategorien]

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

    ;26 mögliche Elemente je Kategorie sollten reichen - passen ja eh nur 26 auf eine Seite...
    Dim $Checkboxen[$AnzKategorien][26]
    Dim $Icons[$AnzKategorien][26]
    Dim $Titel[$AnzKategorien][26]
    Dim $Hersteller[$AnzKategorien][26]

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

    $lw1=0
    $lw2=0
    While ($lw1 < ($AnzKategorien*2))
    $TabSheetKategorien[$lw1] = GUICtrlCreateTabItem($Kategorien[$lw1+1][1])
    $inifile=$Kategorien[$lw1+2][1]

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

    $Beschreibung[$lw2] = GUICtrlCreateEdit("", 16, 120, 489, 65, BitOR($ES_AUTOVSCROLL,$ES_READONLY,$ES_WANTRETURN,$WS_VSCROLL))
    $file = FileOpen(IniRead($inifile,"Daten","Beschreibung","fehlt.txt"), 0)
    GUICtrlSetData($Beschreibung[$lw2], FileRead($file))
    FileClose($file)

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

    $Grafik[$lw2] = GuiCtrlCreatePic(IniRead($inifile, "Daten", "Grafik", ""), 512, 120, 64, 64)

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

    $Software[$lw2] = GUICtrlCreateGroup("Software", 16, 191, 561, 553)
    GUICtrlCreateGroup("", -99, -99, 1, 1)

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

    $AktuellBildBox[$lw2] = GUICtrlCreateGroup("Logo/Bild", 592, 120, 417, 337)
    $AktuellBild[$lw2] = GUICtrlCreatePic("", 600, 144, 400, 300)
    GUICtrlCreateGroup("", -99, -99, 1, 1)

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

    $AktuellBeschreibungBox[$lw2] = GUICtrlCreateGroup("Beschreibung", 592, 527, 417, 217)
    $AktuellBeschreibung[$lw2] = GUICtrlCreateEdit("", 600, 544, 401, 193, BitOR($ES_AUTOVSCROLL,$ES_READONLY,$ES_WANTRETURN,$WS_VSCROLL))
    GUICtrlCreateGroup("", -99, -99, 1, 1)

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

    $AktuellWebsite[$lw2] = GUICtrlCreatePic($onlineoffline, 588, 464, 48, 48)
    GUICtrlSetTip(-1, "Website im Browser öffnen")
    GUICtrlSetCursor (-1, 0)
    ;GUICtrlSetState(-1, $GUI_HIDE)
    $AktuellSprache[$lw2] = GUICtrlCreatePic("data\german.jpg", 652, 464, 48, 48)
    GUICtrlSetTip(-1, "Sprache: deutsch")
    ;GUICtrlSetState(-1, $GUI_HIDE)
    $AktuellInstall[$lw2] = GUICtrlCreatePic("data\install.jpg", 959, 464, 48, 48)
    GUICtrlSetTip(-1, "Jetzt installieren!")
    GUICtrlSetCursor (-1, 0)
    ;GUICtrlSetState(-1, $GUI_HIDE)
    $AktuellFreeware[$lw2] = GUICtrlCreatePic("data\key.jpg", 711, 464, 48, 48)
    GUICtrlSetTip(-1, "Keine Freeware!")
    GUICtrlSetCursor (-1, 4)
    GUICtrlSetState(-1, $GUI_HIDE)

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

    ;Eintragen der Elemente in die Softwareliste
    $AnzElemente = IniRead($inifile, "Daten", "Elemente", 0)
    $lw3=0
    While ($lw3 < $AnzElemente)
    ;...
    $temp = Mod($lw3, 2)
    If ($temp == 0) Then
    ;linke Spalte
    $Checkboxen[$lw2][$lw3] = GUICtrlCreateCheckbox("", 24, Floor(223+40*($lw3/2)), 16, 16)
    $Icons[$lw2][$lw3] = GUICtrlCreateIcon(IniRead($inifile, "Element"&$lw3+1, "Icon", "data\setup.ico"), -1, 40, Floor(215+40*($lw3/2)), 32, 32)
    $Hersteller[$lw2][$lw3] = GUICtrlCreateLabel(IniRead($inifile, "Element"&$lw3+1, "Hersteller", "unbekannter Hersteller"), 80, Floor(215+40*($lw3/2)))
    $Titel[$lw2][$lw3] = GUICtrlCreateLabel(IniRead($inifile, "Element"&$lw3+1, "Name", "?")&" v"&IniRead($inifile, "Element"&$lw3+1, "Version", "1"), 80, Floor(231+40*($lw3/2)))
    Else
    ;Rechte Spalte
    $Checkboxen[$lw2][$lw3] = GUICtrlCreateCheckbox("", 296, 203+40*($lw3/2), 16, 16)
    $Icons[$lw2][$lw3] = GUICtrlCreateIcon(IniRead($inifile, "Element"&$lw3+1, "Icon", "data\setup.ico"), -1, 296, 195+40*($lw3/2), 32, 32)
    $Hersteller[$lw2][$lw3] = GUICtrlCreateLabel(IniRead($inifile, "Element"&$lw3+1, "Hersteller", "unbekannter Hersteller"), 352, 195+40*($lw3/2))
    $Titel[$lw2][$lw3] = GUICtrlCreateLabel(IniRead($inifile, "Element"&$lw3+1, "Name", "?")&" v"&IniRead($inifile, "Element"&$lw3+1, "Version", "1"), 352, Floor(211+40*($lw3/2)))
    EndIf
    ;...
    $lw3=$lw3+1
    WEnd

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

    ;übriger Code für die einzelnen Kategorien
    ;Erhöhen der Laufvariablen, $lw1 zählt im Auslesearray, $lw2 zählt in den Zielarrays, beide zählen in den Kategorien hoch.
    $lw1=$lw1+2
    $lw2=$lw2+1
    WEnd
    GUICtrlCreateTabItem("")
    EndFunc

    [/autoit]

    Die Main-au3 sieht so aus (ruft bisher eigentlich nur _InitializeGui() auf):

    Spoiler anzeigen
    [autoit]

    AutoitSetOption("TrayIconHide" ,1)

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

    #include <ButtonConstants.au3>
    #include <ComboConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <TabConstants.au3>
    #include <WindowsConstants.au3>

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

    #include <generategui.au3>

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

    #RequireAdmin

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

    _InitializeGui()
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit]

    Reichen diese Infos, um zu verstehen, in welchem Loch cih stecke?^^ ich müsste die Indizes des angeklickten Controls wieder rausfinden :(
    Relevant sind die hier (die sollen nachher anklickbar sein):
    $Icons[][]
    $Hersteller[][]
    $Titel[][]

    Danke schonmal auf jeden Fall!

    *Edit* Ich habe ihn gerade erreicht und gefragt: Es ist ihm vollkommen egal, was ich mit dem Code wo mache ;)

    2 Mal editiert, zuletzt von Weisgarnix (21. März 2011 um 02:45)

  • Hallo Weisgarnix,

    das kannst du so machen:

    Spoiler anzeigen
    [autoit]

    AutoItSetOption("TrayIconHide", 1)

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

    #include <ButtonConstants.au3>
    #include <ComboConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <TabConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiTab.au3>
    #include <array.au3>

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

    ;#include <generategui.au3>

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

    #RequireAdmin

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

    #include <ButtonConstants.au3>
    #include <ComboConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <TabConstants.au3>
    #include <WindowsConstants.au3>

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

    ;Func _InitializeGui()
    Dim $onlineoffline
    $ping = Ping("www.google.com")
    If $ping > 0 Then
    $onlineoffline = "data\website_online.jpg"
    Else
    $onlineoffline = "data\website_offline.jpg"
    EndIf

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

    $Form2 = GUICreate("Autoinstall Software-Collection ", 1024, 769, 208, 145)
    $Pic15 = GUICtrlCreatePic("data\header_left.jpg", 0, 0, 174, 48)
    GUICtrlSetTip(-1, "Website im Webbrowser öffnen")
    GUICtrlSetCursor(-1, 0)
    $Pic16 = GUICtrlCreatePic("data\background.jpg", 174, 0, 706, 48)
    $Help = GUICtrlCreatePic("data\help.jpg", 880, 0, 48, 48)
    GUICtrlSetTip(-1, "Hilfe und Anleitung")
    GUICtrlSetCursor(-1, 4)
    $About = GUICtrlCreatePic("data\about.jpg", 928, 0, 48, 48)
    GUICtrlSetTip(-1, "Über dieses Programm")
    GUICtrlSetCursor(-1, 4)
    $Combo1 = GUICtrlCreateCombo("Combo1", 648, 56, 369, 25, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL))
    $Label33 = GUICtrlCreateLabel("Fertige Zusammenstellung auswählen", 464, 61, 181, 17)
    $Install_Markierte = GUICtrlCreateButton("Installiere markierte Software jetzt!", 8, 56, 193, 25)
    $Settings = GUICtrlCreatePic("data\settings.jpg", 976, 0, 48, 48)
    GUICtrlSetTip(-1, "Einstellungen")
    GUICtrlSetCursor(-1, 0)
    $PageControl1 = GUICtrlCreateTab(8, 88, 1012, 672)
    GUICtrlSetFont(-1, 8, 400, 0, "MS Sans Serif")

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

    $AnzKategorien = IniRead("settings.ini", "Einstellungen", "Kategorien", "1")
    $AnzZusammenstellungen = IniRead("settings.ini", "Einstellungen", "Zusammenstellungen", "1")
    ; An Stelle [n][1] im Array steht ein Name, an Stelle [n+1][1] steht der Pfad zur Konfigurationsdatei, für alle ungeraden n.
    $Kategorien = IniReadSection("settings.ini", "Kategorien")
    ; Legt die Kategorien als Reiter-Array an.
    Dim $TabSheetKategorien[($AnzKategorien * 2) - 1]
    ; Legt die in jedem Reiter vorhandenen Elemente an...
    Dim $AktuellBildBox[$AnzKategorien]
    Dim $AktuellBild[$AnzKategorien]
    Dim $Software[$AnzKategorien]
    Dim $AktuellBeschreibungBox[$AnzKategorien]
    Dim $AktuellBeschreibung[$AnzKategorien]
    Dim $Beschreibung[$AnzKategorien]
    Dim $Grafik[$AnzKategorien]
    Dim $AktuellWebsite[$AnzKategorien]
    Dim $AktuellSprache[$AnzKategorien]
    Dim $AktuellInstall[$AnzKategorien]
    Dim $AktuellFreeware[$AnzKategorien]

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

    ;26 mögliche Elemente je Kategorie sollten reichen - passen ja eh nur 26 auf eine Seite...
    Dim $Checkboxen[$AnzKategorien][26]
    Dim $Icons[$AnzKategorien][26]
    Dim $Titel[$AnzKategorien][26]
    Dim $Hersteller[$AnzKategorien][26]

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

    $lw1 = 0
    $lw2 = 0
    While ($lw1 < ($AnzKategorien * 2))
    $TabSheetKategorien[$lw1] = GUICtrlCreateTabItem($Kategorien[$lw1 + 1][1])
    $inifile = $Kategorien[$lw1 + 2][1]

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

    $Beschreibung[$lw2] = GUICtrlCreateEdit("", 16, 120, 489, 65, BitOR($ES_AUTOVSCROLL, $ES_READONLY, $ES_WANTRETURN, $WS_VSCROLL))
    $file = FileOpen(IniRead($inifile, "Daten", "Beschreibung", "fehlt.txt"), 0)
    GUICtrlSetData($Beschreibung[$lw2], FileRead($file))
    FileClose($file)

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

    $Grafik[$lw2] = GUICtrlCreatePic(IniRead($inifile, "Daten", "Grafik", ""), 512, 120, 64, 64)

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

    $Software[$lw2] = GUICtrlCreateGroup("Software", 16, 191, 561, 553)
    GUICtrlCreateGroup("", -99, -99, 1, 1)

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

    $AktuellBildBox[$lw2] = GUICtrlCreateGroup("Logo/Bild", 592, 120, 417, 337)
    $AktuellBild[$lw2] = GUICtrlCreatePic("", 600, 144, 400, 300)
    GUICtrlCreateGroup("", -99, -99, 1, 1)

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

    $AktuellBeschreibungBox[$lw2] = GUICtrlCreateGroup("Beschreibung", 592, 527, 417, 217)
    $AktuellBeschreibung[$lw2] = GUICtrlCreateEdit("", 600, 544, 401, 193, BitOR($ES_AUTOVSCROLL, $ES_READONLY, $ES_WANTRETURN, $WS_VSCROLL))
    GUICtrlCreateGroup("", -99, -99, 1, 1)

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

    $AktuellWebsite[$lw2] = GUICtrlCreatePic($onlineoffline, 588, 464, 48, 48)
    GUICtrlSetTip(-1, "Website im Browser öffnen")
    GUICtrlSetCursor(-1, 0)
    ;GUICtrlSetState(-1, $GUI_HIDE)
    $AktuellSprache[$lw2] = GUICtrlCreatePic("data\german.jpg", 652, 464, 48, 48)
    GUICtrlSetTip(-1, "Sprache: deutsch")
    ;GUICtrlSetState(-1, $GUI_HIDE)
    $AktuellInstall[$lw2] = GUICtrlCreatePic("data\install.jpg", 959, 464, 48, 48)
    GUICtrlSetTip(-1, "Jetzt installieren!")
    GUICtrlSetCursor(-1, 0)
    ;GUICtrlSetState(-1, $GUI_HIDE)
    $AktuellFreeware[$lw2] = GUICtrlCreatePic("data\key.jpg", 711, 464, 48, 48)
    GUICtrlSetTip(-1, "Keine Freeware!")
    GUICtrlSetCursor(-1, 4)
    GUICtrlSetState(-1, $GUI_HIDE)

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

    ;Eintragen der Elemente in die Softwareliste
    $AnzElemente = IniRead($inifile, "Daten", "Elemente", 0)
    $lw3 = 0
    While ($lw3 < $AnzElemente)
    ;...
    $temp = Mod($lw3, 2)
    If ($temp == 0) Then
    ;linke Spalte
    $Checkboxen[$lw2][$lw3] = GUICtrlCreateCheckbox("", 24, Floor(223 + 40 * ($lw3 / 2)), 16, 16)
    $Icons[$lw2][$lw3] = GUICtrlCreateIcon(IniRead($inifile, "Element" & $lw3 + 1, "Icon", "data\setup.ico"), -1, 40, Floor(215 + 40 * ($lw3 / 2)), 32, 32)
    ;GUICtrlSetState(-1,$Gui_DISABLE)
    $Hersteller[$lw2][$lw3] = GUICtrlCreateLabel(IniRead($inifile, "Element" & $lw3 + 1, "Hersteller", "unbekannter Hersteller"), 80, Floor(215 + 40 * ($lw3 / 2)))
    ;GUICtrlSetState(-1,$Gui_DISABLE)
    $Titel[$lw2][$lw3] = GUICtrlCreateLabel(IniRead($inifile, "Element" & $lw3 + 1, "Name", "?") & " v" & IniRead($inifile, "Element" & $lw3 + 1, "Version", "1"), 80, Floor(231 + 40 * ($lw3 / 2)))
    ;GUICtrlSetState(-1,$Gui_DISABLE)
    Else
    ;Rechte Spalte
    $Checkboxen[$lw2][$lw3] = GUICtrlCreateCheckbox("", 296, 203 + 40 * ($lw3 / 2), 16, 16)
    $Icons[$lw2][$lw3] = GUICtrlCreateIcon(IniRead($inifile, "Element" & $lw3 + 1, "Icon", "data\setup.ico"), -1, 296, 195 + 40 * ($lw3 / 2), 32, 32)
    ;GUICtrlSetState(-1,$Gui_DISABLE)
    $Hersteller[$lw2][$lw3] = GUICtrlCreateLabel(IniRead($inifile, "Element" & $lw3 + 1, "Hersteller", "unbekannter Hersteller"), 352, 195 + 40 * ($lw3 / 2))
    ;GUICtrlSetState(-1,$Gui_DISABLE)
    $Titel[$lw2][$lw3] = GUICtrlCreateLabel(IniRead($inifile, "Element" & $lw3 + 1, "Name", "?") & " v" & IniRead($inifile, "Element" & $lw3 + 1, "Version", "1"), 352, Floor(211 + 40 * ($lw3 / 2)))
    ;GUICtrlSetState(-1,$Gui_DISABLE)
    EndIf
    ;...
    $lw3 = $lw3 + 1
    WEnd

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

    ;übriger Code für die einzelnen Kategorien
    ;Erhöhen der Laufvariablen, $lw1 zählt im Auslesearray, $lw2 zählt in den Zielarrays, beide zählen in den Kategorien hoch.
    $lw1 = $lw1 + 2
    $lw2 = $lw2 + 1
    WEnd
    GUICtrlCreateTabItem("")
    ;EndFunc
    ;_InitializeGui()
    GUISetState(@SW_SHOW)

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

    $iAktTab = 0
    ConsoleWrite("Anzahl Elemente : " & $AnzElemente & @CRLF)
    $AnzElemente = 11 ;ist seltsamerweise nicht gesetzt

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $PageControl1
    $iAktTab = _GUICtrlTab_GetCurSel($PageControl1)
    Case $Checkboxen[$iAktTab][0] To $Titel[$iAktTab][$AnzElemente - 1]
    if mod($nMsg - $Checkboxen[$iAktTab][0],4) Then
    $iAktCheckBox = -1 ;es kann keine Checkbox sein
    else
    $iAktCheckBox = ($nMsg - $Checkboxen[$iAktTab][0]) /4
    EndIf
    ConsoleWrite("Checkbox: " & $iAktCheckBox & @CRLF) ;wenn negativ wurde keine Checkbox angeklickt
    EndSwitch
    WEnd

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

    ich musste allerdings alles eine Datei nehmen, zwecks Übersicht. Das ganze würde auch im OnEvet-Modus funktionieren @GuiCtrId ist da dass Zauberwort,

    mfg autoBert

  • Zitat von Weisgarnix

    aber was sich tut, ist immer von den beiden Indizes abhängig,

    falsch, es ist abhängig von der ControlID des Objektes.
    Entweder übernimmst du autoBert´s Vorschlag des onevent-Modus, oder du errechnest dir die "Position" des Controls aus der ID.
    Da die ID´s fortlaufend vergeben werden, ist das Verfahren einfach, wenn du die Controls Reihen- oder Spaltenweise anlegst.
    Bsp.: Anlegen von 10x10 Controls als 2-dimensionales Array, zeilenweise (erstes Element im Array[1][1])
    Dann ergibt sich bei Klick auf das Control 79 die Zeile zu int(ctrlID/Anzahl Zeilen) = int(79/10), somit 7
    und die Spalte zu 79-7*anzahl zeilen = 79-7*10 = 9
    Das geklickte Objekt hat also die Indizes array[7][9]

  • Hi autoBert!

    Danke für die Hilfe, so was ähnliches hatte ich irgendwo gelesen aber konnte es nicht auf mein Projekt adaptieren :(

    AnzElemente ist 26-1, das habe ich so festgelegt, weil eh nicht mehr Platz als 13 Elemente / "Spalte" ist, geht er halt die nicht erstellten auch durch, aber da sie nicht "gefüllt"/"initialisiert" wurden sondern nur das Array der Größe erstellt wurde, können sie es ja auch nicht sein, die angeklickt wurden.

    Versuche mich nun daran, ich danke vielmals! ;)

    *Edit* Wofür brauche ich den Modulo?
    Du vergleichst da Äpfel mi Birnen, ich habe vorne am "To" und hinten mal dasselbe Array gesetzt, denke, das war ein Versehen.
    Dennoch, wofür der Modulo 4? Und welchen Modulo brauche ich für die anderen Elemente, die nicht eine Checkbox sind, sondern $Icons[][] oder $Titel[][] oder $Hersteller[][]? Den Modulo-Part blick ich irgendwie nicht... :(

    [autoit]

    $AktuellTab = 0

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $PageControl1
    $AktuellTab = _GUICtrlTab_GetCurSel($PageControl1)
    Case $Icons[$AktuellTab][0] To $Icons[$AktuellTab][25]
    if mod($nMsg - $Icons[$AktuellTab][0],4) Then
    $AktuellIcon = -1;es kann kein Icon sein
    else
    $AktuellIcon = ($nMsg - $Icons[$AktuellTab][0])/4
    EndIf
    EndSwitch
    WEnd

    [/autoit]

    Edit again: Ich glaube, ich komme so langsam dahinter. Jedes vierte Element während der Konstruktion durch Schleifen war eine Checkbox. für Rest 3 ists dann ein Titel, für Rest 1 ein Icon und für Rest 2 ein Titel usw.
    Ich habe allerdings Probleme mit der Kurzschreibweise. Was bedeutet der Teil

    [autoit]

    if mod($nMsg - $Checkboxen[$iAktTab][0],4) Then
    $iAktCheckBox = -1 ;es kann keine Checkbox sein
    else
    $iAktCheckBox = ($nMsg - $Checkboxen[$iAktTab][0]) /4
    EndIf

    [/autoit]


    Ausfürlich? mod returned doch den Rest, oder nicht? Ich kenne die Kurzschreibweise if true then aber nicht if 0 then bzw if 7 then, woher weiß ich, auf welche Ziffer autoit dann reagiert und in den then-Teil geht?

    Und noch eine Frage: Fängt er dann sozusagen für diese Abfrage mit $Checkboxen[$AktuellTab][0] an und gibt diesem Control für diese Abfrage die ID 0 oder ist das die ID, die diesem Control beim Erstellen zugewiesen wurde? Falls letzteres der Fall ist, dürfte es verdammt schwer werden, da die Anzahl der vorherigen Controls ja variabel ist, oder?

    6 Mal editiert, zuletzt von Weisgarnix (21. März 2011 um 17:08)

  • Du könntest "Switch" benutzten und die Abfrage lösen wie:

    [autoit]

    Switch Mod($nMsg - $Checkboxen[$iAktTab][0],4) Then
    Case 0
    $iAktCheckBox = ($nMsg - $Checkboxen[$iAktTab][0]) /4 ; Checkbox
    Case 1
    $iAktCheckBox = -1 ; Irgendetwas anderes
    Case Else
    $iAktCheckBox = -1 ; Der ganze Rest
    EndSwitch

    [/autoit]

    Ach, und AutoIt geht in "Then", wenn die Zahl größer als 0 ist. Somit würde er bei 1, 2, 3 (, 4, 5 ...) in "Then" gehen und ansonsten "Else".
    Eine präziesere Abfage kannst du mit "If Mod($nMsg - $Checkboxen[$iAktTab][0],4) = 0 Then" machen, aber Switch ist besser geeignet, wenn du mehrere Fälle bearbeiten willst.

  • Hallo WeisGarNix,

    Edit* Wofür brauche ich den Modulo?
    Du vergleichst da Äpfel mi Birnen, ich habe vorne am "To" und hinten mal dasselbe Array gesetzt, denke, das war ein Versehen.
    Dennoch, wofür der Modulo 4? Und welchen Modulo brauche ich für die anderen Elemente, die nicht eine Checkbox sind, sondern $Icons[][] oder $Titel[][] oder $Hersteller[][]? Den Modulo-Part blick ich irgendwie nicht... :(

    da ich mich schon gedacht habe dass du auch Icons, Hertsteller und Tiltel klicken willst habe ich in diesem Case-Zweig alle möglichen Elemente hinneigenommen:

    [autoit]

    Case $Checkboxen[$iAktTab][0] To $Titel[$iAktTab][$AnzElemente - 1]

    [/autoit]

    da auf Elemente die nicht da sind auch nicht geprüft werden muss $AnzElemnete -1
    allerdings ist mir aufgefallen dass $AnzElemente nicht (mehr) initialisiert ist, siehe Ausgabe von Zeile 161 deshalb habe ich in Zeile 162 dies fix auf 11 gesetzt, kann aus Ini gelesen werden.
    Modulo gebrauche ich weil du 4 verschiedene Arten von Eemneten hast, damit stelle ich sicher dass die jeweilige Variable $iAktCheckBox, $iAktIcon, $iAktHersteller und $iAktTitel den Wert des geklickten Elementes erhält bzw. -1 wenn nicht angeklickt. Dies ist in diesem erweiterten Skript (C&P, S&R) als Consoleausgabe zu sehen:

    Spoiler anzeigen
    [autoit]

    AutoItSetOption("TrayIconHide", 1)

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

    #include <ButtonConstants.au3>
    #include <ComboConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <TabConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiTab.au3>
    #include <array.au3>

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

    ;#include <generategui.au3>

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

    #RequireAdmin

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

    #include <ButtonConstants.au3>
    #include <ComboConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <TabConstants.au3>
    #include <WindowsConstants.au3>

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

    ;Func _InitializeGui()
    Dim $onlineoffline
    $ping = Ping("www.google.com")
    If $ping > 0 Then
    $onlineoffline = "data\website_online.jpg"
    Else
    $onlineoffline = "data\website_offline.jpg"
    EndIf

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

    $Form2 = GUICreate("Autoinstall Software-Collection ", 1024, 769, 208, 145)
    $Pic15 = GUICtrlCreatePic("data\header_left.jpg", 0, 0, 174, 48)
    GUICtrlSetTip(-1, "Website im Webbrowser öffnen")
    GUICtrlSetCursor(-1, 0)
    $Pic16 = GUICtrlCreatePic("data\background.jpg", 174, 0, 706, 48)
    $Help = GUICtrlCreatePic("data\help.jpg", 880, 0, 48, 48)
    GUICtrlSetTip(-1, "Hilfe und Anleitung")
    GUICtrlSetCursor(-1, 4)
    $About = GUICtrlCreatePic("data\about.jpg", 928, 0, 48, 48)
    GUICtrlSetTip(-1, "Über dieses Programm")
    GUICtrlSetCursor(-1, 4)
    $Combo1 = GUICtrlCreateCombo("Combo1", 648, 56, 369, 25, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL))
    $Label33 = GUICtrlCreateLabel("Fertige Zusammenstellung auswählen", 464, 61, 181, 17)
    $Install_Markierte = GUICtrlCreateButton("Installiere markierte Software jetzt!", 8, 56, 193, 25)
    $Settings = GUICtrlCreatePic("data\settings.jpg", 976, 0, 48, 48)
    GUICtrlSetTip(-1, "Einstellungen")
    GUICtrlSetCursor(-1, 0)
    $PageControl1 = GUICtrlCreateTab(8, 88, 1012, 672)
    GUICtrlSetFont(-1, 8, 400, 0, "MS Sans Serif")

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

    $AnzKategorien = IniRead("settings.ini", "Einstellungen", "Kategorien", "1")
    $AnzZusammenstellungen = IniRead("settings.ini", "Einstellungen", "Zusammenstellungen", "1")
    ; An Stelle [n][1] im Array steht ein Name, an Stelle [n+1][1] steht der Pfad zur Konfigurationsdatei, für alle ungeraden n.
    $Kategorien = IniReadSection("settings.ini", "Kategorien")
    ; Legt die Kategorien als Reiter-Array an.
    Dim $TabSheetKategorien[($AnzKategorien * 2) - 1]
    ; Legt die in jedem Reiter vorhandenen Elemente an...
    Dim $AktuellBildBox[$AnzKategorien]
    Dim $AktuellBild[$AnzKategorien]
    Dim $Software[$AnzKategorien]
    Dim $AktuellBeschreibungBox[$AnzKategorien]
    Dim $AktuellBeschreibung[$AnzKategorien]
    Dim $Beschreibung[$AnzKategorien]
    Dim $Grafik[$AnzKategorien]
    Dim $AktuellWebsite[$AnzKategorien]
    Dim $AktuellSprache[$AnzKategorien]
    Dim $AktuellInstall[$AnzKategorien]
    Dim $AktuellFreeware[$AnzKategorien]

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

    ;26 mögliche Elemente je Kategorie sollten reichen - passen ja eh nur 26 auf eine Seite...
    Dim $Checkboxen[$AnzKategorien][26]
    Dim $Icons[$AnzKategorien][26]
    Dim $Titel[$AnzKategorien][26]
    Dim $Hersteller[$AnzKategorien][26]

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

    $lw1 = 0
    $lw2 = 0
    While ($lw1 < ($AnzKategorien * 2))
    $TabSheetKategorien[$lw1] = GUICtrlCreateTabItem($Kategorien[$lw1 + 1][1])
    $inifile = $Kategorien[$lw1 + 2][1]

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

    $Beschreibung[$lw2] = GUICtrlCreateEdit("", 16, 120, 489, 65, BitOR($ES_AUTOVSCROLL, $ES_READONLY, $ES_WANTRETURN, $WS_VSCROLL))
    $file = FileOpen(IniRead($inifile, "Daten", "Beschreibung", "fehlt.txt"), 0)
    GUICtrlSetData($Beschreibung[$lw2], FileRead($file))
    FileClose($file)

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

    $Grafik[$lw2] = GUICtrlCreatePic(IniRead($inifile, "Daten", "Grafik", ""), 512, 120, 64, 64)

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

    $Software[$lw2] = GUICtrlCreateGroup("Software", 16, 191, 561, 553)
    GUICtrlCreateGroup("", -99, -99, 1, 1)

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

    $AktuellBildBox[$lw2] = GUICtrlCreateGroup("Logo/Bild", 592, 120, 417, 337)
    $AktuellBild[$lw2] = GUICtrlCreatePic("", 600, 144, 400, 300)
    GUICtrlCreateGroup("", -99, -99, 1, 1)

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

    $AktuellBeschreibungBox[$lw2] = GUICtrlCreateGroup("Beschreibung", 592, 527, 417, 217)
    $AktuellBeschreibung[$lw2] = GUICtrlCreateEdit("", 600, 544, 401, 193, BitOR($ES_AUTOVSCROLL, $ES_READONLY, $ES_WANTRETURN, $WS_VSCROLL))
    GUICtrlCreateGroup("", -99, -99, 1, 1)

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

    $AktuellWebsite[$lw2] = GUICtrlCreatePic($onlineoffline, 588, 464, 48, 48)
    GUICtrlSetTip(-1, "Website im Browser öffnen")
    GUICtrlSetCursor(-1, 0)
    ;GUICtrlSetState(-1, $GUI_HIDE)
    $AktuellSprache[$lw2] = GUICtrlCreatePic("data\german.jpg", 652, 464, 48, 48)
    GUICtrlSetTip(-1, "Sprache: deutsch")
    ;GUICtrlSetState(-1, $GUI_HIDE)
    $AktuellInstall[$lw2] = GUICtrlCreatePic("data\install.jpg", 959, 464, 48, 48)
    GUICtrlSetTip(-1, "Jetzt installieren!")
    GUICtrlSetCursor(-1, 0)
    ;GUICtrlSetState(-1, $GUI_HIDE)
    $AktuellFreeware[$lw2] = GUICtrlCreatePic("data\key.jpg", 711, 464, 48, 48)
    GUICtrlSetTip(-1, "Keine Freeware!")
    GUICtrlSetCursor(-1, 4)
    GUICtrlSetState(-1, $GUI_HIDE)

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

    ;Eintragen der Elemente in die Softwareliste
    $AnzElemente = IniRead($inifile, "Daten", "Elemente", 0)
    $lw3 = 0
    While ($lw3 < $AnzElemente)
    ;...
    $temp = Mod($lw3, 2)
    If ($temp == 0) Then
    ;linke Spalte
    $Checkboxen[$lw2][$lw3] = GUICtrlCreateCheckbox("", 24, Floor(223 + 40 * ($lw3 / 2)), 16, 16)
    $Icons[$lw2][$lw3] = GUICtrlCreateIcon(IniRead($inifile, "Element" & $lw3 + 1, "Icon", "data\setup.ico"), -1, 40, Floor(215 + 40 * ($lw3 / 2)), 32, 32)
    ;GUICtrlSetState(-1,$Gui_DISABLE)
    $Hersteller[$lw2][$lw3] = GUICtrlCreateLabel(IniRead($inifile, "Element" & $lw3 + 1, "Hersteller", "unbekannter Hersteller"), 80, Floor(215 + 40 * ($lw3 / 2)))
    ;GUICtrlSetState(-1,$Gui_DISABLE)
    $Titel[$lw2][$lw3] = GUICtrlCreateLabel(IniRead($inifile, "Element" & $lw3 + 1, "Name", "?") & " v" & IniRead($inifile, "Element" & $lw3 + 1, "Version", "1"), 80, Floor(231 + 40 * ($lw3 / 2)))
    ;GUICtrlSetState(-1,$Gui_DISABLE)
    Else
    ;Rechte Spalte
    $Checkboxen[$lw2][$lw3] = GUICtrlCreateCheckbox("", 296, 203 + 40 * ($lw3 / 2), 16, 16)
    $Icons[$lw2][$lw3] = GUICtrlCreateIcon(IniRead($inifile, "Element" & $lw3 + 1, "Icon", "data\setup.ico"), -1, 296, 195 + 40 * ($lw3 / 2), 32, 32)
    ;GUICtrlSetState(-1,$Gui_DISABLE)
    $Hersteller[$lw2][$lw3] = GUICtrlCreateLabel(IniRead($inifile, "Element" & $lw3 + 1, "Hersteller", "unbekannter Hersteller"), 352, 195 + 40 * ($lw3 / 2))
    ;GUICtrlSetState(-1,$Gui_DISABLE)
    $Titel[$lw2][$lw3] = GUICtrlCreateLabel(IniRead($inifile, "Element" & $lw3 + 1, "Name", "?") & " v" & IniRead($inifile, "Element" & $lw3 + 1, "Version", "1"), 352, Floor(211 + 40 * ($lw3 / 2)))
    ;GUICtrlSetState(-1,$Gui_DISABLE)
    EndIf
    ;...
    $lw3 = $lw3 + 1
    WEnd

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

    ;übriger Code für die einzelnen Kategorien
    ;Erhöhen der Laufvariablen, $lw1 zählt im Auslesearray, $lw2 zählt in den Zielarrays, beide zählen in den Kategorien hoch.
    $lw1 = $lw1 + 2
    $lw2 = $lw2 + 1
    WEnd
    GUICtrlCreateTabItem("")
    ;EndFunc
    ;_InitializeGui()
    GUISetState(@SW_SHOW)

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

    $iAktTab = 0
    ConsoleWrite("Anzahl Elemente : " & $AnzElemente & @CRLF)
    $AnzElemente = 11 ;ist seltsamerweise nicht gesetzt

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $PageControl1
    $iAktTab = _GUICtrlTab_GetCurSel($PageControl1)
    Case $Checkboxen[$iAktTab][0] To $Titel[$iAktTab][$AnzElemente - 1]
    ConsoleWrite("Ksg-ID: " & $nMsg & @TAB)
    if mod($nMsg - $Checkboxen[$iAktTab][0],4) Then
    $iAktCheckBox = -1 ;es kann keine Checkbox sein
    else
    $iAktCheckBox = ($nMsg - $Checkboxen[$iAktTab][0]) /4
    EndIf
    ConsoleWrite("Checkbox: " & $iAktCheckBox & @TAB)
    if mod($nMsg - $Icons[$iAktTab][0],4) Then
    $iAktIcon = -1 ;es kann kein Icon sein
    else
    $iAktIcon = ($nMsg - $Icons[$iAktTab][0]) /4
    EndIf
    ConsoleWrite("Icon: " & $iAktIcon & @TAB)
    if mod($nMsg - $Hersteller[$iAktTab][0],4) Then
    $iAktHersteller = -1 ;es kann kein Hersteller sein
    else
    $iAktHersteller = ($nMsg - $Hersteller[$iAktTab][0]) /4
    EndIf
    ConsoleWrite("Hersteller: " & $iAktHersteller & @TAB)
    if mod($nMsg - $Titel[$iAktTab][0],4) Then
    $iAktTitel = -1 ;es kann kein Titel sein
    else
    $iAktTitel = ($nMsg - $Titel[$iAktTab][0]) /4
    EndIf
    ConsoleWrite("Titel: " & $iAktTitel & @CRLF)
    EndSwitch
    WEnd

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

    teste es einfach einmal und du wirst sehen dass immer die richtige Zahl in der Console für das Element ausgegeben wird.

    mfg autoBert