1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. BugFix

Beiträge von BugFix

  • COM Funktion

    • BugFix
    • 10. Oktober 2007 um 10:03

    Hi und :willkommen:

    Zitat

    Wie kann ich in Autoit Variablentypen deklarieren? Was macht Autoit bei einer Deklaration mit DIM eigentlich? Wird die Variable automatisch den Anforderungen angepasst?

    Grundsätzlich definierst du die Variablen für ihren Space (also Global, Local, Dim).
    Der Variablentyp wird dabei der momentanen Verwendung angepaßt.
    Bsp.:

    [autoit]

    Dim $Zahl1 = 1
    Dim $String1 = "5"
    MsgBox(0, '', $Zahl1 + $String1) ; liefert 6

    [/autoit]

    Du kannst eine bestimmte Verwendung erzwingen mit Number($var) oder String($var).
    Eine Ausnahme bildet der Variablentyp Array. Arrayvariablen müssen auch als solche deklariert werden.
    z.B. Dim $array[10][2]
    Einige Funktionen liefern ein Array zurück (z.B. _FileReadToArray). Hier ist die Variable nur namentlich ohne Dimensionen zu deklarieren.
    Dim $arFile
    _FileReadToArray($FilePath, $arFile)

    Zu deiner Problemstellung kann ich momentan nicht viel sagen. Vielleicht hilft es GetStagePositionD als Array zu definieren:

    [autoit]

    Dim $GetStagePositionD[6] = [ $x, $y, $z, $t, $r, $m ]

    [/autoit]

    Aber ich habe keine Möglichkeit das zu testen.

  • Gui für ein Tool

    • BugFix
    • 10. Oktober 2007 um 09:34
    Zitat

    1. Wie kann ich Menuitems als Defaults speichern?
    2. Wie kann ich die angeklickten Dinge am besten abspeichern?
    3. Edit1: Wie kann ich das Programm in 2 Sprachen machen?
    4. Edit2: Wie kann ich @SWHIDE einsetzen?

    zu 1.
    Erkläre bitte genauer was du meinst. Wenn du MenuItems erstellst erscheinen alle Einträge in diesem Menü. Beim Öffnen des Menüs bekommt das erste Item automatisch den Focus. Du kannst zwar mit "GUICtrlSetState(-1,$GUI_FOCUS)" jedem Item den Focus geben, das führt aber zu einem Konflikt mit dem Standardfocus und durch <Enter> wird keine Aktion beim fokussierten Item ausgelöst. (zumindest ist das mein Testergebnis)

    zu 2.
    Dauerhaft speichern oder nur während der Sitzung?
    Dauerhaft: INI oder Textdatei
    Sitzung: Variable

    zu 3.
    INI erstellen mit verfübaren Sprachen:

    Code
    [DE]
    txt1=Menü
    txt2=Datei
    txt3=Öffnen
    ......
    [EN]
    txt1=Menu
    txt2=File
    txt3=Open
    ......


    Beim Programmstart Sprache abfragen und entsprechende Textvariablen einlesen.

    [autoit]

    If @OSLang = "0407" Then
    $arTXT = IniReadSection($INIPath, "DE")
    ElseIf @OSLang = "0409" Or @OSLang = "0809" Then
    $arTXT = IniReadSection($INIPath, "EN")
    EndIf

    [/autoit]

    zu4.
    Schau dir GUISetState() an.

  • 2 Guis in 1x

    • BugFix
    • 9. Oktober 2007 um 22:41

    Machs so:

    Spoiler anzeigen
    [autoit]

    While 1
    $msg = GUIGetMsg(1)
    Switch $msg[1]
    Case $gui1 ; Programm beenden
    Switch $msg[0]
    Case $GUI_EVENT_CLOSE
    Exit
    Case $btnOpenGUI2
    GUISetState(@SW_SHOW, $gui2)
    GUISetState(@SW_HIDE, $gui1) ; GUI 1 ausblenden
    ; Case andere Controls

    EndSwitch
    Case $gui2
    Switch $msg[0]
    Case $GUI_EVENT_CLOSE
    GUISetState(@SW_HIDE, $gui2) ; GUI 2 schließen
    GUISetState(@SW_SHOW, $gui1) ; GUI 1 einblenden
    ; Case andere Controls

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

    EndSwitch
    EndSwitch
    WEnd

    [/autoit]
  • 2 Guis in 1x

    • BugFix
    • 9. Oktober 2007 um 22:29

    Ich weiß ja nicht, wann du möchtest, dass sie geöffnet wird.

    Und achte darauf, dass du verschiedene Namen für die Controls und GUI wählst. Sonst gibt es Kollisionen.
    In deinem obigen Bsp. ist ja alles doppelt.

  • 2 Guis in 1x

    • BugFix
    • 9. Oktober 2007 um 22:06

    Mal ein Bsp. für 2 GUImit den ID's $gui1 und $gui2

    [autoit]

    While 1
    $msg = GUIGetMsg(1)
    If $msg[0] = $GUI_EVENT_CLOSE Then
    Switch $msg[1]
    Case $gui1 ; Programm beenden
    Exit
    Case $gui2
    GUISetState(@SW_HIDE, $gui2) ; GUI 2 schließen
    EndSwitch
    EndIf
    WEnd

    [/autoit]
  • 2 Guis in 1x

    • BugFix
    • 9. Oktober 2007 um 21:54

    Schau mal GUIGetMsg(1)
    Damit bekommst du ein Array zurück, das auch die ID der GUI enthält, von der das Ereignis kommt.
    Wenn $GUI_EVENT_CLOSE dann fragen von welcher ID und entsprechend Fenster schließen oder Exit.

  • Werte aus csv in Programm eintragen

    • BugFix
    • 9. Oktober 2007 um 21:24

    Du kannst zeilenweise oder spaltenweise vorgehen. Die Entscheidung können wir dir nicht abnehmen.;-)
    Auch ob du jeden Wert sofort nach dem Lesen in die Combo einfügst oder erst alles in ein Array liest hängt davon ab, ob du evtl. wiederholt auf diese Daten zugreifen mußt. Dann wäre die Arrayvariante zu bevorzugen.

    Befehle? - Steht sehr schön in der Hilfe ;)
    Aber ich bin mal nicht so.

    csv-Datei einlesen: _FileReadToArray()
    aufsplitten: StringSplit()
    Combo befüllen: _GUICtrlComboAddString()

  • Millisekunden ermitteln und ausdrücken...

    • BugFix
    • 9. Oktober 2007 um 18:10

    Hi,
    also jede Milisekunde kannst du nicht erwischen. Weil ja schon Zeit verstreicht zur Befehlsausführung. Außerdem müßtest du dann eine Schleife ohne Sleep laufen lassen und hättest 100% CPU-Last. ;)

    Ich habe hier eine Variante mit einem Sleep von 10. Wenn du die Werte in die Konsole ausgibst, siehst du dass die kürzeste Zeitdifferenz bei etwa 2-3 /10 Sekunden liegt.
    Ich hoffe diese Genauigkeit ist ausreichend.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    Opt("GUIOnEventMode", 1)
    $Form1 = GUICreate("Form1", 427, 223, -1, -1)
    GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
    $Label1 = GUICtrlCreateLabel("Zeit: ", 60, 58, 295, 17)
    GUISetState(@SW_SHOW)
    $hundertstel_Sec = 0
    $diff = 0
    $start = TimerInit()

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

    While 1
    Sleep(10)
    $diff = TimerDiff($start)
    $hundertstel_Sec = StringRight('00' & $diff, 3)
    If $diff >= 1000 Then $start = TimerInit()
    GUICtrlSetData($Label1, "Zeit: " & @HOUR & ':' & @MIN & ':' & @SEC & ',' & $hundertstel_Sec & @CRLF)
    WEnd

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

    Func Form1Close()
    Exit
    EndFunc

    [/autoit]
  • Rückgabewert auswerten / Progessbar

    • BugFix
    • 9. Oktober 2007 um 12:31

    Hi,
    verwende doch einfach eine Log-Datei und leite die Auswertung der einzelnen Programmschritte sofort dahin um.
    Hier mal ein Bsp.:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    Global $LogFile = 'LOG-DATEI'

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

    If _MyFunc() = -1 Then ; Funktionsaufruf mit gleichzeitiger Log-Funktion
    _FileWriteLog($LogTxt, '_MyFunc() Fehler: ' & @error)
    Else
    _FileWriteLog($LogTxt, '_MyFunc() OK')
    EndIf

    Func _MyFunc()
    ; Code
    ; Fehlerroutine (Eingaben abfragen etc.)
    ; wenn Fehler. SetError() evtl. je nach Fehler ErrorNummer setzen
    If @error Then
    Return -1 ; oder ErrorNummer mit @error
    Else
    Return 0 ; oder Funktionsergebnis
    EndIf
    EndFunc

    [/autoit]

    Die Progressbar setzt du ja sofort in einer Schleife. Klar, dass dann nichts anderes passiert.

    Du mußt die Anzahl der einzelnen Programmschritte/Funktionsaufrufe ermitteln.
    Nach jedem dieser Schritte setzt du dann die Progressbar.

  • Splash - GUI Generator

    • BugFix
    • 7. Oktober 2007 um 22:36

    Hi,
    im Zuge der Erstellung dieses Programms sind zwei Tools entstanden, die ich euch ja schon vorgestellt habe:
    - FormatControls und
    - GetFontPixelSize

    Mit diesem Programm könnt ihr auf einer GUI alle erforderlichen Parameter für eure Splash-GUI zusammenstellen.
    Features:
    - Splash-GUI als Stand-Alone oder Child
    - Position mit absoluten Koordinaten oder relativ per Schemawahl (links oben, mitte oben usw.)
    - Formatierung Text für alle Zeilen gleich (dabei sind Leerzeilen nicht möglich!) oder jede Zeile einzeln (Formatoptionen festlegen, Cursor in entsprechende Zeile stellen und übernehmen)
    - Labelhöhe wird an die Pixelhöhe der Schrift automatisch angepaßt (1,5-fache Pixelhöhe)
    Hierzu wird eine Test-GUI aufgerufen, die Zeichenfolge 'qÄ' dort gesetzt in der definierten Schrift und Schriftgrad. Per Pixelsearch wird dann die vertikale Platzbelegung in Pixeln ermittelt. Wahrzunehmen ist dies nur durch ein kurzes Flackern.
    - Abstand zum nächsten Label 0,5-fache Höhe des letzten Labels
    - automatische Anpassung der GUI-Höhe, falls durch die Label die gesetzte Größe überschritten wird
    - Vorschaufunktion Inhalt, (gewählte Position wird dabei nicht berücksichtigt)
    - Löschfunktion, falls Aussehen nicht wie gewünscht
    - Beim Beenden des Programms wird der dann komplette Code generiert und in die Zwischenablage kopiert.
    Ein GUISetState() und While-Schleife sind nicht enthalten, da es ja keine eigenständigen Programmoberflächen werden, sondern halt "bessere Messageboxen".

    Also dann testet mal schön.
    Solltet ihr Bugs entdecken - nur her damit.
    Ich erwarte euer Feedback ;)

    Der Code kann nicht gezeigt werden, jetzt sind nur noch 10.000 Zeichen max. zulässig.

    Hier mal zum Anschauen:

    Spoiler anzeigen

    [Blockierte Grafik: http://home.arcor.de/bugfix/splashgenerator.PNG]

    Edit: Neue, angepaßte Version hochgeladen.

    Dateien

    SplashGUI_Builder.au3 26,03 kB – 670 Downloads
  • Sleep-Zeit und Fehler in Schleife

    • BugFix
    • 7. Oktober 2007 um 13:41
    Zitat

    Original von inscape

    Da Checkt er das mit der Farbe irgendwie überhaupt nicht :(

    Das hat aber definitiv nichts mit der Wahl der Schleife zu tun.
    Debugge doch mal dein Programm.
    Laß dir jede Variable, die sich ändern kann/soll in die Konsole ausgeben. Dann siehst du am ehesten, wo es hakt.

  • Sleep-Zeit und Fehler in Schleife

    • BugFix
    • 7. Oktober 2007 um 10:41

    Was genau soll das eigentlich werden?

  • Frage bezüglich Send()

    • BugFix
    • 7. Oktober 2007 um 00:04

    Aha,mit Send(), hast du vorher nicht erwähnt.

    Send("ß")
    Send("´")

    Was willst du überhaupt wegen Alt ?

  • Frage bezüglich Send()

    • BugFix
    • 6. Oktober 2007 um 23:46

    Wohin willst du was senden? Bitte etwas genauer.

  • Datei erschaffen und Inhalt anzeigen lassen

    • BugFix
    • 6. Oktober 2007 um 21:56

    Da schau dir mal ShellExecute() an. Das dürfte dein Problem lösen.

    Ich habe den zweiten Code mal etwas korrigiert. Aber ungetestet. Wie gesagt: Schmeiß RunDOS raus.

    Spoiler anzeigen
    [autoit]

    $otext = InputBox("Überschreiben vorbereiten", "Geben sie bitte die neuen Daten ein")
    $ofile = FileOpen("FileTest.txt", 2)

    If $ofile = -1 Then
    MsgBox(0, "Error", "This Baby Got A Temper!!!")
    Sleep(250)
    Exit
    EndIf

    ;~ FileWrite("FileTest.txt", 1) Bereits zum Überschreiben geöffnet in Zeile 2
    For $o = 1 to 10 step 1
    FileWrite($ofile, $otext & @CRLF)
    Sleep(100)
    Next

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

    ; FileHandle schließen!!
    FileClose($ofile)

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

    Sleep(1000)
    _RunDOS("start notepad.exe " & @WorkingDir & "\FileTest.txt")
    Sleep(1000)
    WinWaitActive("FileTest.txt - Editor")
    Sleep(1000)
    WinKill("FileTest.txt - Editor")
    MsgBox(0, "End", "That's All Folks")

    [/autoit]


    Achja:

    [ SPOILER ][ AUTOIT ]
    Code
    [ /AUTOIT ][ /SPOILER ]

    ohne Leerzeichen in den Tags.

  • warteschleife

    • BugFix
    • 6. Oktober 2007 um 21:47
    Zitat

    aber wo bekomm ich diese data.au3 her?

    Das ist Bestandteil von AutoIt und liegt im Ordner "...AutoIt3\Include\".

  • warteschleife

    • BugFix
    • 6. Oktober 2007 um 21:19

    Ansatz nicht ganz richtig.
    So klappt es:

    [autoit]

    include <date.au3>

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

    Dim $hh = "00", $mm = "40", $ss = "00"
    Dim $verl_loop = _TimeToTicks($hh, $mm, $ss)

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

    While 1
    Sleep(100)
    If $verl_loop <= _TimeToTicks() Then ExitLoop
    WEnd
    MsgBox(0, '', 'Schleife beendet')

    [/autoit]
  • Edit Multiline - Zeile auslesen

    • BugFix
    • 6. Oktober 2007 um 21:05

    Hi,
    beim Arbeiten mit dem Editcontrol ist mir folgendes aufgefallen:
    Da keine Funktion zur direkten Ausgabe einer Zeile existiert muß man einen anderen Weg wählen.
    - Mit $index = _GUICtrlEditGetSel($Edit1) wird der Index des markierten Bereiches bzw. der Cursorposition ermittelt.
    - Mit $lineindex = _GUICtrlEditLineFromChar($Edit1, $index[2]) wird der (Null-basierte) Index der Zeile ermittelt die den ZeichenIndex enthält.
    - Mit $line = _GUICtrlEditGetLine($Edit1, $lineindex+1) wird der Text der Zeile zurückgegeben, wobei diese Funktion einen 1-basierten Index verlangt.

    Das Problem:
    Egal welche Auswahl als erstes getroffen wird - es wird immer ein falsches Ergebnis zurückgegeben.
    Bei weiteren Lesevorgängen stimmt es dann.
    Aber wenn der letzte Eintrag per Markierung ausgelesen wird klappt dies nicht. Stelle ich den Cursor jedoch in die letzte Zeile ohne zu markieren funktioniert es.

    Vielleicht hat ja jemand schonmal damit gekämpft.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #Include <GuiEdit.au3>

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

    Opt("GUIOnEventMode", 1)
    Global $index, $lineindex, $line

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

    $Form1 = GUICreate("Test Edit Zeilen lesen", 325, 421, 193, 115)
    GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
    $Edit1 = GUICtrlCreateEdit("", 12, 12, 301, 161, -1, $ES_MULTILINE)
    GUICtrlSetData(-1, "Das ist Zeile #1" & @CRLF & _
    "Das ist Zeile #2" & @CRLF & _
    "Das ist Zeile #3" & @CRLF & _
    "Das ist Zeile #4" & @CRLF & _
    "Das ist Zeile #5" & @CRLF & _
    "Das ist Zeile #6")
    $bRead = GUICtrlCreateButton("Zeile lesen", 216, 381, 100, 30, 0)
    GUICtrlSetOnEvent(-1, "bReadClick")
    $InIndexChr = GUICtrlCreateInput("", 232, 201, 80, 21)
    $Label1 = GUICtrlCreateLabel("_GUICtrlEditGetSel( )", 12, 184, 103, 17)
    $Label2 = GUICtrlCreateLabel("Zeichen-Index markierter Bereich Start/Ende:", 12, 204, 218, 17)
    $Label3 = GUICtrlCreateLabel("_GUICtrlEditLineFromChar( )", 12, 230, 136, 17)
    $Label4 = GUICtrlCreateLabel("ZeilenIndex in der Zeichen-Index enthalten:", 12, 252, 209, 17)
    $InIndexZeile = GUICtrlCreateInput("", 232, 249, 80, 21)
    $Label5 = GUICtrlCreateLabel("_GUICtrlEditGetLine( )", 12, 277, 108, 17)
    $Label6 = GUICtrlCreateLabel("Text der Zeile mit ZeilenIndex:", 12, 296, 146, 17)
    $InText = GUICtrlCreateInput("", 164, 293, 148, 21)
    $InInfo = GUICtrlCreateInput("Cursor in eine Zeile stellen oder einen Textbereich markieren.", 12, 352, _
    301, 21, BitOR($ES_AUTOHSCROLL,$ES_READONLY))
    GUISetState(@SW_SHOW)

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

    While 1
    Sleep(100)
    WEnd

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

    Func bReadClick()
    $index = _GUICtrlEditGetSel($Edit1)
    GUICtrlSetData($InIndexChr, $index[1] & ' / ' & $index[2])
    $lineindex = _GUICtrlEditLineFromChar($Edit1, $index[2]) ; Index ist 0-basiert
    GUICtrlSetData($InIndexZeile, $lineindex)
    $line = _GUICtrlEditGetLine($Edit1, $lineindex+1) ; Line verlangt 1-basierten Index
    GUICtrlSetData($InText, $line)
    EndFunc

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

    Func Form1Close()
    Exit
    EndFunc

    [/autoit]

    Edit:
    Ich habe nun eine voll funktionierende Lösung gefunden.
    Wie es aussieht, sind die UDF zum Edit-Ctrl nicht ganz ausgereift.
    Habe jetzt komplett umgestellt auf ControlCommand und damit funktioniert es tadellos.
    Spare ich mir auch das Include ;)

    Spoiler anzeigen
    [autoit]

    Func bReadClick()
    $lineindex = ControlCommand($Form1, '', $Edit1, "GetCurrentLine", "")
    GUICtrlSetData($InIndexLine, $lineindex)
    $line = ControlCommand($Form1, '', $Edit1, "GetLine", $lineindex)
    GUICtrlSetData($InText, $line)
    EndFunc

    [/autoit]
  • tatsächliche Schriftgröße ermitteln

    • BugFix
    • 5. Oktober 2007 um 21:55

    Der Schriftgrad eines Schriftfonts sagt ja nur indirekt etwas über die Schrifthöhe in Pixeln aus.

    Aber gerade wenn ich Controlgrößen festlegen muß, möchte ich natürlich wissen wieviel Platz für verwendete Fonts benötigt wird.

    Mit diesem Programm läßt sich die tatsächliche Pixelhöhe eines Fonts ermitteln.
    Dabei bin ich von der maximal möglichen vertikalen Platzbelegung ausgegangen.
    Es wird die Zeichenfolge 'qÄ' in ein Label einer GUI geschrieben.
    In einer Schleife wird der Schriftgrad in 0.5-er Schritten von Size = 6 bis Size = 28 gesetzt und dann die vertikale Auslenkung gescant.
    Das Ergebnis wird in die Datei: "FontPixelSize.txt" geschrieben.

    Schriftgrad und Font könnt ihr nach Bedarf anpassen.

    Edit: Hab grad bemerkt, dass einige Schriftarten bei kleinem Schriftgrad einen Fehler liefern - entsprechende Fehlerroutine eingebaut.

    Spoiler anzeigen
    [autoit]

    #include <guiconstants.au3>

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

    Dim $file = @ScriptDir & "\FontPixelSize.txt"
    Dim $sizeMin = 6, $sizeMax = 28
    Dim $font = 'Comic Sans MS'

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

    $gui = GUICreate('', 200, 150, 40, 40)
    $label = GUICtrlCreateLabel('', 0, 0, 200, 130, $SS_CENTERIMAGE)

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

    GUISetState()
    GUICtrlSetData($label, 'qÄ')
    GUICtrlSetColor($label, 0xFF0000)

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

    $fh = FileOpen($file, 1)
    FileWriteLine($fh, $font)
    FileWriteLine($fh, 'Schriftgrad / Größe in Pixel')
    For $i = $sizeMin To $sizeMax Step 0.5
    GUICtrlSetFont($label, $i, 400, -1, $font)
    Select
    Case ($i <= 10) Or (IsInt($i) = 1)
    FileWriteLine($fh, $i & @TAB & @TAB & _scanLetter())
    Case Else
    FileWriteLine($fh, $i & @TAB & _scanLetter())
    EndSelect
    Next
    FileClose($fh)

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

    Func _scanLetter()
    Local $arSize[1]
    For $i = 40 To 190
    $pos = PixelSearch(40, $i, 240, $i, 0xFF0000)
    If IsArray($pos) Then
    ReDim $arSize[UBound($arSize)+1]
    $arSize[UBound($arSize)-1] = $pos[1]
    EndIf
    Next
    If UBound($arSize) > 1 Then Return $arSize[UBound($arSize)-1] - $arSize[1] +1
    EndFunc

    [/autoit]

    Dateien

    GetFontPixelSize.au3 1,04 kB – 331 Downloads
  • [Diablo II] Auto Bonewall Script - Brauche wieder ein wenig hilfe, hehe

    • BugFix
    • 5. Oktober 2007 um 17:28

    :lol: Ich würd mal sagen, dass hat jetzt mit AutoIt noch soviel gemeinsam, wie ein Kuhfladen mit 'ner Pizza. :rofl:
    Also ab in die Talk-Ecke mit euch, husch husch. :P

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™