Label in vorhandene GUI einfügen

  • Hallo miteinander,

    Nachdem ich jetzt einige zeit mit verschiedenen suchbegriffen hier rumgesucht habe, werde ich jetzt leider doch mal den Rat von euch Profis erbitten müssen...

    Vorhaben:
    Ich habe ein Skript programmiert, das bei der Windows Installation nach der Vorkonfiguration diverse Standardprogramme installiert. Ich habe auch ein GUI mit Koda erstellt. Dieses GUI soll während der gesamten Ausführung des Installationsskript am linken Bildschirmrand sein. Und jedesmal wenn die Installation eines Programmes abgeschlossen ist, soll dessen Name in eben jener GUI (namens 'Bereits installiert') hinzugefügt werden.

    Das Problem:
    Da ich absoluter Anfänger in Sachen GUI bin, habe ich absolut keine Ahnung wie man einer existierenden GUI ein neues Label hinzufügt. Ich dachte dass es so geht:

    [autoit]

    $Label1 = GUICtrlCreateLabel(StringTrimLeft($Datei, StringInStr($Datei, '\', 1, -1)), 2, 2, 190, 15)

    [/autoit]


    ($Datei ist der Dateiname der installationsdatei mit Pfad)

    Ich weiß nicht ob so etwas überhaupt möglich ist (einem bestehenden GUI nachträglich etwas hinzuzufügen). ?( Falls nicht, würde es mir auch reichen, wenn mir jemand erklären könnte wie ich es bewerkstellige, dass ich bei einem vorhandenen Element einer GUI den "Visible"-Status von FALSE auf TRUE setze.

    Allgemein wäre ich auch dankbar für einen Link zu einer Art AutoIt-GUI-Tutorial oder so.

    Vielen Dank für die Gehirnzellenaktivitäten schonmal im Voraus. :)

    Einmal editiert, zuletzt von mikel (7. Mai 2009 um 13:45)

  • Hallo mikel,

    nachdem Du kein Script bereit stellst, muß ich mal einen Schuß ins blaue wagen ...
    Ich würde in die Dui ein einziges Label am Anfang integrieren, dass dann jeweils nach erfolgreicher Installation lediglich "aktualisiert" wird.
    z.B.:

    [autoit]

    GuiCtrlSetData($Label,GuiCtrlRead($Label)&$Datei & @CRLF)

    [/autoit]


    Das @CRLF würde ich ans Ende stellen, damit nicht als erste Zeile ein CR eingefügt wird...

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Hmm... du kannst vorher ein / mehrere Labels erstellen und mit GUICtrlSetState($label1, $GUI_HIDE) ersteinmal verstecken. Nachher kannst du sie mit GuiCtrlSetState($label1,$GUI_SHOW) anzeigen lassen, wenn eine installation erfolgt ist.

    Oder du machst es so, wie du schon sagtest. Du erstellst das Label nachträglich in der Funktion wo das Setup abgeschlossen wurde am ende. Aber nicht vergessen die Variable dann vorher zu Deklarieren.

    Edit: Oh, ja, ganz vergessen, dass man auch in Labels in mehrere Zeilen schreiben kann. Dann ist das mit mehreren Labeln Schwachsinn. Und Späteres einfügen auch.
    Dann einfach wie Schnuffel schon geschrieben hat, am Anfang ein leeres Label erstellen und dieses mit GuiCtrlSetData jedesmal aktualisieren.

  • Hi, also danke erstmal für die schnellen Reaktionen. Ich habe das jetzt mal probiert und an mein Skript angepasst, folgendes ist der gesamte Code:

    [autoit]


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

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

    $Datei = @ScriptDir & "\Spiele\Gbrainy 0.70.exe"

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

    $DateiName = MsgBox(0,"", StringTrimLeft($Datei, StringInStr($Datei, '\', 1, -1)))

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Installationsverlauf", 201, 601, 1, 1)
    GUISetIcon("")
    GUISetFont(7, 400, 0, "MS Sans Serif")
    GUISetBkColor(0xFFFFFF)
    $Label = GUICtrlCreateLabel(StringTrimLeft($Datei, StringInStr($Datei, '\', 1, -1)) & @CRLF, 2, 2, 190, 105)
    GUICtrlSetFont(-1, 6, 400, 0, "MS Sans Serif")
    GUICtrlSetBkColor(-1, 0xC0C0C0)
    GUISetState(@SW_SHOW)

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

    $Datei = @ScriptDir & "\Spiele\Jose.exe"
    $DateiName = MsgBox(0,"", StringTrimLeft($Datei, StringInStr($Datei, '\', 1, -1)))
    GuiCtrlSetData($Label,GuiCtrlRead($Label)&$DateiName & @CRLF)
    #EndRegion ### END Koda GUI section ###

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

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

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

    EndSwitch
    WEnd

    [/autoit]

    Allerdings wird bei diesem GuiCtrlSetData nur eine 1 ausgegeben statt des Dateinamens. Woran liegt das?

    Und liege ich richtig mit meiner Vermutung, dass sämtliche Befehle, die eine GUI betreffen, in dem Bereich zwischen #REGION## und #END REGION## stehen müssen?

  • Hallo.
    Also dein bisheriges Script muss man komplett überarbeiten. Ich erkläre dir mal die Teile, die nicht stimmen.
    1. Die Variable $DateiName kannst du nicht auf diese Weise deklarieren. In der Variable ist sonst der Wert, der von der MsgBox zurückgegeben wird. Ich würde dir empfehlen, einfach folgendes zu benutzen:

    [autoit]

    $Datei = @ScriptDir & "\Spiele\Gbrainy 0.70.exe"
    $DateiName = "Gbrainy 0.70.exe"

    [/autoit]


    2. Dein Label ist sehr umständlich gemacht. Wieso schreibst du nicht einfach den Dateinamen rein oder benutzt _PathSplit()?
    3. Soweit ich es verstanden habe, soll ja gewartet werden, bis ein Programm fertig installiert ist. Bei deinem Programm wartet er aber, bis man die MsgBox wegdrückt. Das ist umständlich und ich glaube nicht, dass das so geplant ist. Besser wäre es, wenn das Script wartet, bis der Prozess nicht mehr existiert. Das machst du folgendermaßen:

    [autoit]

    While 1
    If Not ProcessExists( "Prozess.exe" ) Then ExitLoop
    WEnd

    [/autoit]


    Voraussetzung ist, dass das Programm schon gestartet ist, wenn die Schleife anfängt. Ggf. das selbe Verfahren ohne das "Not" voranstellen. Dadurch wird überprüft, ob der Prozess gestartet wurde.
    Bis jetzt sind mir keine weiteren Fehler aufgefallen. Probiere es einfach aus. Ich kann es schlecht probieren, ich habe deine Dateien nicht...

  • Hallo mikel,

    den Namen einer Anwendung ermittle ich immer so:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    Local $drive,$dir,$Name,$ext
    Local $exe = "C:\Irgendwo\in einem UnterOrdner\dernameder.exe" ;(die ich in der .ini datei festgelegt habe)
    _PathSplit($exe, $drive,$dir,$Name,$ext)
    MsgBox(0,'So Klappts immer',$Name)

    [/autoit]

    Ich weiss aber dass es noch viele andere gangbare Lösungen gibt,

    mfg (Auto)Bert

  • Was ich nicht verstehe ist folgendes:
    Beim ersten mal wo etwas im Label geschrieben wird, schreibt AutoIt korrekt den Namen der Datei. Doch obwohl ich per Copy & paste gearbeitet habe, schreibt er (beim gleichen Befehl) beim zweiten mal eine "1" statt des Dateinamens.

    Wozu braucht man überhaupt diese Includes?
    Es gibt in meinem Skriptverzeichnis gar keine au3 dateien mit diesen namen...

    Die MsgBox habe ich ja nur gemacht, damit ich weiß, an welcher Stelle das Skript sich in der Ausführung befindet. Die Installation will ich natürlich nicht in diesem Teststadium durchführen, sonst würde ich ja bei jedem Testdurchlauf die Programme erneut installieren.

  • Hallo mikel,

    jetzt hab ich verstanden, machs doch so:

    Spoiler anzeigen
    [autoit]

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

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

    #Region ### START Koda GUI section ### Form=
    Local $Form1 = GUICreate("Installationsverlauf", 201, 601, 1, 1)
    GUISetIcon("")
    GUISetFont(7, 400, 0, "MS Sans Serif")
    GUISetBkColor(0xFFFFFF)
    Local $Label = GUICtrlCreateLabel('Fortschritt:' & @CRLF, 2, 2, 190, 105)
    GUICtrlSetFont(-1, 6, 400, 0, "MS Sans Serif")
    GUICtrlSetBkColor(-1, 0xC0C0C0)
    GUISetState(@SW_SHOW)
    Local $Datei = @ScriptDir & "\Spiele\Gbrainy 0.70.exe"
    Local $DateiName = StringTrimLeft($Datei, StringInStr($Datei, '\', 1, -1))
    #EndRegion ### END Koda GUI section ###
    Sleep(1000); <-------------------hier Installation von Gbrainy starten
    GuiCtrlSetData($Label,GuiCtrlRead($Label) & $DateiName & @CRLF)
    Sleep(1000); <-------------------hier eintragen wenn Gbrainy fertig

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

    $Datei = @ScriptDir & "\Spiele\Jose.exe"
    $DateiName = StringTrimLeft($Datei, StringInStr($Datei, '\', 1, -1))
    Sleep(1000); <-------------------hier Installation von Jose starten
    GuiCtrlSetData($Label,GuiCtrlRead($Label) & $DateiName & @CRLF)
    Sleep(1000); <-------------------hier eintragen wenn Jose fertig

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

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

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

    EndSwitch
    WEnd

    [/autoit]


    mfg (Auto)Bert

    • Offizieller Beitrag

    Die 1 anstatt deines Dateinamens schreibt er rein weil du den Rückgabewert der MsgBox der Variable $Datei zuordnest. Schau dir mal die Hilfe zu MSgBox an . OK Button drücken = Rückgabe 1. Die Includes findest du in deinem Autoit Verzeichnis, Unterverzeichnis Includes . Was Includes sind und für was sie gebraucht werden erfährst du auch in der Hilfe Stichwort #include .

  • Hey, ihr alle... vielen Dank für die Antworten. Vielen Dank vor allem an dich Bert. Das Skript funktioniert einwandfrei! ^^ :thumbup:

    Kannst du mir vielleicht noch erklären, warum man zum Anfang die Variablen $Datei und $DateiName als Lokale definieren muss und später nicht mehr?

    Und wozu ist überhaupt die WHILE Schleife da?
    Müssen alle Befehle bezüglich der GUI im Code VOR der Schleife stehen? Oder können sie auch dahinter stehen?

  • Hallo Mikel,

    da du in deinem Skript nicht mit

    Spoiler anzeigen
    [autoit]

    Opt('MustDeclareVars', 1)

    [/autoit]

    es zur Pflicht gemacht hast, dass Variablen vor dem ersten benutzen deklariert werden müssen, wäre es eigentlich auch beim ersten mal unnötig. Da ich in eigenen Skripten diese Option aber eigentlich immer setze ist es schon eine Art Automatismus, dass ich sie spätestens beim ersten Gebrauch deklariere. Hier der Grund warum ich die Option setze:

    Zitat

    Auszug aus dt. Hilfe:MustDeclareVars Wenn diese Option genutzt wird müssen alle Variablen deklariert werden mit Dim, Local oder Global bevor sie verwendet werden können - beseitigt die Möglichkeit von Bugs durch Schreibfehler in Variablen.
    1 = Variable muss deklariert werden
    0 = Variable muss nicht deklariert werden (Standard)

    Wenn eine Variable einmal deklariert ist, kannst du ihr immer wieder neue Werte zuweisen. Schön das dir das Skript gefällt, zu Fragen von Installationsroutinen, lies am besten das Tutorial - WinZip in der dt. Hilfe, ich selbst hab es aber auch noch nicht durchgearbeitet,

    Edit1: Wenn du die While-Schleife entfernst, beendet sich das Skript automatisch, wenn das letzte Programm installiert wurde, lies doch bitte dazu auch GUI-Konzepte, Referenz-MessageLoop Modus (diesen benutzt du in deinem Skript) und evtl auch noch Referenz-OnEvent Format (benutze ich hauptsächlich)

    mfg (Auto)Bert

    Einmal editiert, zuletzt von AutoBert (7. Mai 2009 um 06:02)

  • Hey Bert, vielen lieben Dank für die Erklärungen noch... :thumbup: jetzt hoff ich nur dass du dir nicht deshalb nur so kurz schlafen konntest ;)
    Zu den Installationsroutinen brauche ich keine Hilfe, die hab ich schon alle fertig :)