Einige kleinere(!?) Fragen

  • Endlich paar Tage frei und etwas mehr Zeit mich mit AutoIT zu beschäftigen. Ich habe da einige Ideen im Kopf um meine kleinen Programme funktionell etwas aufzuwerten, leider konnte ich bisher aber keine Hinweise auf Lösungen finden.

    Und zwar hatte ich vor ein Programm in mehrere Gruppen zu spalten und ich hoffe folgendes Beispiel hilft beim Verständnis. Das Programm kann mir insgesamt 4 Werte anzeigen, ich möchte jedoch die Möglichkeit einbauen mit Hilfe von Checkboxen bestimmen zu können, welche tatsächlich im GUI angezeigt werden. Damit will ich erreichen, das ich mir die Anzeige auf die momentane Anforderung anpassen kann und so auch Platz spare, weil nur das Notwendige angezeigt wird.

    Weiter habe ich das Problem, das ich nach einem String, der von 0 bis verdammt lang sein kann, einen weiteren anzeigen will, dieser aber durch " / " vom ersten getrennt sein soll. Nun dachte ich mir, ich kann mit StringLen() die Länge bestimmen und dann den Slash mit GUICtrlCreateLabel(" / ", $len, top) irgendwie in der Art setzten kann. Nun offensichtlich geht das nicht. Ich könnte das zwar auch mit GUICtrlSetData($control, $var1 & " / " & $var2) lösen, aber beim aktualisieren flackert dann die Anzeige.


    Über Hilfe bin ich wie immer sehr dankbar. Mfg Bill

    • Offizieller Beitrag

    Das erste Problem kann man mit GUICtrlSetState($Control-ID, $GUI_HIDE bzw. $GUI_SHOW) lösen.

    Das zweite Problem würde ich mittels ControlGetPos() und zwei Label angehen:

    [autoit]


    #include <GUIConstants.au3>

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

    GUICreate('Test')

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

    $text1 = 'gaaaaaaaaaaanz laaaaaaanger Text'
    $label1=GUICtrlCreateLabel($text1, 10, 20)
    $pos = ControlGetPos('Test','',$label1)
    $text2 = '/2. Text'
    $label2=GUICtrlCreateLabel($text2, $pos[2], 20)

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

    GUISetState ()

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

    While 1
    $msg = GUIGetMsg()
    if $msg = $GUI_EVENT_CLOSE then Exit
    Wend

    [/autoit]
  • Also irgendwie mag das beides nicht so recht klappen, wobei ich mir beim Lösungsvorschlag zum ersten Punkt schon so garnichts richtig vorstellen kann. Gibt es dazu vielleicht ein Beispiel damit ich das mal vor mir sehen?


    Danke und Mfg Bill

  • Ich glaube, die Frage ist auch, wie man auslesen kann, ob eine Checkbox geklickt ist, oder nicht.

    [autoit]


    #include<Guiconstants.au3>

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

    GUICreate("",300,120)
    $box1=GUICtrlCreateCheckbox("Box1",20,25)
    $box2=GUICtrlCreateCheckbox("Box2",20,45)
    Guisetstate()

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

    $label1=GUICtrlCreateLabel("geklickt",80,25,200,20)
    $label2=GUICtrlCreateLabel("",80,45,200,20)

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

    While 1
    sleep(200)

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

    IF guictrlread($box1)=1 Then; wenn angeklickt
    GUICtrlSetState($label1,$GUI_SHOW)
    Else; Wert wäre 4
    GUICtrlSetState($label1,$GUI_HIDE)
    EndIf

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

    IF guictrlread($box2)=1 Then; wenn angeklickt
    GUICtrlSetData($label2,"geklickt")
    Else
    GUICtrlSetData($label2,"nicht geklickt")
    EndIf

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

    WEnd

    [/autoit]

    Vielleicht gibt es auch eine ardere und bessere Methode, als die, die ich gewählt habe. Für die Label habe ich zwei verschiedene Versionen geschrieben.

  • Also das mit dem Ausblenden von einzelnen Controls habe ich nun verstanden und das prüfen der Checkboxen werde ich vermutlich auch hinbekommen. Praktischer wäre es allerdings, wenn es eine Möglichkeit gäbe das Programm mehr Modular aufzubauen, etwa wie folgt.

    --- Kategorie1---
    * Wert1
    * Wert2
    --- Kategorie2---
    * Wert1
    * Wert2
    --- Kategorie3---
    * Wert1
    * Wert2

    Und wenn man nun über die Checkboxen die einzelnen Module/Kategorien in einem GUI anzeigen lassen kann, wäre das (fast) perfekt. Eine weitere Frage die ich mir in diesem Zusammenhang stelle ist, ob man die Größe des GUI an die Ausgabe anpassen kann. Also das wenn nur 2 Module/Kategorien angezeigt werden, das Fenster auch kleiner ist als bei allen 3.

    Zu meinem zweiten Problem im Eingangspost, hat dazu noch jemand eine andere Idee außer das mit ControlGetPos() anzugehen?


    Danke und Mfg Bill

  • Wenn man auf die Box klixkt, goibt es auch eine GUI-Msg:

    Spoiler anzeigen
    [autoit]

    #include<Guiconstants.au3>

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

    GUICreate("",300,120)
    $box1=GUICtrlCreateCheckbox("Box1",20,25)
    $box2=GUICtrlCreateCheckbox("Box2",20,45)
    Guisetstate()

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

    $label1=GUICtrlCreateLabel("geklickt",80,25,200,20)
    GUICtrlSetState($label1,$GUI_HIDE)
    $label2=GUICtrlCreateLabel("",80,45,200,20)

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

    #region - GUI SelectLoop
    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    Case $msg = $box1
    IF BitAND(guictrlread($box1),$gui_checked) Then; wenn angeklickt
    GUICtrlSetState($label1,$GUI_SHOW)
    Else; Wert wäre 4
    GUICtrlSetState($label1,$GUI_HIDE)
    EndIf
    Case $msg = $box2
    IF BitAND(guictrlread($box2),$gui_checked) Then; wenn angeklickt
    GUICtrlSetData($label2,"geklickt")
    Else
    GUICtrlSetData($label2,"nicht geklickt")
    EndIf
    EndSelect
    WEnd
    #endregion

    [/autoit]

    ZUm 2. Problem: Gute Frage :)

  • Vom Ablauf her, werde ich ja wahrscheinlich so vorgehen müssen, die einzelnen Programmteile mit IF Bedingung verpacken und je nach Checkbox den Teil dann abarbeite oder eben nicht, oder? Aber wie kann ich das bewerkstelligen, das das GUI je nachdem wieviel ich ausgewählt habe auch von der Größe her passt?

    So viele Ideen und so wenig Ahnung, verdammt :D . Spaß macht es trotzdem und dank dieser klasse Community geht es auch Schritt für Schritt vorwärts. Danke nochmal an dieser Stelle :thumbup: . Mfg Bill

    • Offizieller Beitrag

    Aber wie kann ich das bewerkstelligen, das das GUI je nachdem wieviel ich ausgewählt habe auch von der Größe her passt?

    2 Möglichkeiten
    - für GUI und alle Controls die Positionen mit Variablen angeben und in Abhängigkeit der Auswahl verschieben (sehr aufwändig, da z.B. bei 4 Gruppen bereits 15 verschieden Anzeigemöglichkeiten existieren)
    - für jede Gruppe ein Child-Window erstellen und dann diese(s) in Abhängigkeit der Auswahl positionieren

  • Die Idee mit dem Child Window gefällt mir schon ziemlich gut und ich habe auch ein sehr gutes Beispiel von dir gefunden BugFix. Jetzt frage ich mich nur, ob es auch möglich ist das Child Window nicht direkt in das Parent einzubetten, sondern anzuheften. Also das es beim ziehen des Parent mitgenommen wird, dieses aber nicht so enorm riesig sein muss um alle Childs hinein zu bekommen. Ich habe schon rumprobiert, aber ohne Erfolg, aber vielleicht habt ihr noch eine Idee.


    Mfg Bill

  • Das geht über WinMove und GUIRegisterMsg. Im Bsp. lassen sich die "Child"-Windows frei verschieben, werden aber mit dem MAIN-Window mitverschoben.

    Spoiler anzeigen
    [autoit]

    ;===============================================================================
    ;
    ; Description: Fenster mit Haupt-Fenster mitverschieben
    ; Author(s): Prog@ndy
    ;
    ;===============================================================================
    ;
    #include <GUIConstants.au3>
    Global $posold[2]
    Global Const $WM_ENTERSIZEMOVE = 0x0231

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

    #region - GUI Create
    $guiMAIN = GUICreate('Main',300,400,240,220)
    GUISetState()
    GUIRegisterMsg($WM_MOVE,"WM_MOVE")
    GUIRegisterMsg($WM_ENTERSIZEMOVE,"WM_ENTERSIZEMOVE")
    #endregion

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

    #region - GUI Create
    $gui1 = GUICreate('1',100,200,100,200)
    GUISetState()
    #endregion

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

    #region - GUI Create
    $gui2 = GUICreate('2',200,400,500,300)
    GUISetState()
    #endregion

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

    #region - GUI SelectLoop
    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    EndSelect
    WEnd
    #endregion

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

    Func WM_MOVE($hWnd, $Msg, $wParam, $lParam)
    If $hWnd = $guiMAIN Then
    Local $posmain = WinGetPos($guiMAIN)
    Local $pos1 = WinGetPos($gui1)
    Local $pos2 = WinGetPos($gui2)
    WinMove($gui1,"",$pos1[0] - ($posold[0]-$posmain[0]) ,$pos1[1] - ($posold[1]-$posmain[1]))
    WinMove($gui2,"",$pos2[0] - ($posold[0]-$posmain[0]) ,$pos2[1] - ($posold[1]-$posmain[1]))
    $posold = WinGetPos($guiMAIN)
    EndIf
    EndFunc
    Func WM_ENTERSIZEMOVE($hWnd, $Msg, $wParam, $lParam)
    If $hWnd = $guiMAIN Then
    $posold = WinGetPos($guiMAIN)
    EndIf
    EndFunc

    [/autoit]