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.
Beiträge von BugFix
-
-
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.
-
Und manchmal machen die auch einfach riesen Sprünge.
IDS_PROPITEM_TXT_001008 ItemnameIDS_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.
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)
-
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?
-
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.
-
Na dann walte ich mal meines Amtes. [CLOSED]
-
Also ich hab dir mal eine, wie ich finde, recht flotte Variante erstellt: Parsen und Listview befüllen < 2 Sekunden.
AutoIt
Alles anzeigen#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 -
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.
-
Muss es zwingend 7Zip sein? Ansonsten kannst du die in Windows integrierte ZIP-Funktion nutzen: ZIP - Packen / Entpacken mit Windows eigener Funktion
-
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.
-
Ja unzoLEET, mal Butter bei die Fische, was du tatsächlich vorhast. Es hat bisher, wie man im Ländle sagt, ein "Geschmäckle".
-
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
Alles anzeigen#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 EndFuncMit 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
) -
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.
-
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.
-
-
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.

-
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
Alles anzeigen;-- 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 -
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.
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
Alles anzeigenOpt('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 -
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.
-
Ich würde Fragen und Antworten in einem Array verwalten und ebenfalls den SubIndex für die richtige Antwort, etwa so: