Label nachträglich dynamisch hinzufügen

  • Hey,
    was ich vorhabe wird aus dem Quelltext wohl deutlich, die GUI wird bereits ganz am Anfang des Scripts definiert und später sollen Labels hinzugefügt werden (später auch jedes mit seiner eigener OnClick Funktion), allerdings gibt mir der Quelltext kein Label in der GUI aus, auch ohne den ganzen Array-Quatsch & Co., also bei einer einfachen "GUICtrlCreateLabel" Aufgabe. Ist es somit nicht möglich so etwas nachträglich hinzuzufügen? (Ich möchte keine "leeren Labels" zu Beginn erstellen und diese dann später mit Text füllen, es müssen schon neue sein)

    [autoit]

    Func form_plaeneOpened()
    GUISwitch($form_plaene)
    $AktiveFiliale = "Eppendorfer Baum"
    $AktiveMitarbeiter = _ArrayFindAll($mitarbeiterdaten_filiale, $AktiveFiliale)
    ;_ArrayDisplay($mitarbeiterdaten_filiale, "$avArray")
    ;_ArrayDisplay($AktiveMitarbeiter, UBound($AktiveMitarbeiter) -1)
    Global $AktiveMitarbeiter_labels[UBound($AktiveMitarbeiter)]
    ;_ArrayDisplay($AktiveMitarbeiter_labels, UBound($AktiveMitarbeiter) -1)
    GUISetState(@SW_HIDE)
    For $i = 0 To (UBound($AktiveMitarbeiter) -1) Step 1
    $AktiveMitarbeiter_labels[$i] = GUICtrlCreateLabel($mitarbeiterdaten_nachname[$AktiveMitarbeiter[$i]],100,100*($i+1),100,100)
    Next
    ;GUICtrlCreateLabel("test",100,500,100,100)
    GUISetState(@SW_SHOW, $form_plaene)
    EndFunc

    [/autoit]

    Danke!

    • Offizieller Beitrag

    Mein Lieblings-Bsp. dafür:

    [autoit]

    Global $GUI, $aInput[2] = [1], $btAdd

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

    $GUI = GUICreate('Test', 400, 50)
    $aInput[1] = GUICtrlCreateInput('', 10, 10, 300, 21)
    GUICtrlSetResizing(-1, 802) ; $GUI_DOCKALL
    $btAdd = GUICtrlCreateButton('Add Input', 320, 10, 70, 21)
    GUICtrlSetResizing(-1, 802) ; $GUI_DOCKALL
    GUISetState()

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

    While 1
    Switch GUIGetMsg()
    Case -3
    Exit
    Case $btAdd
    _NewCtrl()
    EndSwitch
    WEnd

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

    Func _NewCtrl()
    Local $iDiff = 31 ; == Abstand + Höhe ==> 10 + 21
    Local Static $iY = 10 ; == Startwert vom ersten Ctrl
    $iY += $iDiff
    $aInput[0] += 1
    ReDim $aInput[$aInput[0]+1]
    Local $aWin = WinGetPos($GUI)
    WinMove($GUI, '', $aWin[0], $aWin[1], $aWin[2], $aWin[3] + 31)
    $aInput[$aInput[0]] = GUICtrlCreateInput('', 10, $iY, 300, 21)
    GUICtrlSetResizing(-1, 802) ; $GUI_DOCKALL
    EndFunc

    [/autoit]

    Kannst du mit jedem Ctrl machen.

  • Danke, das klappt wunderbar so!

    Was ist wohl die beste Methode einen Rechtsklick auf ein Label zu registrieren und auch zu wissen auf welches? Per Cursorposition auslesen bei Rechtsklick und mit den Labelpositionen vergleichen oder für jedes Label eine OnClick Funktion erzeugen?

  • Was ist wohl die beste Methode einen Rechtsklick auf ein Label zu registrieren und auch zu wissen auf welches? Per Cursorposition auslesen bei Rechtsklick und mit den Labelpositionen vergleichen oder für jedes Label eine OnClick Funktion erzeugen?

    Moin!
    Wenn ich mich mal einmischen darf... :rolleyes:

    Ich würds so machen:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>

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

    $hGui = GUICreate("LabelRightClick", 400, 400)
    ;==> Für Event Modus diese beiden Zeilen aktivieren (und Do/Until Schleife ändern)
    ;~ Opt("GUIOnEventMode", 1)
    ;~ GUISetOnEvent($GUI_EVENT_SECONDARYDOWN, "_RightClick")

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

    $idLabel1 = GUICtrlCreateLabel("Rechts mich!", 20, 20, 170, 360, BitOR($SS_CENTER, $SS_CENTERIMAGE))
    GUICtrlSetFont(-1, 12, 800)
    GUICtrlSetBkColor(-1, 0x00FF00)

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

    $idLabel2 = GUICtrlCreateLabel("Mich auch!", 210, 20, 170, 360, BitOR($SS_CENTER, $SS_CENTERIMAGE))
    GUICtrlSetFont(-1, 12, 800)
    GUICtrlSetBkColor(-1, 0xFF0000)

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

    GUISetState()

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

    Do
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_SECONDARYDOWN
    _RightClick()
    EndSwitch
    Until $nMsg = -3

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

    Func _RightClick()
    $aMouse = GUIGetCursorInfo($hGui)
    If IsArray($aMouse) Then ;==> nur zur Sicherheit; mache ich bei allen Arrays
    Switch $aMouse[4]
    Case $idLabel1
    MsgBox(0, "", "Rechts auf Links!", 0, $hGui)
    Case $idLabel2
    MsgBox(0, "", "Rechts auf Rechts!", 0, $hGui)
    EndSwitch
    EndIf
    EndFunc

    [/autoit]


    Sanfte Grüße :D

    • Offizieller Beitrag

    Du brauchst nicht extra GuiGetCursorInfo() aufrufen. Verwende einfach den erweiterten Modus

    [autoit]

    $aMsg = GuiGetMsg(1)

    [/autoit]

    Dann erhältst du ein Array mit

    Zitat von AutoIt-Hilfe

    - $array[0] = 0 oder Ereignis-ID oder Control-ID
    - $array[2] = Der Control-Handle des Controls, von dem das Ereignis gemeldet wird (gegebenenfalls)


    Und somit hast du bereits die Info über das Control, von dem die Msg kam. Spart dir einen Funktionsaufruf.
    Im OnEvent-Mode sollten dir die Event-Makros helfen.

  • Hi,

    in einer OnEvent-Umgebung könnte man @GUI_CtrlId als Index des Contol-Array´s nutzen.
    Rechtsklicks, Linksklicks und Doppelklicks fange ich bei vielen Controls in etwa so ab:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>

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

    $hGui = GUICreate("LabelClick", 400, 400)

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

    Opt("GUIOnEventMode", 1)
    GUISetOnEvent($GUI_EVENT_SECONDARYDOWN, "_ClickEvent");rechte Maustaste
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "_ClickEvent");linke maustaste
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit") ;Fenster schließen

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

    Global $iTimer = TimerInit() ;für doppelklick
    Global $iDoubleClickSpeed = RegRead('HKCU\Control Panel\Mouse', 'DoubleClickSpeed');thx Oscar http://www.autoit.de/index.php?page…5316#post355316

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

    Dim $idlabel[100]
    For $i = 0 To 99
    $idLabel[$i] = GUICtrlCreateLabel(Chr($i + 35), Mod($i, 10) * 30 + 10, Int($i / 10) * 30 + 10, 20, 20)
    GUICtrlSetBkColor(-1, Random(0xF0f0F0, 0xFFFFFF, 1))
    Next

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

    GUISetState()

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

    While Sleep(100)
    WEnd

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

    Func _ClickEvent() ;Mausklicksklick abfangen
    $Taste = ""
    $pos = GUIGetCursorInfo($hGui)
    Switch @GUI_CtrlId
    Case $GUI_EVENT_PRIMARYDOWN ;linksklick
    If TimerDiff($iTimer) < $iDoubleClickSpeed Then
    $Taste = "!Doppelklick"
    $doubleclickflag = 0
    Else
    $Taste = "Linksklick"
    $doubleclickflag = 1
    EndIf
    $iTimer = TimerInit()

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

    Case $GUI_EVENT_SECONDARYDOWN ;rechtsklick
    $Taste = "Rechtsklick"
    EndSwitch

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

    ConsoleWrite($Taste & @CRLF & "Label Nummer=" & $pos[4] & @CRLF & "Inhalt=" & GUICtrlRead($pos[4]) & @CRLF)
    EndFunc ;==>_ClickEvent

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

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

    [/autoit]