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

  • [Problem] Item Reader - Daten aus 3 Dateien lesen & zuordnen

    • BugFix
    • 26. September 2017 um 12:33

    Und woran kann ich festmachen, dass IDS_PROPITEM_TXT_000005 Penya1 Beschreibung eine Beschreibung und kein Item ist? Hier liegt doch der Hund begraben. Es gibt keine eindeutige Möglichkeit eine Beschreibung zu identifizieren.

  • [Problem] Item Reader - Daten aus 3 Dateien lesen & zuordnen

    • BugFix
    • 26. September 2017 um 11:31

    Ja, ich kann das Item über eine Suche mit ID finden - aber ich weiß nicht, ob ein optionaler Text dazu existiert. Das ist am Aufbau der Datei nicht erkennbar.

    Da ist m.M. nach die Datei mit falscher Struktur erstellt worden. Es sollten eindeutige Identifier zum Zugriff auf Item (vorhanden) und Itembeschreibung (nicht vorhanden) existieren.

    Man könnte das jetzt evtl. so lösen:

    - Eintrag in Zeile existiert in Itemdatei: ist ein Item

    - Eintrag in nächster Zeile prüfen, ob es auch in Itemdatei existiert

    -- JA: Item hat keine Beschreibung

    -- NEIN: Das ist die Beschreibung zum Item, Beschreibung erfassen und Zeile überspringen

    Ist natürlich dann doch wieder zeitaufwändiger, weil man ständig Prüfungen vornehmen muss.

    Nochmals der Hinweis: Aus meiner Lösung greift das Pattern für das Parsen der propItem.txt.txt nicht richtig aufgrund der vorgenannten Probleme.

  • [Problem] Item Reader - Daten aus 3 Dateien lesen & zuordnen

    • BugFix
    • 26. September 2017 um 11:08
    Zitat von Ram3000

    Und manchmal machen die auch einfach riesen Sprünge.


    IDS_PROPITEM_TXT_001008 Itemname

    IDS_PROPITEM_TXT_002001 Itemname

    Das ist natürlich eine schwache Kür. Somit kann man nämlich die Itemnamen nicht von den optionalen Beschreibungen unterscheiden. Und da ist es völlig egal, ob man das mit RegEx auswertet oder Zeile für Zeile. Es gibt einfach keinen Unterschied zwischen Namen und Beschreibungen - beides ist Text und die Identifier unterscheiden sich nur an einer fortlaufenden Zahl.

    Zitat von Ram3000

    Kleine Frage zum FileWrite: Wie kann ich es machen, das die result.txt immer neu gefüllt wird? Jetzt schreibt das Script immer weiter in die Datei, dann ist alles mehrfach in der Datei.

    Zwei Möglichkeiten.

    1. Wenn Datei bereits besteht: Löschen und dann neu erstellen - Oder:

    2. Datei im Überschreibmodus öffnen

    $fH = FileOpen(DATEIPFAD, 2+8) ; overwrite+create_folderstruct

    Filewrite($fH, INHALT)

    FileClose($fH)

  • [Problem] Item Reader - Daten aus 3 Dateien lesen & zuordnen

    • BugFix
    • 26. September 2017 um 09:12

    Ich schau noch mal drauf, habe auch gerade festgestellt, dass in der *txt.txt an einigen Stellen kein Leerzeichen am Ende der Zeile ist und somit mein Pattern falsch greift.

    EDIT

    Ich hatte nicht bedacht, dass StringFormat auch \r \n \t direkt umsetzt. Hier '%s\result.txt' dann logischerweise ein Zeilenumbruch, muss also maskiert werden: '%s\\result.txt'

    EDIT_2

    Deine Datei propItem.txt.txt ist unvollständig! Da kann ich mir 'nen Wolf probieren - so ist sie nicht auslesbar.

    Das Muster, was auch anfangs stimmt:

    TEXT_NR_GERADE = Text

    TEXT_NR_UNGERADE = optionale Beschreibung

    Nur ist die Datei nachher unvollständig und es sind z.T. nur Zeilen mit Beschreibung hintereinander, Bsp.

    IDS_PROPITEM_TXT_006079 (Questitem)

    IDS_PROPITEM_TXT_006081 (Questitem)

    IDS_PROPITEM_TXT_006083 (Questitem)

    IDS_PROPITEM_TXT_006085 (Questitem)

    Frage:

    - Wo sind die Texte für IDS_PROPITEM_TXT_006080 / --82 / --84 etc.?

    - Sollen diese leeren Beschreibungen aussen vor bleiben?

  • [Problem] Item Reader - Daten aus 3 Dateien lesen & zuordnen

    • BugFix
    • 25. September 2017 um 23:46
    Zitat von Ram3000

    Aber kann es sein das das FileWrite nichts macht? Bei mir wir keine Datei erstellt...?!

    Wie bereits gesagt wurde, ist dieser Teil auskommentiert. D.h., du musst auch in der Schleife den Teil

    ;~ $sResult &= $SF('%s|%s|%s%s', $oItem.Item($aPropItem[$i]), $oItemTxt.Item($aPropItem[$i+1]), $aPropItem[$i], @CRLF)

    wieder aktivieren.

  • Ein Fenster im Hintergrund manipulieren

    • BugFix
    • 25. September 2017 um 20:27

    Na dann walte ich mal meines Amtes. [CLOSED]

  • [Problem] Item Reader - Daten aus 3 Dateien lesen & zuordnen

    • BugFix
    • 25. September 2017 um 20:14

    Also ich hab dir mal eine, wie ich finde, recht flotte Variante erstellt: Parsen und Listview befüllen < 2 Sekunden.

    AutoIt
    #include <GUIListView.au3>
    Opt('GUIOnEventMode', 1)
    
    Global $SF = StringFormat
    Global $sPathItem = $SF('%s\defineItem.h', @ScriptDir)
    Global $sPathPropItem = $SF('%s\propItem.txt', @ScriptDir)
    Global $sPathPropItemTxt = $SF('%s\propItem.txt.txt', @ScriptDir)
    Global $sPathResult = $SF('%s\result.txt', @ScriptDir)
    
    #cs #STRUKTUR#
    
    $sPathItem
    #define II_WEA_AXE_RODNEY               81
    ........Key.............................Value
    
    $sPathPropItem
    6    II_WEA_AXE_RODNEY    IDS_PROPITEM_TXT_000124    1    1    IK1_WEAPON    IK2_.....
    ....Key.................Value
    
    $sPathPropItemTxt
    IDS_PROPITEM_TXT_000124    Rodney Axe
    Key.....................Value @CRLF optionale Beschreibung
    
    
    
    ============# Abhängigkeiten #=================
    Key[$sPathPropItem] = Key[$sPathItem] --> ID
    Value[$sPathPropItem] = Key[$sPathPropItemTxt] --> TEXT
    
    Es muss nur durch $sPathPropItem Wert für Wert iteriert werden.
    Andere Werte werden einmalig in ein Dictionary gepackt und sind dann direkt abrufbar.
    #ce
    
    Global $timer = TimerInit()
    
    Global $aItem = StringRegExp(FileRead($sPathItem), '(?<=\r\n)#define\s+([\S\T]+)\s+(\d+)', 3)
    ; Index 0 (+2/4/6...) = Key     II_WEA_AXE_RODNEY
    ; Index 1 (+2/4/6...) = Value   81
    Global $oItem = ObjCreate('Scripting.Dictionary')
    For $i = 0 To UBound($aItem) -2 Step 2
        $oItem.Add($aItem[$i], $aItem[$i+1]) ; ItemDefine = ID
    Next
    
    Global $aItemTxt = StringRegExp(FileRead($sPathPropItemTxt), '(\w+\d+)\s([^\r]+)\r\n\w+\d+\s([^\r]*)', 3)
    ; Index 0 (+3/5/7...) = Key     IDS_PROPITEM_TXT_000124
    ; Index 1 (+3/5/7...) = Value   Rodney Axe
    ; Index 2 (+3/5/7...) = Value2  [optionale Beschreibung]
    Global $oItemTxt = ObjCreate('Scripting.Dictionary')
    For $i = 0 To UBound($aItemTxt) -3 Step 3
        $oItemTxt.Add($aItemTxt[$i], $aItemTxt[$i+1] & '|' & $aItemTxt[$i+2])
    Next
    
    Global $aPropItem = StringRegExp(FileRead($sPathPropItem), '(?<=\r\n)\d+\t+([\w_\d]+)\t+([\S]+)\s+', 3)
    ; Index 0 (+2/4/6...) = Key     II_WEA_AXE_RODNEY
    ; Index 1 (+2/4/6...) = Value   IDS_PROPITEM_TXT_000124
    
    ; GUI
    Global $sResult = ''
    
    $hGUI=GUICreate("Item-Lister", 900, 800)
    $hList = GUICtrlCreateListView("Item Code|DEFINE|Item Name|Item Text", 20, 20, 860, 650)
    _GUICtrlListView_SetColumn($hList, 0, 'ITEM-ID', 60, 0) ; 2. Spalte = 470 Px breit, rechts ausgerichtet
    _GUICtrlListView_SetColumn($hList, 1, 'Itenname', 240, 0) ; 2. Spalte = 470 Px breit, rechts ausgerichtet
    _GUICtrlListView_SetColumn($hList, 2, 'Itenbeschreibung', 356, 0) ; 2. Spalte = 470 Px breit, rechts ausgerichtet
    _GUICtrlListView_SetColumn($hList, 3, 'Define', 180, 0) ; 1. Spalte = 40 Px breit, links ausgerichtet
    GUISetOnEvent(-3, "_close")
    
    For $i = 0 To UBound($aPropItem) -2 Step 2
        ; ID | Name | Beschreibung | ItemDefine
        ; 81 | Rodney Axe | | II_WEA_AXE_RODNEY
        ; zum Ablegen in speicherbaren String
    ;~     $sResult &= $SF('%s|%s|%s%s', $oItem.Item($aPropItem[$i]), $oItemTxt.Item($aPropItem[$i+1]), $aPropItem[$i], @CRLF)
        ; oder direkt in Listview eintragen
        GUICtrlCreateListViewItem($SF('%s|%s|%s%s', $oItem.Item($aPropItem[$i]), $oItemTxt.Item($aPropItem[$i+1]), $aPropItem[$i]), $hList)
    Next
    
    ; Schreiben in Datei
    ;~ FileWrite($sPathResult, $sResult)
    
    ConsoleWrite(TimerDiff($timer)/1000 & @CRLF)
    GUISetState()
    
    While True
        Sleep(50)
    WEnd
    
    Func _close()
        Exit
    EndFunc
    Alles anzeigen
  • 7-Zip und AutoIt

    • BugFix
    • 23. September 2017 um 15:15
    Zitat von Mikki

    Der Code von der _BuildInZip. Was genau muss ich denn damit machen? Den Code in einer .au3-Datei speichern und einbinden?

    Das ist eine Funktion. In dein Skript einfügen und die Funktion aufrufen mit den Parametern. Beschreibung siehst du im Funktionskopf.

  • 7-Zip und AutoIt

    • BugFix
    • 23. September 2017 um 12:01

    Muss es zwingend 7Zip sein? Ansonsten kannst du die in Windows integrierte ZIP-Funktion nutzen: ZIP - Packen / Entpacken mit Windows eigener Funktion

  • Ein Fenster im Hintergrund manipulieren

    • BugFix
    • 22. September 2017 um 19:50

    Für nichts davon brauchst du Klick- oder Sendbefehle.

    Schreib dir erst mal das, was du tun willst in genau der Reihenfolge, wie es ablaufen soll. Ordner(-strukturen) lesen/erstellen, Dateien kopieren, ausdrucken - das kann alles mit nativen AutoIt-Befehlen vollzogen werden.

  • Ein Fenster im Hintergrund manipulieren

    • BugFix
    • 22. September 2017 um 16:00

    Ja unzoLEET, mal Butter bei die Fische, was du tatsächlich vorhast. Es hat bisher, wie man im Ländle sagt, ein "Geschmäckle".

  • GuiCtrlBusy - wie ToolTip, nur anders ;-) - Final [v1.0]

    • BugFix
    • 22. September 2017 um 12:54

    2017-10-26: FINAL v1.0

    Mit GuiCtrlBusy.au3 können ToolTip ähnliche Controls erstellt werden, mit einer Vielzahl von Funktionen.

    • Mehrere Ctrl lassen sich gleichzeitig erstellen, z.B. zum Debuggen in verschachtelten Schleifen.

    • Ctrl haben eine minimale Größe von 250*120 (B*H)

    • Die Ctrl lassen sich mit der Maus ziehen.

    • 3 Arten von Ansichten, Titelzeile mit: Titel allein / Titel und Uhrzeit / Titel und Countdown (Standard)

    • Alle Ansichten lassen sich mit Countdown verwenden. Die Restzeit kann im Text angezeigt werden mit "%C%".

    • Zwischen den Ansichtsarten kann hin und her gewechselt werden.

    • Font, Größe und Stil des Titels sind fest. Titel und Trennlinie verwenden dieselbe Farbe.

    • Links vom Titel kann ein Icon gesetzt werden. (aus *.dll oder *.ico Datei)

    • Die Textausgabe erfolgt links, rechts oder zentriert (Standard).

    • Die Textfarbe kann unterschiedlich zur Titelfarbe gesetzt werden.

    • Der Text kann in Font, Größe und Stil verändert werden.

    • Für die Färbung des Hintergrundes wird ein Farbverlauf verwendet. Dessen Richtung kann von oben-nach-unten (Standard) auf links-nach-rechts geändert werden.

    • Es existieren vordefinierte Farbschemata, die genutzt werden können.

    • Temporär lassen sich eigene Farbschemata hinzufügen.

    • Alle Parameter sind zur Lebenszeit des Ctrl änderbar.

    • Alle Ctrl haben ein Sicherheits-Timeout. Es ist vordefiniert in $GCB_U_TIMEOUT_ZERO (Standard = 2 Stunden). Beim Setzen eines höheren Countdown Wertes,

    wird $GCB_U_TIMEOUT_ZERO automatisch auf diesen Wert erhöht.

    • Alle Standard Parameter lassen sich ändern mit _GuiCtrlBusy_UserDefaults().

    • Die Funktion _GuiCtrlBusy_GetClosed() gibt eine Dummy-ID zurück. Der Dummy wird ausgelöst beim Schliessen eines Ctrl (mit Countdown oder _GuiCtrlBusy_Close() ).

    Das Handle des geschlossenen Ctrl kann dann mit GuiCtrlRead(Dummy-ID) ausgelesen werden.

    • Das Callback Intervall ist für jedes Ctrl einzeln änderbar (Standard ist 500 ms). Bitte mit Vorsicht anwenden.

    Bei hoher Frequenz, vielen Control und Neuberechnung der Ctrl-Größe bei jedem Aufruf, wird die CPU stark gefordert.

    Zusätzlich kann aber die Neuberechnung der Ctrl-Größe gestoppt werden (normalerweise passiert das bei jeder Änderung in Titel oder Text). Haben die Änderungen

    keinen oder minimalen Einfluß auf die Textlänge, ist es sinnvoll die Berechnung zu stoppen. Dann lassen sich auch sehr kurze Callback Intervalle verwenden.

    Funktionsliste

    _GuiCtrlBusy_Create([$_sTitle=''[, $_sText=''[, $_iAlign=2[, $_iX=-1[, $_iY=-1[, $_iTimeout=-1[, $_iTimeCounter=-1[, $_BGRtitle=-1[, $_BGRtext=-1[, $_RGBtopleft=-1[, $_RGBbottomright=-1[, $_bRotate=False]]]]]]]]]]]])

    Ctrl erstellen

    _GuiCtrlBusy_Close([$_hWnd=-1])

    Ein/alle Ctrl beenden

    _GuiCtrlBusy_SetTitle($_hWnd, $_sTitle=''[, $_iTimeCounter=''[, $_iTimeout=''[, $_BGRtitle=''[, $_bSetOnTop='']]]])

    Einstellungen Titelzeile: Titel, Anzeige: nur Titel/Titel und Zeit/Titel und Countdown, Timeout, Farbe, ontop.

    _GuiCtrlBusy_SetIcon($_hWnd, $_sIconFile=''[, $_iIconID])

    Icon setzen aus *.dll/*.ico Datei. Mit Leerstring "shell32.dll".

    _GuiCtrlBusy_SetText($_hWnd, $_sText=''[, $_BGRtext=''[, $_iSize=''[, $_iStyle=''[, $_sFontname=''[,$_iAlign=''[, $_bSetOnTop='']]]]]])

    Setzen Text /~farbe /~größe /~stil /~font, opt. ontop

    _GuiCtrlBusy_SetCBInterval($_hWnd[, $_iInterval=$GCB_U_CALLBACK_INTERVAL[, $_bNoReCalc=False]])

    Setzen individuelles Callback Intervall, opt. stoppen Neuberechnung Ctrl-Größe.

    _GuiCtrlBusy_StopRecalc($_hWnd[, $_bNoReCalc=True])

    Stoppt (oder erlaubt) Neuberechnung Ctrl-Größe bei Änderung von Text oder Titel.

    _GuiCtrlBusy_SetColors($_hWnd, $_BGRtitle=''[, $_BGRtext=''[, $_RGBtopleft=''[, $_RGBbottomright='']]])

    Setzen Titel/Text/Farbverlauf Farben.

    _GuiCtrlBusy_SetGradient($_hWnd, $_RGBtopleft=''[, $_RGBbottomright=''[, $_bRotate='']])

    Setzen Farben Farbverlauf und Richtung

    _GuiCtrlBusy_SetScheme($_hWnd[, $_sScheme=''[, $_bRotate=''[, $_bSetOnTop='']]])

    Setzen von Farbschema / Richtung, optional ontop.

    _GuiCtrlBusy_GetScheme($_sScheme='')

    Rückgabe Array mit einem oder allen Farbschemata.

    _GuiCtrlBusy_AddScheme($_sScheme, $_RGBtopleft, $_RGBbottomright, $_BGRtitle, $_BGRtext)

    Hinzufügen neuer Farbschemata, nur gültig zur Laufzeit

    _GuiCtrlBusy_SetPos($_hWnd, $_iX=''[, $_iY=''[, $_bSetOnTop='']])

    Bewegen des Ctrl an x/y Position, optional ontop.

    _GuiCtrlBusy_SetTimeout($_hWnd, $_iTimeout, $_iTimeCounter)

    Setzen/Beenden des Timeout, switchen der Ansicht.

    _GuiCtrlBusy_SetOnTop([$_hWnd=-1])

    Setzt ein (Standard: alle) Ctrl ontop.

    _GuiCtrlBusy_UserDefaults($_sParamValue[, $_sDelim='|'])

    Ändern der Voreinstellungen (Standardwerte) für die Ctrl-Erstellung.

    _GuiCtrlBusy_GetClosed()

    Dummy-ID abfragen, die ausgelöst wird, wenn ein Ctrl geschlossen wird. Mit "GuiCtrlRead(Dummy)" ist das Ctrl-Handle des geschlossenen Ctrl auslesbar. 

    Testcode
    AutoIt
    #include "GuiCtrlBusy.au3"
    
    #Region
    ; Creates an Busy control.
    ; _GuiCtrlBusy_Create      ([$_sTitle = ''[, $_sText = ''[, $_iAlign=2[, $_iX = -1[, $_iY = -1[, $_iTimeout = -1[, $_iTimeCounter = -1[, $_BGRtitle = -1[, $_BGRtext = -1
    ;                           [, $_RGBtopleft = -1[, $_RGBbottomright = -1[, $_bRotate = False]]]]]]]]]]]])
    ; Close one/all controls.
    ; _GuiCtrlBusy_Close       ([$_hWnd = -1])
    
    ; Für die Manipulation von Ctrl gilt einheitlich:
    ; optionale Parameter --> "Leerstring"="Wert wird beibehalten", "-1"="USER_DEFAULT" oder der übergebene Wert
    
    ; Sets for title line: title, show:nothing(0)/countdown(1)/clocktime(2), timeout, color.
    ; _GuiCtrlBusy_SetTitle    ($_hWnd, $_sTitle = ''[, $_iTimeCounter = ''[, $_iTimeout = ''[, $_BGRtitle = ''[, $_bSetOnTop = '']]]])
    
    ; Sets icon from any *.dll/*.ico file.
    ; _GuiCtrlBusy_SetIcon     ($_hWnd, $_sIconFile=''[, $_iIconID])
    
    ; Sets text /~color /~size /~style /~font.
    ; _GuiCtrlBusy_SetText     ($_hWnd, $_sText = ''[, $_BGRtext = ''[, $_iSize=''[, $_iStyle=''[, $_sFontname=''[, $_bSetOnTop = '']]]]])
    
    ; Sets an individual callback interval, opt. stops recalculation of ctrl size.
    ; _GuiCtrlBusy_SetCBInterval($_hWnd[, $_iInterval=$GCB_U_CALLBACK_INTERVAL[, $_bNoReCalc=False]])
    
    ; Stops (or allows) recalculation of control size while text or title is changed.
    ; _GuiCtrlBusy_StopRecalc  ($_hWnd[, $_bNoReCalc=True])
    
    ;Sets title/text/gradient colors.
    ; _GuiCtrlBusy_SetColors   ($_hWnd, $_BGRtitle = ''[, $_BGRtext = ''[, $_RGBtopleft = ''[, $_RGBbottomright = '']]])
    
    ; Sets gradient colors and direction.
    ; _GuiCtrlBusy_SetGradient ($_hWnd, $_RGBtopleft = ''[, $_RGBbottomright = ''[, $_bRotate = '']])
    
    ; Sets color-scheme/gradient-direction/optional ontop.
    ; _GuiCtrlBusy_SetScheme   ($_hWnd[, $_sScheme = ''[, $_bRotate = ''[, $_bSetOnTop = '']]])
    
    ; Gets array of one or all color schemes.
    ; _GuiCtrlBusy_GetScheme   ($_sScheme='')
    
    ; Adds a new color scheme, only valid at runtime.
    ; _GuiCtrlBusy_AddScheme   ($_sScheme, $_RGBtopleft, $_RGBbottomright, $_BGRtitle, $_BGRtext)
    
    ; Moves the control to x/y position, optional set ontop.
    ; _GuiCtrlBusy_SetPos      ($_hWnd, $_iX = ''[, $_iY = ''[, $_bSetOnTop = '']])
    
    ; Sets/Stops the control timeout.
    ; _GuiCtrlBusy_SetTimeout  ($_hWnd, $_iTimeout, $_iTimeCounter)
    
    ; Sets one (default: all) control on top.
    ; _GuiCtrlBusy_SetOnTop    ([$_hWnd = -1])
    
    ; Changes the default values for control creation.
    ; _GuiCtrlBusy_UserDefaults($_sParamValue[, $_sDelim = '|'])
    
    ; Gets a Dummy-ID, that will fired by closing ctrl. Use "GuiCtrlRead(Dummy)" to get Ctrl-hWnd.
    ; _GuiCtrlBusy_GetClosed   ()
    #endregion
    
    Opt('GUIOnEventMode', 1)
    
    Global $gClicked = False
    
    $hGui = GUICreate('Test', 300, 250, 100, 100)
    GUISetOnEvent(-3, '_close')
    GUICtrlCreateLabel('Mit Schliessen dieses Fensters' & @LF &  @LF & 'werden alle BusyCtrl beendet.', 30, 30)
    $bt1 = GUICtrlCreateButton('Intervall Nr 6', 10, 100, 120, 20)
    GUICtrlSetOnEvent(-1, '_onButton')
    $bt2 = GUICtrlCreateButton('Font/Style Nr 7', 10, 130, 120, 20)
    GUICtrlSetOnEvent(-1, '_onButton')
    $bt3 = GUICtrlCreateButton('Countdown Nr 6', 10, 160, 120, 20)
    GUICtrlSetOnEvent(-1, '_onButton')
    $bt4 = GUICtrlCreateButton('New Scheme Nr 7', 10, 190, 120, 20)
    GUICtrlSetOnEvent(-1, '_onButton')
    GUISetState()
    
    
    ; Icon List: http://help4windows.com/windows_7_shell32_dll.shtml
    
    $hBusy0 = _GuiCtrlBusy_Create()                                                                                                  ; all params as default
    $hBusy1 = _GuiCtrlBusy_Create('Nr 1 und der Titel muss jetzt lang sein', 'Titel && Countdown: %C%\nScheme: Clouds', 2, 420,  50, 50, 0)  ; the default color scheme
    $hBusy2 = _GuiCtrlBusy_Create('Nr 2', 'Titel && Countdown\nCountdown: %C%\nScheme: Coffee',                         2, 800,  50, 10, -1, 'coffee')
    $hBusy3 = _GuiCtrlBusy_Create('Nr 3', 'Titel && Zeit\nMal etwas in die Breite gezogen Scheme: Darkness',            2, 420, 200,  0,  2, 'darkness', True)
    $hBusy4 = _GuiCtrlBusy_Create('Der Titel ist mal deutlich länger und länger', 'Nur Titel\nScheme: Silver\nlinks',   0, 800, 200,  0,  0, 'silver', True)
    
    $hBusy5 = _GuiCtrlBusy_Create('Nr 5', 'Titel && Zeit\nScheme: Fire\nrechts\nIntervall 2s',                          1, 100, 400,  0,  2, 'fire')
    _GuiCtrlBusy_SetCBInterval($hBusy5, 2000) ; alle 2s aktualisieren
    _GuiCtrlBusy_SetIcon($hBusy5, 'moricons.dll', 7)
    
    $hBusy6 = _GuiCtrlBusy_Create('Nr 6', 'Titel && Zeit\nScheme: Sys_invers\nmitte\nIntervall 3s',                     2, 420, 400,  0,  2, 'sys_invers')
    _GuiCtrlBusy_SetCBInterval($hBusy6, 3000) ; alle 3s aktualisieren
    _GuiCtrlBusy_StopRecalc($hBusy6)
    
    $hBusy7 = _GuiCtrlBusy_Create('Nr 7', 'Titel && Zeit\nScheme: Orange\nund eine Zeile #3\nund auch noch eine Zeile #4',-1, 100, 550,  0,  2, 'orange', True)
    
    
    ; Dummy-Ctrl, das befeuert wird wenn ein Busy-Ctrl geschlossen wird. Das Ctrl-Handle ist mit "GuiCtrlRead(Dummy)" auslesbar
    $cClosed = _GuiCtrlBusy_GetClosed()
    GUICtrlSetOnEvent(-1, '_onButton')
    
    
    
    While 1
        Sleep(50)
    WEnd
    
    Func _onButton()
        Switch @GUI_CtrlId
            Case $bt1 ; $_hWnd, $_sTitle='', $_iTimeCounter='', $_iTimeout='', $_BGRtitle='', $_bSetOnTop=''
                _GuiCtrlBusy_SetCBInterval($hBusy6, 1000)
                _GuiCtrlBusy_SetText ($hBusy6, 'Intervall geändert\n1 Sekunde')
            Case $bt2 ; $_hWnd, $_sText='', $_BGRtext='', $_iSize='', $_iStyle='', $_sFontname='', $_bSetOnTop=''
                _GuiCtrlBusy_SetText ($hBusy7, '', '', 16, 1+4, 'Comic Sans MS')
            Case $bt3 ; $_hWnd, $_iTimeout, $_iTimeCounter=1
                If $gClicked Then
                    _GuiCtrlBusy_SetTimeout($hBusy6, 0, 2)
                    GUICtrlSetData($bt3, 'Countdown Nr 6')
                Else
                    _GuiCtrlBusy_SetTimeout($hBusy6, 20, 1)
                    GUICtrlSetData($bt3, 'Stop Countdown 6')
                EndIf
                $gClicked = Not $gClicked
    
            Case $bt4 ; $_hWnd, $_sScheme='', $_bRotate='', $_bSetOnTop=''
                _GuiCtrlBusy_SetScheme($hBusy7, 'forest')
                _GuiCtrlBusy_SetText($hBusy7, 'New Scheme\n"Forest"')
            Case $cClosed
                Switch GUICtrlRead($cClosed)
                    Case $hBusy0
                        ConsoleWrite('Busy-Ctrl "$hBusy0" beendet' & @CRLF)
                    Case $hBusy1
                        ConsoleWrite('Busy-Ctrl "$hBusy1" beendet' & @CRLF)
                    Case $hBusy2
                        ConsoleWrite('Busy-Ctrl "$hBusy2" beendet' & @CRLF)
                    Case $hBusy6
                        ConsoleWrite('Busy-Ctrl "$hBusy6" beendet' & @CRLF)
                EndSwitch
        EndSwitch
    EndFunc
    
    Func _close()
        Exit
    EndFunc
    Alles anzeigen

    Mit dem Standardintervall von 500 ms habe ich auch bei 10 zeitgleich offenen Ctrl und Neuberechnung der Ctrl-Größe bei jedem Aufruf (normalerweise erforderlich bei jeder Änderung von Text oder Titel) keine spürbare Belastung der CPU.

    Viel Spaß damit.

    alter Inhalt

    Das Skript liegt bei mir nun schon seit Jan. 2016, jetzt poste ich es mal.

    Ich betrachte es aber noch als Beta-Status. Einige Ideen zur Erweiterung habe ich noch. Vorerst möchte ich aber erst mal Folgendes abklären:

    Bei mir tritt manchmal folgender Fehler auf. Wenn die Ctrl über lange Zeit stehen, werden diese plötzlich nicht mehr gezeichnet - werden weiß - und/oder das Programm friert ein.

    Ich kann das an keiner Ursache festmachen. zumal es nicht immer auftritt.

    Vielleicht kann das mal jemand austesten und berichten.

    Achja, was macht das Ctrl:

    - Ähnlich wie ein Tooltip, aber es können mehrere zeitgleich verwendet werden.

    - Es kann als Countdown oder reine Anzeige genutzt werden.

    - Verschieden Farbschemata sind vordefiniert (Farbverlauf, passende Textfarben).

    - Schließt das Ctrl wird eine Msg an ein Fenster eigener Wahl (Standard das aktive Fenster) gesendet.

    - Zur Laufzeit sind alle Einstellungen (Text/Titel/Farben) änderbar.

    NEU

    - Es kann ein ein Dummy-Ctrl erstellt werden, das beim Schließen der Ctrl befeuert wird (.._GetClosed() ). Das jeweilige Ctrl-Handle ist mit "GuiCtrlRead(Dummy)" auslesbar (s. Bsp)

    FARBSCHEMA:

    - Das Farbschema kann kpl. mit .._SetScheme() geändert werden

    - Zur Laufzeit lassen sich eigene Farbschemata mit .._AddScheme() hinzufügen (keine dauerhafte Speicherung)

    - Die Farbschemata lassen sich einzeln/alle als Array ausgeben mit .._GetScheme()

    TEXT:

    - Text kann links/rechts/zentriert angezeigt werden, Parameter Align bei Erstellung

    - Änderung von Textgröße, Darstellung(und/oder): Normal,Fett/Kursiv/Unterstrichen/Durchgestrichen, Schriftart

    ACHTUNG: Bei einigen Kombinationen von Schriftarten/ -größe und -darstellung ist die Größenberechnung fehlerhaft!

    - Es kann geswitcht werden zwischen Anzeige Titel(und Zeit) oder Countdown - hin und her

    - Die Textausrichtung ist auch nachträglich änderbar.

    [EDIT 2017-10-20]

    Ich habe das Skript kpl. überarbeitet. Die Erstellung und Verwaltung der Ctrl ist jetzt deutlich beschleunigt. Zugriffe erfolgen, da wo es möglich ist, ByRef. Integriert habe ich noch einen Kollisionsschutz, damit die Callbackfunktion nicht ausgeführt werden kann, während durch Nutzereingriff gerade Parameter geändert werden.

    Aber ich habe noch folgendes Problem:

    Speicherlecks treten nicht mehr auf, der genutzte Arbeitsspeicher während der Ausführung ist nahezu konstant. Aber obwohl das Skript fehlerfrei läuft (Countdown läuft runter, Uhrzeiten werden angezeigt) kann ich nach etwa zwei Minuten das Bsp-Skript nicht mehr schliessen. Keine erhöhte CPU-Nutzung, RAM auch OK. Es reagiert nur nicht.

    Könnt ihr das bitte mal nachtesten?

    [Edit im Edit] Nach Rechnerneustart tritt das Problem nicht mehr auf, da hatte wohl was anderes blockiert. - Für Rückmeldungen bin ich trotzdem dankbar.

    P.S. Icon Integration ist vorgesehen, dazu muß aber erst mal alles konfliktfrei laufen.

    [EDIT FARBSCHEMATA]

    Ich habe noch 3 weitere Schema erstellt: 'fire', 'system' und 'sys_invers'

    Ersetzt einfach die vorhandene Arraydeklaration mit der folgenden und kopiert noch die Funktion __RGB2BGR() in die UDF.

    Integriert in aktueller Version

    [EDIT 2]

    Danke an Zeitriss für das Aufspüren eines Fehlers. Die Ctrl mit Uhrzeit wurden neugezeichnet, auch wenn keine Zeitänderung stattfand. Ist jetzt in v0.10 gefixed.

    Der Code der UDF nur im Anhang (überschreitet die 100.000 Zeichen Grenze ;))

    Dateien

    GuiCtrlBusy[0.11].au3 100,84 kB – 628 Downloads GuiCtrlBusy[1.0].au3 111,49 kB – 514 Downloads
  • AutoIt und SQLEXPRESS 2014

    • BugFix
    • 22. September 2017 um 12:05

    Ich habe die Frage extra in das Unterforen Datenbanken verschoben, weil hier schon die Antwort in mehreren Posts zu finden ist. Einfach mal ein wenig Lesen.

  • Array 1D zu 2D

    • BugFix
    • 18. September 2017 um 18:19

    Wenn du jeweils 3 Elemente in eine Zeile (3 Spalten) des 2D-Arrays packst, berechnest du das letzte Element des 1D-Arrays, das du adressieren darfst so:

    Index für letztes Element im Array:

    Ubound($a1D) -1

    Da du in 3-er Schritten durch das Array iterierst, musst du vom letzten Index 3 Schritte zurück gehen, damit du beim Zugriff auf die Elemente (Schleifenzähler +1 / +2) nicht die Arraygrenze überschreitest. Das führt sonst zu einem Laufzeitfehler. Da wir aber die 0 als ersten Index haben (zum aktuellen Index wird für die erste Spalte 0, zweite Spalte 1 und dritte Spalte 2 addiert), müssen wir, um den letzten Index festzulegen "Schrittweite - letzter Spaltenindex" vom Ubound abziehen (war in meinem Post ein Fehler wegen schlecht aus der Hüfte gezielt von mir ;) )

    letzter adressierbarer Index:

    Ubound($a1D) -1 -2 = Ubound($a1D) -3

    Das von dir verwendete Ubound($a1D) -2 ist zwar falsch, wirft aber keinen Fehler, da dieser Index durch Step = 3 gar nicht angesprungen werden kann.

  • Array 1D zu 2D

    • BugFix
    • 18. September 2017 um 16:33

    Mal aus der Hüfte:

    AutoIt
    Local $a2D[Ubound($a1D)/3][3]
    Local $j = 0
    For $i = 0 To Ubound($a1D) -4 Step 3
        $a2D[$j][0] = $a1D[$i]
        $a2D[$j][1] = $a1D[$i+1]
        $a2D[$j][2] = $a1D[$i+2]
        $j += 1
    Next
  • Neuer Gaming-PC

    • BugFix
    • 18. September 2017 um 15:51

    Nur weil Dinge technisch möglich sind, muss es nicht sinnvoll sein. Für meinen Geschmack ist 4K völlig überdimensioniert und bringt nur bedingt Vorteil. Für Spiele mag es evtl. vertretbar sein, aber wenn ich mir vorstelle TV in 4K zu sehen, rollen sich mir die Fußnägel auf. Ich habe jetzt schon die HD-Sender wieder deaktiviert, weil ich keinen Bock habe jede Hautpore eines Moderators oder Krümelreste vom Makeup detailliert anzuschauen. :thumbdown:

  • Variabeln zusammensetzen

    • BugFix
    • 18. September 2017 um 09:15
    Zitat von Paul01

    Wenn nicht färb ich die Buttons halt einfach einfarbig, hässlich aber nunja

    Warum einfarbig? Wie wäre es mit Farbverlauf, sieht immer ganz schick aus. An dem Bsp. siehst du auch, wie du Text auf einem Bild (der Farbverlauf ist ein Picture-Ctrl.) transparent schreibst.

    Bsp. Gradient-Button
    AutoIt
    ;-- TIME_STAMP   2017-09-18 09:11:27
    #include <GUIConstantsEx.au3>
    #include <SendMessage.au3>
    #include <StaticConstants.au3>
    #include <WinAPI.au3>
    #include <WinAPIGdi.au3>
    #include <WinAPIInternals.au3>
    #include <WindowsConstants.au3>
    
    GUICreate('Test')
    
    Global $aIDBtn1 = _DrawGradientButton('Button-1', 0xFFFFFF, 10, 10, 100, 24, 0xFFFFFF, 0x000080, True)
    Global $aIDBtn2 = _DrawGradientButton('Button-2', -1, 10, 50, 100, 24, 0xFFFFFF, 0x005FF0)
    Global $aIDBtn3 = _DrawGradientButton('Button-3', 0x003380, 10, 90, 100, 24, 0xFFFFFF, 0x00FF00)
    Global $aIDBtn4 = _DrawGradientButton('Button-4', 0x003380, 10, 130, 100, 24, 0xFF0000, 0xFFFFFF, True)
    
    GUISetState(@SW_SHOW)
    
    While True
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                Exit
            Case $aIDBtn1[0]
                ConsoleWrite('Click Button-1' & @CRLF)
                GUICtrlSetData($aIDBtn1[1], GUICtrlRead($aIDBtn1[1]) = 'Button-1' ? 'Button-1_NEU' : 'Button-1')
            Case $aIDBtn2[0]
                ConsoleWrite('Click Button-2' & @CRLF)
                GUICtrlSetData($aIDBtn2[1], GUICtrlRead($aIDBtn2[1]) = 'Button-2' ? 'Button-2_NEU' : 'Button-2')
            Case $aIDBtn3[0]
                ConsoleWrite('Click Button-3' & @CRLF)
                GUICtrlSetData($aIDBtn3[1], GUICtrlRead($aIDBtn3[1]) = 'Button-3' ? 'Button-3_NEU' : 'Button-3')
            Case $aIDBtn4[0]
                ConsoleWrite('Click Button-4' & @CRLF)
                GUICtrlSetData($aIDBtn4[1], GUICtrlRead($aIDBtn4[1]) = 'Button-4' ? 'Button-4_NEU' : 'Button-4')
        EndSwitch
    WEnd
    
    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _DrawGradientButton
    ; Description ...: Draws a button with gradient color, from top to bottom (default) or from left to right
    ; Syntax ........: _DrawGradientButton($_sText, $_iTextColor, $_iLeft, $_iTop, $_iWidth, $_iHeight, $_iColTop_Left,
    ; ...............: $_iColBottom_Right[, $_bHorizontal = False])
    ; Parameters ....: $_sText              - The button text, horizontal and vertical centered.
    ; ...............: $_iTextColor         - The button text color. -1 = system color.
    ; ...............: $_iLeft              - The buttons x position.
    ; ...............: $_iTop               - The buttons y position.
    ; ...............: $_iWidth             - The buttons width.
    ; ...............: $_iHeight            - The buttons height.
    ; ...............: $_iColTop_Left       - The gradient start color (top or left).
    ; ...............: $_iColBottom_Right   - The gradient end color (bottom or right).
    ; ...............: $_bHorizontal        - [optional] "True" draws the gradient from left to right (default=False).
    ; Return values .: Array with [Button-ID,Label-ID]
    ; Note ..........: To read or change buttons text, use the Label-ID
    ; Author ........: BugFix
    ; ===============================================================================================================================
    Func _DrawGradientButton($_sText, $_iTextColor, $_iLeft, $_iTop, $_iWidth, $_iHeight, $_iColTop_Left, $_iColBottom_Right, $_bHorizontal=False)
        Local $idPic = GUICtrlCreatePic('', $_iLeft, $_iTop, $_iWidth, $_iHeight)
        Local $hCtrl = GUICtrlGetHandle($idPic)
        Local $hDC = _WinAPI_GetDC($hCtrl)
        ; zum vertikalen Zentrieren von Text auf Button: Texthöhe messen und Label zeichnen
        Local $iTextHeight = DrawTextCalc($hDC, $_sText, $_iLeft, $_iTop, $_iWidth, $_iHeight)[1]
        Local $idLabel = GUICtrlCreateLabel($_sText, $_iLeft, $_iTop+Ceiling(($_iHeight-$iTextHeight)/2), $_iWidth, $_iHeight, $SS_CENTER)
        GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
        If $_iTextColor <> -1 Then GUICtrlSetColor(-1, $_iTextColor)
        Local $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
        Local $hBitmap = _WinAPI_CreateCompatibleBitmapEx($hDC, $_iWidth, $_iHeight, _WinAPI_SwitchColor(_WinAPI_GetSysColor($COLOR_3DFACE)))
        Local $hMemSv = _WinAPI_SelectObject($hMemDC, $hBitmap)
        Local $aVertex[2][3] = [[0, 0, $_iColTop_Left], [$_iWidth, $_iHeight, $_iColBottom_Right]]
        _WinAPI_GradientFill($hMemDC, $aVertex, 0, -1, $_bHorizontal)
        _WinAPI_ReleaseDC($hCtrl, $hDC)
        _WinAPI_SelectObject($hMemDC, $hMemSv)
        _WinAPI_DeleteDC($hMemDC)
        _SendMessage($hCtrl, $STM_SETIMAGE, 0, $hBitmap)
        Local $hObj = _SendMessage($hCtrl, $STM_GETIMAGE)
        If $hObj <> $hBitmap Then _WinAPI_DeleteObject($hBitmap)
        Local $aID[2] = [$idPic,$idLabel]
        Return $aID
    EndFunc  ;==>_DrawGradientButton
    
    
    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: DrawTextCalc
    ; Description ...: Calculates the used width and heigth for text in a given context.
    ; Syntax ........: DrawTextCalc($_hDC, $_sText, $_iLeft, $_iTop, $_iWidth, $_iHeight)
    ; Parameters ....: $_hDC      Handle of Device Context.
    ; ...............: $_sText    The text.
    ; ...............: $_iLeft    Control x position.
    ; ...............: $_iTop     Control y position.
    ; ...............: $_iWidth   Control width.
    ; ...............: $_iHeight  Control heigth.
    ; Return values .: Array with [width,height]
    ; Author ........: BugFix
    ; ===============================================================================================================================
    Func DrawTextCalc($_hDC, $_sText, $_iLeft, $_iTop, $_iWidth, $_iHeight)
        Local $iLen = StringLen($_sText)
        Local $tRect = _WinAPI_CreateRectEx($_iLeft, $_iTop, $_iWidth, $_iHeight)
        Local $tText = DllStructCreate("char[" & $iLen & "]")
        DllStructSetData($tText, 1, $_sText)
        Local $aRet = DllCall("user32.dll", "int", "DrawText", "hwnd", $_hDC, "ptr", DllStructGetPtr($tText), "int", $iLen, _
            "ptr", DllStructGetPtr($tRect), "int", BitOr(256,1,16,1024)) ; $DT_NOCLIP,$DT_CENTER,$DT_WORDBREAK,$DT_CALCRECT
        Local $aTextMeasure[2] = [DllStructGetData($tRect, 3)-DllStructGetData($tRect, 1), $aRet[0]] ; [width,height]
        $tRect = 0
        $tText    = 0
        Return $aTextMeasure
    EndFunc  ;==>DrawTextCalc
    Alles anzeigen
  • Variabeln zusammensetzen

    • BugFix
    • 15. September 2017 um 09:15
    Zitat von alpines

    Und hier den Vergleich zu ziehen, das die Indexvariante schneller ist finde ich ehrlich gesagt mehr als nur lächerlich, es handelt sich um eine einzige Frage.

    Ist für diese Anwendung sicher völlig richtig. Aber ich denke, man sollte ruhig versuchen auch bei simplen Dingen nach den solchen Lösungen zu schauen, um sie parat zu haben, wenn es wirklich not tut.

    Zitat von alpines

    Ich finde die Variante ohne Index besser, weil man ein saubereres Array hat und einfach es durchgehen kann.

    Genau das hast du doch mit der Indexvariante:

    AutoIt
    Opt('GUIOnEventMode', 1)
    
    Global $aQA[15][6] = [ _
    ['Frage1',2,'Antwort_1','Antwort_2','Antwort_3','Antwort_4'], _
    ['Frage2',5,'Antwort_1','Antwort_2','Antwort_3','Antwort_4'] _
    ]
    
    Global $aAnswerButton[4]
    Global $iQuestionIndex = 0 ; erste Frage, nach jeder Antwort hochsetzen
    
    GUICreate('WWM', 600, 400)
    GUISetOnEvent(-3, '_exit')
    $idQuestion = GUICtrlCreateInput('', 10, 10, 410)
    $aAnswerButton[0] = GUICtrlCreateButton('', 10, 50, 200, 30)
    $aAnswerButton[1] = GUICtrlCreateButton('', 210, 50, 200, 30)
    $aAnswerButton[2] = GUICtrlCreateButton('', 10, 90, 200, 30)
    $aAnswerButton[3] = GUICtrlCreateButton('', 210, 90, 200, 30)
    
    For $i = 0 To 3
        GUICtrlSetOnEvent($aAnswerButton[$i], '_AnswerClick')
    Next
    
    GUISetState()
    
    _SetQuestion()
    
    While True
        Sleep(10)
    WEnd
    
    Func _exit()
        Exit
    EndFunc
    
    Func _SetQuestion()
        Local $iIndexOld = $iQuestionIndex
        If $iIndexOld = UBound($aQA) Then Return ; alle Fragen durch
        GUICtrlSetData($idQuestion, $aQA[$iQuestionIndex][0])
        For $i = 0 To 3
            GUICtrlSetData($aAnswerButton[$i], $aQA[$iQuestionIndex][$i+2])
        Next
        While $iIndexOld = $iQuestionIndex
            Sleep(10)
        WEnd
        _SetQuestion()
    EndFunc
    
    
    Func _AnswerClick()
        Local $iAnswerIndex
        For $i = 0 To 3
            If @GUI_CtrlId = $aAnswerButton[$i] Then
                $iAnswerIndex = $i +2
                If $aQA[$iQuestionIndex][1] = $iAnswerIndex Then
                    $iQuestionIndex +=1
                MsgBox(0, 'Antwort', 'RICHTIG')
                    Return True
                Else
                    $iQuestionIndex +=1
                MsgBox(0, 'Antwort', 'FALSCH')
                    Return False
                EndIf
            EndIf
        Next
    EndFunc
    Alles anzeigen
  • Variabeln zusammensetzen

    • BugFix
    • 15. September 2017 um 08:49
    Zitat von alpines

    Nimm einfach als ersten Index die Frage und als zweiten die dazugehörige Antwort.

    Dann kannst du beim Anzeigen der Fragen die Fragen zufällig am "Spielfeld" anzeigen

    Kann man machen. Dann musst du beim Anzeigen der Antwortmöglichkeiten deren Reihenfolge trotzdem durchwürfeln und dir dort merken, wo du die richtige Antwort hinterlegt hast. Da ist es wesentlich performanter, bereits in der Vorlage den Antwortmix zu haben und den Index zur richtigen Antwort zu speichern. Du vergleichst ja nicht den Antworttext, sondern den Antwort-Index, geht etwas flotter von der Hand.

  • Variabeln zusammensetzen

    • BugFix
    • 15. September 2017 um 08:41

    Ich würde Fragen und Antworten in einem Array verwalten und ebenfalls den SubIndex für die richtige Antwort, etwa so:

    AutoIt
    ; Frage-Nr. = ArrayIndex +1
    ; Richtige Antwort = 'SubIndex_wahr' (2/3/4/5)
    
    Global $aQA[15][6] = [ _
    ['Frage','SubIndex_wahr','Antwort_1','Antwort_2','Antwort_3','Antwort_4'], _
    ['Frage','SubIndex_wahr','Antwort_1','Antwort_2','Antwort_3','Antwort_4'], _
    ...
    ]

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™