Button in Funktion abfragen?

  • Hi,

    in einer Funktion kann man einen Such-Button drücken.
    Wie kann ich nun feststellen, ob der Button gedrückt wurde, mit Globalen Variablen möchte ich an der Stelle nicht arbeiten.

    Beispiel

    Code
    ;TAB für Gruppen
    Func _GruppenTab()
    	Local $btn_searchgroup
    	Local $input_searchgrup
    	GUICtrlCreateLabel("Gruppe:",10,40)
    	$input_searchgrup = GuiCtrlCreateInput("", 100, 40, 140, 20)
    	$btn_searchgroup = GUICtrlCreateButton("Suchen", 270, 40, 60, 20)	
    EndFunc

    Grüße
    Guido

  • Willkommen im Forum ;)

    im Guioneventmode-Modus ganz einfach mit dem befehl

    [autoit]

    GUICtrlSetOnEvent($btn_searchgroup, "_MeineFunction")

    [/autoit]

    mit Guigetmsg:

    [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $btn_searchgroup
    MsgBox(0,' ','Button wurde gedrückt')
    EndSwitch
    WEnd

    [/autoit]
  • Hallo Schnitzel,

    Danke fürs Willkommen und für den schnellen Hinweis. :P

    Bei "GUICtrlSetOnEvent" kann ich leider der Funktion keine Parameter mitgeben, dadurch hätte ich keine allgemein gültigen Funktionen mehr.

    Ich mache daher mit Guigetmsg weiter und setze dann Globale Variablen für die Button ein.

    Grüße
    Guido

  • Ich muss den Thread noch einmal aufwärmen.

    Wenn ich unter Gruppen den Button abschicke, landet mein Returnwert auch wieder in der Funktion "_Gruppen_Fenster()".
    Komischerweise wird mir der Returnwert korrekt in der Msgbox angezeigt, aber nicht im Label.
    Was kann dafür die Ursache sein?

    Der angefügte Quellcode ist nun der komplette Quellcode aus dem Thread Fenster leeren

    Vielen Dank für Eure schnelle Hilfe.

    Spoiler anzeigen


    ;AD-Funktionen
    ;16.09.09
    ;Autor: Guido

    ;Arrays
    #include <Array.au3>
    ;Konstanten und Variablen für die GUI
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

    ;AD-Variablen
    Global $objConnection = ObjCreate("ADODB.Connection") ; Create COM object to AD
    $objConnection.ConnectionString = "Provider=ADsDSOObject"
    $objConnection.Open ("Active Directory Provider") ; Open connection to AD
    Global $objRootDSE = ObjGet("LDAP://RootDSE")
    Global $strDomaine = $objRootDSE.Get ("defaultNamingContext") ; Aktuelle Domäne ermitteln
    Global $strLogonServer = $objRootDSE.Get ("dnsHostName") ; Logon-Server ermitteln

    ;Fenster-Variablen
    Global $hmainGui, $hguiDC, $hguiGroup

    ;Gruppen-Variablen
    Global $input_searchgroup, $btn_searchgroup

    ;Allgemeine-Variablen
    Global $returnwert

    ;Fenster erstellen
    $hmainGui = GUICreate("AD-Funktionen", 600, 580)
    GUISetBkColor("0xFFFFCA")
    GUISetFont(9, 400, 0, "Arial")

    ;Menübar anzeigen
    $menu_dc = GUICtrlCreateMenu("&DC", -1, 1)
    $item_dc_dcs = GUICtrlCreateMenuItem("DC´s", $menu_dc)

    $menu_help = GUICtrlCreateMenu("?", -1, 1)
    $item_help_auto = GUICtrlCreateMenuItem("Autor", $menu_help)
    $item_help_exit = GUICtrlCreateMenuItem("Beenden", $menu_help)

    $menu_group = GUICtrlCreateMenu("&Gruppen", -1, 1)
    $item_group_search = GUICtrlCreateMenuItem("Mitgliedschaft", $menu_group)
    GUISetState()

    ;Hilfsgui für DC's
    _hguiDC()
    func _hguiDC()
    Local $DC, $DCs
    $hguiDC = GUICreate("", 600, 556, 0, 0, BitOR($WS_CHILD, $WS_TABSTOP), -1, $hmainGui)
    GUISetBkColor("0xFFFFCA")
    GUICtrlCreateLabel("Domäne:", 10, 40)
    GUICtrlCreateLabel($strDomaine, 100, 40)
    GUICtrlCreateLabel("Logon-Server:", 10, 70)
    GUICtrlCreateLabel($strLogonServer, 100, 70)
    $DCs = _ADDCList()
    For $i = 1 To UBound($DCs, 1) - 1
    $DC = $DC & $DCs[$i] & @CRLF
    Next
    GUICtrlCreateLabel("Domänen-Controller", 10, 140, 140, 20)
    GUICtrlSetFont(-1, 10, 800)
    GUICtrlCreateLabel($DC, 10, 170, 270, 380)
    GUICtrlSetBkColor(-1, 0xffffff)
    GUISetState(@SW_HIDE)
    EndFunc ;-->_hguiDC

    ;Hilfsgui für Gruppen
    _hguiGruppen()
    func _hguiGruppen()
    $hguiGroup = GUICreate("", 600, 556, 0, 0, BitOR($WS_CHILD, $WS_TABSTOP), -1, $hmainGui)
    GUISetBkColor("0xFFFFCA")
    _Gruppen_Fenster()
    GUISetState(@SW_HIDE)
    EndFunc ;--> _hguiGruppen

    func _Gruppen_Fenster()
    Local $wert
    GUICtrlCreateLabel("Gruppe:", 10, 40)
    $input_searchgroup = GUICtrlCreateInput("", 100, 40, 140, 20)
    GUICtrlSetState(-1, $GUI_FOCUS)
    $btn_searchgroup = GUICtrlCreateButton("Suchen", 270, 40, 60, 20)
    GUICtrlCreateLabel("LDAP:", 10, 70)
    $wert = $returnwert
    GUICtrlCreateLabel($wert, 100, 70)
    MsgBox(4096,"",$wert)
    EndFunc

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE Or $msg = $item_help_exit
    GUIDelete()
    Exit
    Case $msg = $item_dc_dcs
    GUISetState(@SW_SHOW, $hguiDC)
    GUISetState(@SW_HIDE, $hguiGroup)
    Case $msg = $item_group_search
    GUISetState(@SW_SHOW, $hguiGroup)
    GUISetState(@SW_HIDE, $hguiDC)
    case $msg = $btn_searchgroup
    $returnwert = _SearchGroupLDAP(GUICtrlRead($input_searchgroup))
    _Gruppen_Fenster()
    EndSelect
    WEnd

    ;----------------------------- Funktionen - DC Menü ----------------------------------------
    ;DC´s auflisten
    Func _ADDCList()
    $objCommand = ObjCreate("ADODB.Command")
    $objCommand.ActiveConnection = $objConnection
    $objCommand.Properties ("Page Size") = 1000
    $objCommand.Properties ("Searchscope") = 2
    $objCommand.Properties("Sort On") = "name"
    $objCommand.CommandText = "<" & "LDAP://" & $strLogonServer & "/OU=Domain Controllers," & $strDomaine & ">;(&(objectCategory=computer)" & "(cn=*));" & "distinguishedName,name;subtree"
    $objRecordSet = $objCommand.Execute
    Dim $DCList[$objRecordSet.RecordCount + 1]
    $objRecordSet.MoveFirst
    Do
    $DCList[0] += 1
    $DCList[$DCList[0]] = $objRecordset.Fields("name").value
    $objRecordSet.MoveNext
    Until $objRecordSet.EOF
    $objCommand = 0
    $objRecordSet = 0
    Return $DCList
    EndFunc

    ;----------------------------- Funktionen - Gruppen Menü ----------------------------------------
    ;Gruppe suchen
    Func _SearchGroupLDAP($gruppe)
    Local $gldap
    $objCommand = ObjCreate("ADODB.Command")
    $objCommand.ActiveConnection = $objConnection
    $objCommand.Properties ("Page Size") = 1000
    $objCommand.Properties ("Searchscope") = 2
    $objCommand.CommandText = "Select distinguishedName, name FROM 'LDAP://" & $strDomaine & "' WHERE objectclass='group'"

    $objRecordSet = $objCommand.Execute
    $objRecordSet.MoveFirst
    Do
    if (StringUpper($gruppe) == $objRecordset.Fields("name").value) Then
    $gldap = $objRecordset.Fields("distinguishedName").value
    ExitLoop
    endIf
    $objRecordSet.MoveNext
    Until $objRecordSet.EOF
    $objCommand = 0
    $objRecordSet = 0
    Return $gldap
    EndFunc

  • Hallo ThinkCross,

    diese Änderungen müssten eigenlich reichen:

    [autoit]

    ;Gruppen-Variablen
    Global $input_searchgroup, $btn_searchgroup, $lLDapWert

    [/autoit][autoit]

    Func _Gruppen_Fenster() ;nur die Controls erzeugen
    Local $wert
    GUICtrlCreateLabel("Gruppe:", 10, 40)
    $input_searchgroup = GUICtrlCreateInput("", 100, 40, 140, 20)
    GUICtrlSetState(-1, $GUI_FOCUS)
    $btn_searchgroup = GUICtrlCreateButton("Suchen", 270, 40, 60, 20)
    GUICtrlCreateLabel("LDAP:", 10, 70)
    ;$wert = $returnwert
    $lLDapWert = GUICtrlCreateLabel($wert, 100, 70)
    MsgBox(4096, "", $wert)
    EndFunc ;==>_Gruppen_Fenster

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

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE Or $msg = $item_help_exit
    GuiDelete($hguiGroup)
    GUIDelete($hguiDC)
    GUIDelete($hmainGui)
    Exit
    Case $msg = $item_dc_dcs
    GUISetState(@SW_SHOW, $hguiDC)
    GUISetState(@SW_HIDE, $hguiGroup)
    Case $msg = $item_group_search
    GUISetState(@SW_SHOW, $hguiGroup)
    GUISetState(@SW_HIDE, $hguiDC)
    Case $msg = $btn_searchgroup
    $returnwert = _SearchGroupLDAP(GUICtrlRead($input_searchgroup))
    GUICtrlSetData($lLDapWert,$returnwert) ;hier wird der Wert in das Control geschrieben
    ;_Gruppen_Fenster() <=============== unnötig da die Controls bereits erstellt
    EndSelect
    WEnd

    [/autoit]

    üblicherweise werden in AutoIt alle GUIs (auch Hilfs-GUIs) am Anfang mit den benötigten Controls erstellt. Die GUIs kannst du mit GUISetState z.B

    [autoit]

    GUISetState(@SW_SHOW, $hguiDC)

    [/autoit]

    anzeigen bzw.

    [autoit]

    GUISetState(@SW_HIDE, $hguiDC)

    [/autoit]

    ausblenden.
    Für Controls verwendest du falls es einmal nötig sein sollte GUICtrlSetState, aber Achtung hier ist die Reihenfolge genau umgedreht.
    Um Werte aus einem Control zu lesen, nimmt man am einfachsten GuiCtrlRead zum Schreiben GuiCtrlSetData.
    Es gibt aber auch Spezialfälle, wo man die UDFs benutzen muss. Für Controls aus denen du lesen bzw. in die du schreiben musst, musst du die ID des Controls in einer (meist global) Variablen abspeichern.
    Wenn du eine Funktion in der Controls erstellt werden, immer wieder aufrufst, werden immer wieder neue Controls an der alten Position erstellt.
    Falls du in einer Hilfs-GUI zusätzliche Controls erstellen musst, solltest du vorher GUISwitch benutzen, damit auch die richtige GUI angesprochen wird.

    Ich kann dein Projekt leider nicht testen, da ich weder einen Domänen- noch einen LDap-Server habe (sitze an einem Netbook StandAlone)

    mfg (Auto)Bert

  • Hallo Bert,

    Danke für die Hinweise, ja funktioniert so.
    Deswegen habe ich die eigentlichen Funktionen, die sozusagen nur in dem Fenster ablaufen auch ausgelagert, damit die Hilfsgui nicht jedesmal neu aufgerufen wird.

    Bei vielen Sachen ist die Hilfe von Autoit leider sehr dürftig.

    Grüße
    Guido