Schau mal in Post5.
Dort ists richtig deklariert.
Beiträge von nuts
-
-
Ja habs auch grad bemerkt.
Endweder man ist auf dem Input oder auf dem Button.Also "irgendwie" die Entertaste abfangen und entsprechend auf den Fokus reagieren.
Danke an alle Beteiligten.
P.S. Welche Message das Inputcontrol empfangsbreit macht wäre trotzdem ganz interessant.
-
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <EditConstants.au3>
#include <StructureConstants.au3>
#include <WinAPI.au3>Global $eventCount = 0
[/autoit] [autoit][/autoit] [autoit]
$sHeader = "Input1|Input2|Input3"
Global $hGui = GUICreate("", 400, 400, -1, -1)
Global $hButton = GUICtrlCreateButton('Test', 10, 10, 100, 20)
Global $aHeader = StringSplit($sHeader, '|') ; Überschriften-Array
Global $aNew[$aHeader[0]] ; Array für die Input-IDs
Global $aInputWidth[$aHeader[0]] = [100, 100, 100] ; hier die Länge (in Pixel) der Inputfelder eintragen
Global $xPos = 20
For $i = 1 To $aHeader[0]
GUICtrlCreateLabel($aHeader[$i], $xPos + 2, 200, 110, 20) ; Überschriften-Label erstellen
GUICtrlSetFont(-1, 8, 400, 0, 'Verdana') ; Schriftgröße und -art der Überschriften festlegen
$aNew[$i - 1] = GUICtrlCreateInput("", $xPos, 220, $aInputWidth[$i - 1], 20, Default, $WS_EX_STATICEDGE) ; Eingabefelder erstellen
GUICtrlSetFont(-1, 10, 600, 0, 'Verdana') ; Schriftgröße und -art der Eingabefelder festlegen
$xPos += $aInputWidth[$i - 1] + 5
NextGUISetState(@SW_SHOW, $hGui)
[/autoit] [autoit][/autoit] [autoit]
GUIRegisterMsg($WM_Command, "WM_COMMAND")While 1
[/autoit] [autoit][/autoit] [autoit]
$nMsg = GUIGetMsg(1) ; Message-Event holen (1) = erweiterter ModusSwitch $nMsg[0] ; anhand der Control-ID das entsprechende Case aufrufen
[/autoit] [autoit][/autoit] [autoit]
Case $aNew[0]
GUICtrlSetState($aNew[1], $GUI_FOCUS)
#Region Schließen
Case $GUI_EVENT_CLOSE ; User hat auf das Schließen-Symbol geklickt (bzw. die ESC-Taste gedrückt)
Switch $nMsg[1] ; erweiterte Abfrage für welches Fenster
Case $hGui ; User will das Hauptfenster schließen
ExitEndSwitch
[/autoit] [autoit][/autoit] [autoit]#EndRegion Schließen
[/autoit] [autoit][/autoit] [autoit]
EndSwitchWEnd
[/autoit] [autoit][/autoit] [autoit]Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
[/autoit] [autoit][/autoit] [autoit]
Local $hwndFrom, $iIDFrom, $iCode
$iIDFrom = BitAND($iwParam, 0xFFFF) ; Low Word
$iCode = BitShift($iwParam, 16) ; Hi Word
If $iCode = 0 Then
Send('{TAB}')
If ControlGetFocus($hGui) = 'Edit3' Then Send('{TAB}')
MsgBox(1, "", "Enter")
Return 1
EndIf
;~ Switch $iIDFrom
;~ case $anew[0]
;~ switch $iCode
;~ case 0
;~ GUICtrlSetState($aNew[1], $GUI_FOCUS)
;~ EndSwitch
;~ case $anew[1]
;~ switch $icode
;~ case 0
;~ GUICtrlSetState($aNew[2], $GUI_FOCUS)
;~ EndSwitch
;~ case $anew[2]
;~ switch $iCode
;~ case 0
;~ GUICtrlSetState($aNew[0], $GUI_FOCUS)
;~ EndSwitch;~ EndSwitch
[/autoit]
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND
Hab mal eine msgbox eingefügt um das Problem damit zu verdeutlichen.Über den Fokus müsste sich aber wirklich was machen lassen.
In WM_Command den Fokus bestimmten und in Abjängigkeit vom Fokus reagieren.Die zweite Möglichkeit: Man findet heraus was die Inputfelder für eine Nachricht erhalten nachdem etwas eingegeben wurde und schickt dieses Nachricht via GUICtrlSendMsg hinterher.
Irgendwie krieg ichs aber nicht raus.
edit \
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <EditConstants.au3>
#include <StructureConstants.au3>
#include <WinAPI.au3>Global $eventCount = 0
[/autoit] [autoit][/autoit] [autoit]
$sHeader = "Input1|Input2|Input3"
Global $hGui = GUICreate("", 400, 400, -1, -1)
Global $aHeader = StringSplit($sHeader, '|') ; Überschriften-Array
Global $aNew[$aHeader[0]]
Global $haNew[$aHeader[0]]
Global $aInputWidth[$aHeader[0]] = [100, 100, 100] ; hier die Länge (in Pixel) der Inputfelder eintragen
Global $xPos = 20
For $i = 1 To $aHeader[0]
GUICtrlCreateLabel($aHeader[$i], $xPos + 2,200, 110, 20) ; Überschriften-Label erstellen
GUICtrlSetFont(-1, 8, 400, 0, 'Verdana') ; Schriftgröße und -art der Überschriften festlegen
$aNew[$i - 1] = GUICtrlCreateInput("", $xPos, 220, $aInputWidth[$i - 1], 20,Default, $WS_EX_STATICEDGE) ; Eingabefelder erstellen
GUICtrlSetFont(-1, 10, 600, 0, 'Verdana') ; Schriftgröße und -art der Eingabefelder festlegen
$hanew[$i-1] = GUICtrlGetHandle($aNew[$i - 1])
$xPos += $aInputWidth[$i - 1] + 5
NextGUISetState(@SW_SHOW, $hGui)
[/autoit] [autoit][/autoit] [autoit]
GUIRegisterMsg($WM_Command ,"WM_COMMAND")While 1
[/autoit] [autoit][/autoit] [autoit]
$nMsg = GUIGetMsg(1) ; Message-Event holen (1) = erweiterter ModusSwitch $nMsg[0] ; anhand der Control-ID das entsprechende Case aufrufen
[/autoit] [autoit][/autoit] [autoit]
case $anew[0]
GUICtrlSetState($aNew[1], $GUI_FOCUS)
#Region Schließen
Case $GUI_EVENT_CLOSE ; User hat auf das Schließen-Symbol geklickt (bzw. die ESC-Taste gedrückt)
Switch $nMsg[1] ; erweiterte Abfrage für welches Fenster
Case $hGui ; User will das Hauptfenster schließen
exitEndSwitch
[/autoit] [autoit][/autoit] [autoit]#EndRegion Schließen
[/autoit] [autoit][/autoit] [autoit]
EndSwitchWEnd
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
[/autoit] [autoit][/autoit] [autoit]
;ConsoleWrite($hWnd & @tab & $iMsg & @tab & $iwParam & @tab & $ilParam& @CRLF)
Local $hwndFrom, $iIDFrom, $iCode, $fokus
;$iIDFrom = BitAND($iwParam, 0xFFFF) ; Low Word
$iCode = BitShift($iwParam, 16) ; Hi Word
$fokus = _WinAPI_GetFocus()
Switch $fokus
case $hanew[0]
switch $iCode
case 0
;GUICtrlRecvMsg($anew[1],$NM_KEYDOWN)
GUICtrlSetState($aNew[1], $GUI_FOCUS)
;GUICtrlSendMsg($anew[1],$NM_KEYDOWN, -1,0)
EndSwitch
case $hanew[1]
switch $icode
case 0
GUICtrlSetState($aNew[2], $GUI_FOCUS)
EndSwitch
case $hanew[2]
switch $iCode
case 0
GUICtrlSetState($aNew[0], $GUI_FOCUS)
EndSwitchEndSwitch
[/autoit]
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND
Eine Möglichkeit über den Fokus. -
Alternativ das Ergebnis Array mit der maximalen Anzahl deklarieren und am Ende zurecht "Redimen".
-
Ah das hätte ich dazuschreiben müssen, sorry.
Hotkeyset, _Ispressed und $BS_DEFPUSHBUTTON kenne ich schon
Bei $BS_DEFPUSHBUTTON gibt teilweise Problem, wenn ein anderer Button den Fokus hat.
Schaus mir aber nochmal an, bei einer Erfassungsmaske kann man damit vielleicht leben. -
Klaro, mir ist nur nicht so klar was dir Probleme bereitet.
Die Vorgehensweise oder die Umsetzung in Autoit?Ein Beispiel wie man eine Ini einliest, jeden Eintrag durchgeht, der Vergleich mit den ausgeschlossenen Usern?
Man könnte auch sein Skript bis zum unklaren Vorgang posten.

-
Schon wieder ein Input <-> Output Problem

Die Sektion [ADMIN_MEMBER] in ein Array einlesen (Inireadsection).
Das Array durcharbeiten (for ... next) und jeden Eintrag mit den ausgeschlossenen Usern vergleichen (if ... then ... else).Bist doch jetzt Profi

-
Hey,
folgendes Problem:
Bei einer Erfassungsmaske (hauptsächlich für Zahlen) soll man immer mit der Enter-Taste (bzw. Num-Enter) zum nächsten Feld springen können.
Das funktioniert auch grudnsätzlich:Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <EditConstants.au3>
#include <StructureConstants.au3>
#include <WinAPI.au3>Global $eventCount = 0
[/autoit] [autoit][/autoit] [autoit]
$sHeader = "Input1|Input2|Input3"
Global $hGui = GUICreate("", 400, 400, -1, -1)
Global $aHeader = StringSplit($sHeader, '|') ; Überschriften-Array
Global $aNew[$aHeader[0]] ; Array für die Input-IDs
Global $aInputWidth[$aHeader[0]] = [100, 100, 100] ; hier die Länge (in Pixel) der Inputfelder eintragen
Global $xPos = 20
For $i = 1 To $aHeader[0]
GUICtrlCreateLabel($aHeader[$i], $xPos + 2,200, 110, 20) ; Überschriften-Label erstellen
GUICtrlSetFont(-1, 8, 400, 0, 'Verdana') ; Schriftgröße und -art der Überschriften festlegen
$aNew[$i - 1] = GUICtrlCreateInput("", $xPos, 220, $aInputWidth[$i - 1], 20,Default, $WS_EX_STATICEDGE) ; Eingabefelder erstellen
GUICtrlSetFont(-1, 10, 600, 0, 'Verdana') ; Schriftgröße und -art der Eingabefelder festlegen
$xPos += $aInputWidth[$i - 1] + 5
NextGUISetState(@SW_SHOW, $hGui)
[/autoit] [autoit][/autoit] [autoit]
GUIRegisterMsg($WM_Command ,"WM_COMMAND")While 1
[/autoit] [autoit][/autoit] [autoit]
$nMsg = GUIGetMsg(1) ; Message-Event holen (1) = erweiterter ModusSwitch $nMsg[0] ; anhand der Control-ID das entsprechende Case aufrufen
[/autoit] [autoit][/autoit] [autoit]
case $anew[0]
GUICtrlSetState($aNew[1], $GUI_FOCUS)
#Region Schließen
Case $GUI_EVENT_CLOSE ; User hat auf das Schließen-Symbol geklickt (bzw. die ESC-Taste gedrückt)
Switch $nMsg[1] ; erweiterte Abfrage für welches Fenster
Case $hGui ; User will das Hauptfenster schließen
exitEndSwitch
[/autoit] [autoit][/autoit] [autoit]#EndRegion Schließen
[/autoit] [autoit][/autoit] [autoit]
EndSwitchWEnd
[/autoit] [autoit][/autoit] [autoit]Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
[/autoit] [autoit][/autoit] [autoit]
Local $hwndFrom, $iIDFrom, $iCode
$iIDFrom = BitAND($iwParam, 0xFFFF) ; Low Word
$iCode = BitShift($iwParam, 16) ; Hi Word
Switch $iIDFrom
case $anew[0]
switch $iCode
case 0
GUICtrlSetState($aNew[1], $GUI_FOCUS)
EndSwitch
case $anew[1]
switch $icode
case 0
GUICtrlSetState($aNew[2], $GUI_FOCUS)
EndSwitch
case $anew[2]
switch $iCode
case 0
GUICtrlSetState($aNew[0], $GUI_FOCUS)
EndSwitchEndSwitch
[/autoit]
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND
Allerdings gibt es in meinem Fall auch einige Felder, die nicht jedes mal befüllt/geändert werden müssen.
WM_Command reagiert aber leider nur nachdem im Input etwas erfasst wurde
Gibts einen Trick das zu umgehen?Gruß nuts
-
Wie ojo schon gefragt hat: "Wo kommt dein $i her"? (Zeile 5)
Den Index vom ausgewählten Item bekommst du über _GUICtrlListView_GetSelectedIndices
-
Es geht doch um folgendes:
Gegeben ist eine Datenmenge (.ini, .txt, sql Datenbank, Array -> erstmal egal).
1. Datenmenge einlesen (in ein Array, Zeile für Zeile als Variable usw.)
2. Datenmenge grafisch darstellen -> Überlegung: Welches Gui-Control eignet sich dafür?
3. Datenmenge weiterverarbeiten -> Überlegung: Wie komme ich an die grafisch dargestellten Informationen?
4. Die erhaltenen Informationen an die entsprechenden Funktionen übergeben, Rückgabewerte weiterverarbeiten usw.Danach kommt der Feinschliff, dabei kann man dann auch gut, gezielt helfen.
-
Nun läufts
Das Hinzufügen ist leider nichtmehr besonders schnell.
Schuld ist wie erwähnt die _SoundLenght Funktion.edit \
Hab hier was gefunden:Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
$file = FileOpenDialog("Please select file", "", "MP3 files (*.mp3)");
if @error then Exit
$aData = _GetMP3Info($file)
if @error then Exit
$aLabel = StringSplit("MPEG Version: |Layer: |Bitrate: |Frequency: |Channel Mode: |Have CRC: |Copyright: |Original: ", "|")
Dim $out = ""
for $i = 0 to UBound($aData)-1
$out = $out & $aLabel[$i+1] & $aData[$i] & @CR
next
MsgBox (0, "MP3 Data", $out);===============================================================================
[/autoit] [autoit][/autoit] [autoit]
;
; Description: Retrieve MP3 basic information
; Parameter(s): File name
; Requirement(s): None
; Return Value(s): On Success - array with data:
; 0 - MPEG version
; 1 - Layer
; 2 - Bitrate
; 3 - Frequency
; 4 - Channel Mode
; 5 - CRC protected
; 6 - Copyrighted
; 7 - Original
; On Failure empty string and sets @ERROR:
; 1 - Info not found
; Author(s): YDY (Kot) <[email='mpc@nm.ru'][/email]>
; Version: 1.0.00
; Date: 22.08.2004
; Note(s): None
;
;===============================================================================Func _GetMP3Info($file)
[/autoit] [autoit][/autoit] [autoit]
Local $frame = "", $data[8], $offset = 1, $isVBR = 0
Local $aVersion = StringSplit("MPEG 2.5|Undefined|MPEG 2.5|MPEG 1", "|")
Local $aLayer = StringSplit("Undefined|Layer III|Layer II|Layer I", "|")
Local $sBitrate = ""
Local $sFrequency = ""
Local $aChanMode = StringSplit("Stereo|Joint stereo|Dual channel|Mono", "|")
Local $aFlags = StringSplit("No|Yes", "|")If _FileReadAtOffsetHEX ($file, 1, 3) = "494433" Then; ID3v2 tag found
[/autoit] [autoit][/autoit] [autoit]
$offset = BitShift(Dec(_FileReadAtOffsetHEX ($file, 7, 4)), 1); End of ID3v2 tag
EndifFor $ic = $offset to 2048 + $offset
[/autoit] [autoit][/autoit] [autoit]
$marker = _FileReadAtOffsetHEX ($file, $ic, 2)
$marker = StringLeft($marker, 3)
If StringInStr("FFF,FFE", $marker) Then; Assume that is frame start
$frame = _FileReadAtOffsetHEX ($file, $ic, 4)
If _FileReadAtOffsetHEX ($file, $ic+36, 4) = "58696E67" Then $isVBR = 1; This is a right way?..
Exitloop
Endif
NextIf $frame = "" Then
[/autoit] [autoit][/autoit] [autoit]
SetError(1); Frame not found (not mp3 data?)
Return ("")
EndifLocal $head = _HexToBin($frame)
[/autoit] [autoit][/autoit] [autoit]
Local $nVer = _GetRBits($head, 19, 2)
Local $nLay = _GetRBits($head, 17, 2)Select
[/autoit] [autoit][/autoit] [autoit]
Case $nVer = 3
$sFrequency = "44100|48000|32000|Undefined"
Case $nVer = 2
$sFrequency = "22050|24000|16000|Undefined"
Case $nVer = 0
$sFrequency = "11025|12000|8000|Undefined"
EndSelect
Local $aFrequency = StringSplit($sFrequency, "|")If $isVBR Then
[/autoit] [autoit][/autoit] [autoit]
$data[2] = "Variable"
Else
Select
Case $nVer = 3 and $nLay = 3
$sBitrate = "Free|32|64|96|128|160|192|224|256|288|320|352|384|416|448|Undefined"
Case $nVer = 3 and $nLay = 2
$sBitrate = "Free|32|48|56|64|80|96|112|128|160|192|224|256|320|384|Undefined"
Case $nVer = 3 and $nLay = 1
$sBitrate = "Free|32|40|48|56|64|80|96|112|128|160|192|224|256|320|Undefined"
Case $nVer = 2 and $nLay = 3
$sBitrate = "Free|32|48|56|64|80|96|112|128|144|160|176|192|224|256|Undefined"
Case ($nVer = 2 and $nLay = 2) or ($nVer = 2 and $nLay = 1)
$sBitrate = "Free|8|16|24|32|40|48|56|64|80|96|112|128|144|160|Undefined"
EndSelect
Local $aBitrate = StringSplit($sBitrate, "|")
$data[2] = _GetData($aBitrate, _GetRBits($head, 12, 4))
Endif$data[0] = _GetData($aVersion, $nVer)
[/autoit] [autoit][/autoit] [autoit]
$data[1] = _GetData($aLayer, $nLay)
$data[3] = _GetData($aFrequency, _GetRBits($head, 10, 2))
$data[4] = _GetData($aChanMode, _GetRBits($head, 6, 2))
$data[5] = _GetData($aFlags, not _GetRBits($head, 16, 1)); CRC
$data[6] = _GetData($aFlags, _GetRBits($head, 3, 1)); Private
$data[7] = _GetData($aFlags, _GetRBits($head, 2, 1)); Original
Return($data)
EndFuncFunc _GetRBits($str, $pos, $size)
[/autoit] [autoit][/autoit] [autoit]
Local $ic, $res = 0, $bStr = StringMid($str, 33 - $pos - $size, $size)
For $ic = 0 to $size-1
If StringMid($bStr, $size-$ic, 1) == "1" Then $res = $res + 2^$ic
Next
Return ($res)
EndFuncFunc _GetData(ByRef $array, $val)
[/autoit] [autoit][/autoit] [autoit]
If $val > UBound($array)-1 Then Return("Undefined")
Return ($array[$val+1])
EndFuncFunc _HexToBin($str)
[/autoit] [autoit][/autoit] [autoit]
Local $res=""
While StringLen($str) > 0
$val = Dec(StringLeft($str, 1))
$str = StringTrimLeft($str, 1)
For $i = 3 to 0 Step -1
$pw = 2^$i
If $val - $pw < 0 Then
$res = $res & "0"
Else
$res = $res & "1"
$val = $val - $pw
Endif
Next
Wend
Return ($res)
EndFuncFunc _FileReadAtOffsetHEX ($file, $offset, $bytes)
[/autoit]
Local $tfile = FileOpen($file, 0)
Local $tstr = ""
FileRead($tfile, $offset-1)
For $i = $offset To $offset + $bytes - 1
$tstr = $tstr & Hex(Asc(FileRead($tfile, 1)), 2)
Next
FileClose($tfile)
Return ($tstr)
Endfunc
Leider gibt es scheinbar auch viele .mp3's mit variabler Bitrate.
Wäre mal interessant wie winamp das macht, allerdings dauert es dort ja auch etwas um mehrere Dateien hinzuzufügen. -
Naja das ist aber relativ unsinnig, schließlich können die Funktionen unterschiedlich lang dauern.
Wie man Zeilen im Skript automatisch zählt weiss ich nicht, du kannst aber ja eine lokale Variable mit der Anzahl der Funktionen festlegen ($count = 5).
Nach jeder Funktion veränderst du dann den Progress mit dem Kehrwert (1/5). -
Mal ehrlich - würdest du das verstehen?

Also deine Funktion hat X Wiederholungen (for .. next?) und nach jeder Wiederholung soll der Progress verändert werden?
-
Hab kein Wort verstanden.

-
Also Winamp schaffts.
Wird die Laufzeit überhaupt zwangsläufig mitgespeichert?
Könnte man ja auch errechnen (Bitrate, Gesamtgröße). -
An gar keiner Stelle.

-
Seltsam, bei mir wird gemeckert (ERROR: AdlibDisable(): undefined function.).
Naja wie auch immer, liegt vielleicht an Scite?
@Arrayfehler:
Tritt in der .exe und dem Skript auf (egal wie hinzugefügt).
Zeile 524 ist der Übeltäter.Datei: mp3
Bitrate: ka
ID3Tags: wohl keine (bin nicht so der mp3 Profi)
OS: WinXP-> kein Eintrag in Duration -> kein Text vom Subitem
[autoit]
Stringsplit gibt dann trotzdem ein Array zurück und die Isarray -Abfrage verfehlt den Sinn.
[/autoit]
$string = ""
$astring = StringSplit($string, ":")
If IsArray($astring) then
MsgBox(1, "", "Array gefunden")
else
MsgBox(1, "", "Kein Array :(")
endifWürde ich mal behaupten, zu so später Stunde.
-
Hey,
Leider kommt der übliche Arrayfehler sobald man eine Musikdatei hinzufügt.
Außerdem sind beim Source Beta und Stable Funktionen gemischt?
AdlibRegister, AdlibDisable usw.Das Design ist aber cool

-
Also ehrlich gesagt, verstehe ich Dein Script nicht wirklich.
Ähm ja.
Ich dachte du versuchst eine Datei binär einzulesen, immer eine bestimmte Abfolge in dein Format wegzuspeichern und die Trennmarke in einem Header festzuhalten? -
@error sollte/muss direkt unter die Funktion.