öhhhm - alle Städte liegen an einem Fluß/Bach/Wasserlauf?
Beiträge von BugFix
-
-
Du kannst außer Schleifen und erzwungenermaßen mehrzeiligen Statements alles in AutoIt in einer Zeile ausführen. Z.B. indem du eine fortlaufende Variablendeklaration durchführst mit den Funktionen, die du aufrufst:
[autoit]
[/autoit]
Global $a = InputBox(...Eingabe Zahl...), $b = InputBox(...Eingabe Zahl...), $c = $a + $b, $d = $a * $b, $gui = GuiCreate(..), $button = GuiCtrlCreateButton(..), ;....... usw. usf. -
Oder so:
[autoit]$s = "54°31.267'N 012°42.852'E"
[/autoit]
$rep = StringRegExpReplace($s, "(\d+)°(\d+\.\d+)'N (\d+)°(\d+\.\d+)'E", "N$1 $2" & @LF & "E$3 $4")
ConsoleWrite($rep & @crlf) -
Neue Version 0.10!
- Anhand von (Teil-)Begriffen aus den Variablentipps läßt sich nach Variablen suchen.
- Alle Variablen, in deren Beschreibung eine Übereinstimmung mit dem Suchbegriff gefunden wurde, werden mit Beschreibung in die Konsole oder in eine Userliste zur Auswahl ausgegeben
Näheres s. Post #1 -
Bischen Suchen hilft immer: ChooseHotKey UDF oder HotKey Control UDF
..und noch eins: HotKey Input UDF -
Wenn ich dich recht verstehe, willst du wissen, welche Item markiert sind und diese als kommagetrennten String ausgeben.
Einfach so:
[autoit]Global $array[5] = [4,'alpha','beta','gamma','delta']
[/autoit][autoit][/autoit][autoit]GUICreate("Kategorie", 220, 300, 200, 250)
[/autoit][autoit][/autoit][autoit]$listview = GUICtrlCreateListView("Kategorie 1", 10, 10, 200, 200, $LVS_SORTASCENDING, $LVS_EX_CHECKBOXES)
[/autoit][autoit][/autoit][autoit]
$hLV = GUICtrlGetHandle($listview)
$button = GUICtrlCreateButton("Auswählen", 75, 250, 70, 20)
For $item = 1 To $array[0]
$content = GUICtrlCreateListViewItem($array[$item], $listview)
Next
GUISetState()Do
[/autoit]
$msg = GUIGetMsg()
Select
Case $msg = $button
$sChecked = ''
For $i = 0 To _GUICtrlListView_GetItemCount($hLV) -1
If _GUICtrlListView_GetItemChecked($hLV, $i) Then $sChecked &= _GUICtrlListView_GetItemText($hLV, $i) & ', '
Next
ConsoleWrite( 'Ausgewählt: ' & StringTrimRight($sChecked, 2) & @LF)
EndSelect
Until $msg = $GUI_EVENT_CLOSE
Exit -
-
Bitte poste keine EXE-Dateien, nur die au3-Datei gehört hierher.
Hab mich schon gewundert, was das für ein riesen Skript sein soll mit 400 KB - dabei ist dein Skript tatsächlich nur 3 KB groß. Den Rest bringt die kompilierte Datei.Also 200 Zeilen Code kannst du auch getrost im Spoiler anzeigen lassen, dann braucht man nicht extra downloaden um sich das anzusehen.
-
Und wozu willst du da mit mehreren Funktionen rumgurken?
[autoit]
Das, was du soeben geschildert hast, kannst du doch mit einer Funktion erledigen:#include <GuiListView.au3>
[/autoit][autoit][/autoit][autoit]
#include <Array.au3>$Mein_Ergebnis = _GetPathes()
[/autoit][autoit][/autoit][autoit]
_ArrayDisplay($Mein_Ergebnis)Func _GetPathes()
[/autoit]
Local $Gui = GUICreate('Auswahl', 365, 390)
GUICtrlCreateLabel('Bitte erforderliche Dateien auswählen', 10, 10)
Local $LV = GuiCtrlCreateListView('Ausgewählt', 10, 30, 250, 350)
Local $btSelect = GUICtrlCreateButton('Hinzufügen', 275, 30, 80, 22)
Local $sPath, $hLV = GUICtrlGetHandle($LV)
_GUICtrlListView_SetColumnWidth($hLV, 0, $LVSCW_AUTOSIZE_USEHEADER)
GUISetState(@SW_SHOW, $Gui)
While True
Switch GUIGetMsg()
Case -3
GUISetState(@SW_HIDE, $Gui)
ExitLoop
Case $btSelect
$sPath = FileOpenDialog('Datei auswählen', "::{450D8FBA-AD25-11D0-98A8-0800361B1103}", '(*.*)', 3)
If Not @error Then
GUICtrlCreateListViewItem($sPath, $LV)
EndIf
EndSwitch
WEnd
If _GUICtrlListView_GetItemCount($hLV) = 0 Then Return ''
$sPath = ''
For $i = 0 To _GUICtrlListView_GetItemCount($hLV) -1
$sPath &= _GUICtrlListView_GetItemText($hLV, $i) & '|'
Next
GUIDelete($Gui)
Return StringSplit(StringTrimRight($sPath, 1), '|')
EndFunc -
Wird n regedit
nur besser^^
Dann versuch aber keinesfalls beim Aufruf sofort alle Schlüssel in ein Array zu lesen, sonst kannst du getrost Kaffee trinken gehen. Dynamisch Nachladen ist hier wohl angezeigt.
-
Danke!
Manchmal fallen einem die einfachsten Dinge nicht ein. -
Hi,
folgendes Problem:
Auf einer Main-Gui blende ich ein Child ein. Jedoch sind dann die Events (MausUp/Down) nicht mehr verfügbar.
Der Button hat mehrere, zeitgesteuerte Funktionen. Beschreibung auf GUI unter dem Button.
Hat jemand vielleicht eine Idee, wie ich das Problem lösen kann?Hier der Code, beschränkt auf die Problemsituation:
Spoiler anzeigen
[autoit]#include <GuiConstants.au3>
[/autoit] [autoit][/autoit] [autoit]Opt('GUIOnEventMode', 1)
[/autoit] [autoit][/autoit] [autoit]
Opt('MustDeclareVars', 1)Global $Gui0, $btStartStop, $lbSnooze, $aChild[2] = [1]
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Global $TimerStart, $iTime, $EngineRun = 0, $iSnooze = 0_Create_Gui_0()
[/autoit] [autoit][/autoit] [autoit]
_CreateChild($aChild[1])
GUISetState(@SW_SHOW, $Gui0)
;~ GUISetState(@SW_SHOWNOACTIVATE, $aChild[1]) ; <=== Sowie das Child angezeigt wird, werden die Events ($GUI_EVENT_PRIMARYDOWN & $GUI_EVENT_PRIMARYUP) nicht mehr erkanntWhile 1
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Sleep(50)
WEndFunc _Create_Gui_0()
[/autoit] [autoit][/autoit] [autoit]
$Gui0 = GUICreate('Engine OFF', 400, 450)
$lbSnooze = GUICtrlCreateLabel('SNOOZE', 280, 150)
GUICtrlSetState(-1, $GUI_HIDE)
$btStartStop = GUICtrlCreateButton('0 / I', 90, 280, 210, 25)GUICtrlCreateLabel('Button 1,5 sec gedrückt halten für Start / Stopp.' & @LF & 'Wenn gestartet mit kurzem Druck "SNOOZE" de/aktivieren.', 50, 310)
[/autoit] [autoit][/autoit] [autoit]; == Events
[/autoit] [autoit][/autoit] [autoit]
GUISetOnEvent(-3, '_close_Gui0', $Gui0)
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, '_MDown', $Gui0)
GUISetOnEvent($GUI_EVENT_PRIMARYUP, '_MUp', $Gui0)
EndFunc ;==>_Create_Gui_0Func _CreateChild(ByRef $_hWnd)
[/autoit] [autoit][/autoit] [autoit]
$_hWnd = GUICreate('', 254, 130, 70, 60, 0x80000000, 0x00000040, $Gui0) ; WS_POPUP = 0x80000000, WS_EX_MDICHILD = 0x00000040
GUISetBkColor(0x06A533, $_hWnd)
EndFunc ;==>_CreateChildFunc _MDown()
[/autoit] [autoit][/autoit] [autoit]
Local $aInfo = GUIGetCursorInfo()
If Not IsArray($aInfo) Then Return
If $aInfo[4] = $btStartStop Then
$TimerStart = TimerInit()
AdlibRegister('_StartEngine')
EndIf
EndFunc ;==>_MDownFunc _MUp()
[/autoit] [autoit][/autoit] [autoit]
Local $aInfo = GUIGetCursorInfo()
If Not IsArray($aInfo) Then Return
Local $iState = $GUI_SHOW
If $aInfo[4] = $btStartStop Then
If $iTime <= 400 And $EngineRun = 1 Then
If $iSnooze = 0 Then
$iSnooze = 1
Else
$iState = $GUI_HIDE
$iSnooze = 0
EndIf
GUICtrlSetState($lbSnooze, $iState)
AdlibUnRegister('_StartEngine')
ElseIf $iTime <= 1500 And $EngineRun = 0 Then
AdlibUnRegister('_StartEngine')
EndIf
EndIf
EndFunc ;==>_MUpFunc _StartEngine()
[/autoit] [autoit][/autoit] [autoit]
$iTime = TimerDiff($TimerStart)
Local $iState = $GUI_SHOW, $aTitle[2] = ['Engine OFF','Engine ON']
If $iTime >= 1500 And $iSnooze = 0 Then
$EngineRun = Not $EngineRun
Beep(1700)
AdlibUnRegister('_StartEngine')
WinSetTitle($Gui0, '', $aTitle[$EngineRun])
EndIf
EndFunc ;==>_StartEngineFunc _close_Gui0()
[/autoit]
Exit
EndFunc -
Sorry bugfix, aber du hast leider nicht verstanden was ich vor habe.
Das sagte ich doch in meinem Post: Durch deine Beschreibungen wird alles eher unklarer als verständlich. Auch deine jetzige Beschreibung hilft (mir zumindest) nicht wesentlich weiter dein Problem zu verstehen - sorry meinerseits. -
Mein Problem ist das die Funktion Main eine Funktion ist die eine Teil einer GUI aufbaut. Und die Funktion Test1 gibt das ergebnis der GUI dann wieder zurück.
Aber es soll so sein das wenn jemand die GUI Aufbaut er auch Festlegen kann in Welcher Variable das Ergebnis zu finden ist.
Wie soll ich mir denn das vorstellen? "Jemand" kann den Aufbau der GUI nicht durchführen, das legst ausschließlich du mit deinem Skript fest und somit weißt du auch, welches Element im Array für welchen Wert zuständig ist.Ich habe eher den Eindruck, dass du den Ablauf deines Skriptes noch nicht klar formuliert hast und dadurch an auftretenden Symtomen herumdoktorst.
Mein Tipp:
Erstelle in Stichpunkten den Ablauf des Programms. Das könnte etwa so aussehen:
- Start Programm
- Anzeige Main-Gui
- User kann Auswahl in Checkboxen vornehmen
- Klick auf Start-Button ruft Auswertefunktion auf
- Auswertefunktion setzt Parameter in Abhängigkeit zu angewählten Checkboxen
- usw. usf.Mit dem, was du bis jetzt geschrieben hast, wird dein Anliegen von Post zu Post eher unverständlicher. :wacko:
Du möchtest zwanghaft Werte hin- und herschieben, was u.U. überhaupt nicht notwendig ist. Doch um dir da weiter zu helfen, müssen wir verstehen können, was genau in deinem Skript passieren soll. -
Habe identisches System, wie du: Kein Flackern.
-
Wenn Alt+W nicht funktioniert hast du nur die kastrierte Version von SciTE.

Auf der Startseite (Portal) findest du im Downloadbereich den Link zu "SciTE4AutoIt" - das ist, was du brauchst. -
Öffne eine AutoIt-Datei in SciTE und gib den Hotkey "Alt+W" ein.
Wähle die Messagebox deiner Wahl aus und füge das Ergebnis in den Editor ein, da siehst du alle Informationen.Oder..
du schaust dir das hier mal an: MsgBox - alle Parameter auf einen Blick -
Hat den wirklich noch nie jemand, dieses oder ein ähnliches Problem gehabt?
Nein, und mit deinem bruchstückhaften Code sind wir auch nicht in der Lage den Fehler zu reproduzieren.
Wenn du Hilfe brauchst, ist es sinnvoll Code einzustellen, der den Fehler hervorbringt. -
Ich hatte gerade die Fragestellung, wie ich zufällig den ersten Index von jeweils 3 aufeinanderfolgenden, zusammenhängenden Werten eines Arrays anspreche.
Das könnte vielleicht auch für jemand anderen interessant sein, z.B. um auf dem Display zufällig den ersten Pixel einer Gruppe bestimmter Breite anzusprechen (Pixelblöcke zeichnen mit 4x4 Größe o.ä.)Die Funktion lieferten den ersten Wert zurück für einen Bereich dessen Breite mit $_iDistance festgelegt wird.
[autoit]; #FUNCTION# =======================================================================================
[/autoit]
; Name ..........: _RandomDistance
; Description ...: Determines a random positive integer at the start position of a given distance
; Syntax ........: _RandomDistance($_iFrom, $_iTo, $_iDistance)
; Parameters ....: $_iFrom - value from ( >= 0 )
; ...............: $_iTo - value to
; ...............: $_iDistance - count of elements in range
; Return values .: Success First integer in a random range
; ...............: Failure -1 set error=1 invalid parameter(s)
; Author ........: BugFix
; ==================================================================================================
Func _RandomDistance($_iFrom, $_iTo, $_iDistance)
If $_iFrom < 0 Or $_iTo <= $_iFrom Or $_iDistance < 1 Then Return SetError(1,0,-1)
Local $iR = Random($_iFrom, $_iTo, 1)
Return $iR + ($_iDistance - Mod($iR, $_iDistance)) - $_iDistance
EndFunc ;==>_RandomDistance -
Gibt es da eine andere Möglichkeit?
Ja, das ist machbar. Dazu fängst du mit einer eigenen Prozedur die Nachricht ab, verarbeitest diese und reichst sie dann an das System weiter (oder verwirfst sie).
Knackpunkt ist hier die Verarbeitungsdauer. Wenn es zu lange dauert entstehen unvorhersehbare Systemzustände. Also immer so schnell, wie möglich sein - User-Interaktionen oder Messageboxen sind absolut tabu.
Hier mal aus meiner Bsp.-Sammlung:Spoiler anzeigen
[autoit]#Region - TimeStamp
[/autoit] [autoit][/autoit] [autoit]
; 2012-05-08 17:52:07
#EndRegion - TimeStamp#cs
[/autoit] [autoit][/autoit] [autoit]
WM_ -Message Hook
- Nachricht wird erst in einer eigenen Funktion ausgewertet
- dann an das System zurückgegeben (auswertbar mit GUIRegisterMsg)
- oder verworfen ("Return 0" nach Msg-Auswertung in _WinProc, s. Zeile 78)
#ce#include <GuiImageList.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <GuiListView.au3>
#include <ListViewConstants.au3>
#include <StructureConstants.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>Local Const $GWL_WNDPROC = -4
[/autoit] [autoit][/autoit] [autoit]$hGui = GUICreate("Test", 400, 400)
[/autoit] [autoit][/autoit] [autoit]
$hListView = _GUICtrlListView_Create($hGui, "Listview", 10, 10, 380, 380)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES)); Load images
[/autoit] [autoit][/autoit] [autoit]
$hImage = _GUIImageList_Create()
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0xFF0000, 16, 16))
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x00FF00, 16, 16))
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x0000FF, 16, 16))
_GUICtrlListView_SetImageList($hListView, $hImage, 1); Add columns
[/autoit] [autoit][/autoit] [autoit]
_GUICtrlListView_InsertColumn($hListView, 0, "Column 1", 100)
_GUICtrlListView_InsertColumn($hListView, 1, "Column 2", 100)
_GUICtrlListView_InsertColumn($hListView, 2, "Column 3", 100); Add items
[/autoit] [autoit][/autoit] [autoit]
_GUICtrlListView_AddItem($hListView, "Row 1: Col 1", 0)
_GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 2", 1)
_GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 3", 2)
_GUICtrlListView_AddItem($hListView, "Row 2: Col 1", 1)
_GUICtrlListView_AddSubItem($hListView, 1, "Row 2: Col 2", 1)
_GUICtrlListView_AddItem($hListView, "Row 3: Col 1", 2)
GUISetState();
[/autoit] [autoit][/autoit] [autoit]
$hProc = DllCallbackRegister('_WinProc', 'ptr', 'hwnd;uint;wparam;lparam') ; == hier registriere ich die Funktion "_WinProc" als Callback, Returntype ist "ptr", Parametertypen
$hHook = _WinAPI_SetWindowLong($hGui, $GWL_WNDPROC, DllCallbackGetPtr($hProc)) ; == hier wird dem Fenster die Adresse der Callback-Prozedur übergeben, diese ersetzt jetzt die Standard-Window-ProzedurGUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]While GUIGetMsg() <> -3
[/autoit] [autoit][/autoit] [autoit]
Sleep(10)
WEnd_WinAPI_SetWindowLong($hGui, $GWL_WNDPROC, $hHook) ; == nach Programmende: originale WinProc wiederherstellen
[/autoit] [autoit][/autoit] [autoit]
DllCallbackFree($hProc)Func _WinProc($hWnd, $iMsg, $iwParam, $ilParam) ; == die Prozedur soll ausschließlich WM_NOTIFY auswerten
[/autoit] [autoit][/autoit] [autoit]
; wenn nicht die gewünschte Msg kommt - Rückgabe an System ; == andere Messages werden gleich durchgereicht ans System zur Auswertung
If $iMsg <> $WM_NOTIFY Then Return _WinAPI_CallWindowProc($hHook, $hWnd, $iMsg, $iwParam, $ilParam)Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo
[/autoit] [autoit][/autoit] [autoit]
$hWndListView = $hListView
If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
[/autoit] [autoit][/autoit] [autoit]
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hWndListView
Switch $iCode
Case $LVN_COLUMNCLICK ; A column was clicked ; == Ich möchte nicht, dass diese Msg verwertet werden kann und verwerfe sie
$tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
ConsoleWrite('MyProc: $LVN_COLUMNCLICK -->Column: ' & DllStructGetData($tInfo, "SubItem") & @CRLF)
Return 0 ; <== Nachricht wird jetzt verworfen und kann über GUIRegisterMsg nicht verwertet werdenCase $NM_CLICK ; == Diese Msg lasse ich durch ans System
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
ConsoleWrite("MyProc: $NM_CLICK " & "-->Index: " & DllStructGetData($tInfo, "Index") & _
" -->SubItem: " & DllStructGetData($tInfo, "SubItem") & @CRLF)
EndSwitch
EndSwitch
; jetzt wird die normale WinProc aufgerufen, die man mit GuiRegisterMsg auswerten kann
Return _WinAPI_CallWindowProc($hHook, $hWnd, $iMsg, $iwParam, $ilParam)
EndFunc ;==>_WinProcFunc WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
[/autoit]
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
$hWndListView = $hListView
If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hWndListView
Switch $iCode
Case $LVN_COLUMNCLICK ; A column was clicked <== Diese Nachricht erreicht die Funktion nicht mehr
Local $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
ConsoleWrite('GUIRegisterMsg: $LVN_COLUMNCLICK -->Column: ' & DllStructGetData($tInfo, "SubItem") & @CRLF)
Case $NM_CLICK ; Sent by a list-view control when the user clicks an item with the left mouse button
Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
ConsoleWrite("GUIRegisterMsg: $NM_CLICK " & "-->Index: " & DllStructGetData($tInfo, "Index") & _
" -->SubItem: " & DllStructGetData($tInfo, "SubItem") & @CRLF)
EndSwitch
EndSwitch
Return 0
EndFunc ;==>WM_NOTIFY