was ist daran falsch?
Die fehlende Problembeschreibung! ![]()
was ist daran falsch?
Die fehlende Problembeschreibung! ![]()
Schau mal meine Funktion _pix_scan an: Scan Screen - Ergebnis sortiert
Wenn du mit SciTE arbeitest: cmdlineselect und SPACE
Dann erscheint:
#region - CmdlineSelect
If $CMDLINE[0] Then
For $i = 1 To $CMDLINE[0]
Select
Case $CMDLINE[$i] = '/?'
MsgBox(0x40000, @ScriptName & ' Help', _
'Switches are:' & @CRLF _
& @CRLF & '/extract' _
& @CRLF & @TAB & 'Extract files to current directory' _
& @CRLF & '/x' _
& @CRLF & @TAB & '' _
& @CRLF & '/x' _
& @CRLF & @TAB & '' _
& @CRLF & '/x' _
& @CRLF & @TAB & '' _
& @CRLF & '/x' _
& @CRLF & @TAB & '')
Exit
Case $CMDLINE[$i] = '/extract'
FileInstall('x', @ScriptDir & '\')
Exit
Case $CMDLINE[$i] = '/x'
Case $CMDLINE[$i] = '/x'
Case $CMDLINE[$i] = '/x'
Case $CMDLINE[$i] = '/x'
Case Else
MsgBox(0x40000, 'Incorrect switch used', _
'Command used:' & @CRLF & $CMDLINERAW & @CRLF & _
@CRLF & 'Use /? for the switches available.')
Exit
EndSelect
Next
EndIf
#endregion
Ich versteh den Sinn der Frage nicht.
Keine Anwendung ist einfach mal so geöffnet. Du mußt sie aufrufen. Und wenn du das tust, weißt du doch auch den Pfad.
aber z.B. um eine Anwendung zu starten, ohne wissen zu müssen, wo auf dem DT das Icon ist .... oder eine Anwendung/Fenster zu schließen, auch wenn ich die genaue Position des jeweiligen Buttons nicht kenne (Auflösun kann anders sein etc.)
Im Normalfall brauchst du für nix davon die Position der entsprechenden Controls. (ControlClick, ControlSend etc.)
Koordinaten eines Fensters kannst du dir z.B. mit WinGetPos holen. Auch Control-Positionen kannst du dir ausgeben lassen (ControlGetPos).
Also genug Möglichkeiten um sich den Aufwand, den du betreiben möchtest, zu ersparen.
Warum wollt ihr keine AutoIt-Funktion nutzen?
$var = Ping("www.AutoIt.de",250)
If $var Then; also possible: If @error = 0 Then ...
Msgbox(0,"Status","Online, Reaktionszeit: " & $var & 'ms')
Else
Msgbox(0,"Status","Fehler, Nummer: " & @error)
EndIf
Hi,
in einem Listview lassen sich mit dem Style $LVS_EDITLABELS Einträge on-the-fly editieren. Dies gilt aber nur für die Einträge in Spalte 0.
Mit der folgenden Methode lassen sich alle SubItem sofort editieren. In der zuständigen Funktion verwende ich OnEventMode. Ich habe es aber so geschrieben, dass nur für die Ausführung der Funktion in den OnEventMode geschaltet wird, anschließend wird wieder in den vorherigen Modus zurückgeschaltet (Für all jene, die sich noch immer mit GUIGetMsg rumplagen möchten
).
Das Bsp. habe ich daher auch mal im GetMsgMode erstellt.
Um den Editiermodus nutzen zu können, darf $LVS_EDITLABELS hier nicht gesetzt sein.
- mit Doppelklick öffnet sich genau über der angeklickten Spalte ein Editfenster mit dem Inhalt des SubItem
- der untere Rand des Editfensters liegt an der Mauszeigerspitze
- das Eingabefeld paßt sich der Breite der zugehörigen Spalte an
- ist das Fenster so verschoben, dass eine Spalte nach links/rechts über den Desktop hinausragt, wird das Editfenster am Bildschirmrand, statt mittig über der Spalte positioniert
- der geänderte Inhalt des Fensters wird mit ENTER übernommen und in das SubItem geschrieben
- findet keine Änderung statt muß das Fenster mit ESC geschlossen werden
- während des Editierens werden im Fenstertitel Zeilennummer und Spaltenname des editierten SubItem angezeigt
#include<StaticConstants.au3>
#include<GUIConstantsEx.au3>
#include<ListViewConstants.au3>
#include<StructureConstants.au3>
#include<WindowsConstants.au3>
#include <GUIListView.au3>
Global $currentItem[2], $title, $currentOpt[2] = ["none"]
[/autoit] [autoit][/autoit] [autoit]$GUI = GUICreate('test')
$hListView = GUICtrlCreateListView('Spalte1|Spalte2|Spalte3', 10, 10, 300, 200, $LVS_REPORT)
_GUICtrlListView_SetColumnWidth($hListView, 0, 70)
_GUICtrlListView_SetColumnWidth($hListView, 1, 60)
_GUICtrlListView_SetColumnWidth($hListView, 2, $LVSCW_AUTOSIZE_USEHEADER )
For $i = 1 To 9
GUICtrlCreateListViewItem('Z. ' & $i & ' - Sp. 1|Z. ' & $i & ' - Sp. 2|Z. ' & $i & ' - Sp. 3', $hListView)
Next
$EditBox = GUICreate('', 200, 30, -1, -1, BitOR($WS_POPUP,$WS_BORDER), $WS_EX_TOPMOST)
$hEdit = GUICtrlCreateInput('', 5, 5, 190, 20, $SS_CENTER)
HotKeySet('{ESC}', '_EscEdit')
GUISetState(@SW_SHOW, $GUI)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
While True
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE Then Exit
WEnd
Func _LeftDblClick($Info)
If $Info[3] = -1 Then Return
If $currentOpt[0] = "none" Then
$currentOpt[0] = Opt('GUICoordMode', 1)
$currentOpt[1] = Opt("GUIOnEventMode", 1)
EndIf
GUICtrlSetOnEvent($hEdit, '_EditEnter')
_GUICtrlListView_SetSelectedColumn($Info[1], $Info[4])
$title = WinGetTitle($GUI)
Local $mouse = MouseGetPos(), $posEdit = WinGetPos($EditBox)
Local $posGUI = WinGetPos($GUI), $posLV = ControlGetPos($GUI, '', $hListView)
Local $colInfo = _GUICtrlListView_GetColumn($Info[1], $Info[4]), $sumWidth = 0, $tmp
WinSetTitle($GUI, '', 'Editiere: Zeile ' & $Info[3]+1 & ', ' & $colInfo[5])
For $i = 0 To $Info[4]
$tmp = _GUICtrlListView_GetColumn($Info[1], $i)
$sumWidth += $tmp[4]
Next
$sumWidth -= $colInfo[4]
Local $xPos = $posGUI[0]+$posLV[0]+$sumWidth
If $xPos+$colInfo[4]+10 > @DesktopWidth Then $xPos = @DesktopWidth - ($colInfo[4] + 10)
If $xPos < 0 Then $xPos = 0
WinMove($EditBox, '', $xPos, $mouse[1]-$posEdit[3], $colInfo[4]+10)
GUICtrlSetData($hEdit, _GUICtrlListView_GetItemText($Info[1], $Info[3], $Info[4]))
$currentItem[0] = $Info[3]
$currentItem[1] = $Info[4]
GUISetState(@SW_SHOW, $EditBox)
EndFunc
Func _EscEdit()
WinSetTitle($GUI, '', $title)
Opt('GUICoordMode', $currentOpt[0])
Opt("GUIOnEventMode", $currentOpt[1])
$currentOpt[0] = "none"
GUISetState(@SW_HIDE, $EditBox)
EndFunc
Func _EditEnter()
WinSetTitle($GUI, '', $title)
Opt('GUICoordMode', $currentOpt[0])
Opt("GUIOnEventMode", $currentOpt[1])
$currentOpt[0] = "none"
_GUICtrlListView_SetItemText($hListView, $currentItem[0], GUICtrlRead($hEdit), $currentItem[1])
GUISetState(@SW_HIDE, $EditBox)
EndFunc
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
$hWndListView = $hListView ; ID des LV
If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView) ; ID des LV
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hWndListView
Switch $iCode
Case $NM_DBLCLK
Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
Local $aInfo[5] = [$hWndFrom, $iIDFrom, $iCode, DllStructGetData($tInfo, "Index"), _
DllStructGetData($tInfo, "SubItem")]
_LeftDblClick($aInfo)
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
Hier mal eine alternative Variante, die EditBox kann bei nichtgeändertem Inhalt jetzt auch mit ENTER verlassen werden.
#include<StaticConstants.au3>
#include<GUIConstantsEx.au3>
#include<ListViewConstants.au3>
#include<StructureConstants.au3>
#include<WindowsConstants.au3>
#include <GUIListView.au3>
Global $currentItem[2], $title, $currentOpt[2] = ["none"]
[/autoit] [autoit][/autoit] [autoit]$GUI = GUICreate('test')
$hListView = GUICtrlCreateListView('Spalte1|Spalte2|Spalte3', 10, 10, 300, 200, $LVS_REPORT)
_GUICtrlListView_SetColumnWidth($hListView, 0, 70)
_GUICtrlListView_SetColumnWidth($hListView, 1, 60)
_GUICtrlListView_SetColumnWidth($hListView, 2, $LVSCW_AUTOSIZE_USEHEADER )
For $i = 1 To 9
GUICtrlCreateListViewItem('Z. ' & $i & ' - Sp. 1|Z. ' & $i & ' - Sp. 2|Z. ' & $i & ' - Sp. 3', $hListView)
Next
$EditBox = GUICreate('', 200, 30, -1, -1, BitOR($WS_POPUP,$WS_BORDER), $WS_EX_TOPMOST)
$dummy = GUICtrlCreateDummy()
$hEdit = GUICtrlCreateInput('', 5, 5, 190, 20, $SS_CENTER)
HotKeySet('{ESC}', '_EscEdit')
Global $AccelKeys[1][2]=[["{ENTER}", $dummy]]
GUICtrlSetOnEvent($dummy, "_EditEnter")
GUISetAccelerators($AccelKeys)
GUISetState(@SW_SHOW, $GUI)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
While True
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE Then Exit
WEnd
Func _LeftDblClick($Info)
If $Info[3] = -1 Then Return
If $currentOpt[0] = "none" Then
$currentOpt[0] = Opt('GUICoordMode', 1)
$currentOpt[1] = Opt("GUIOnEventMode", 1)
EndIf
GUICtrlSetOnEvent($hEdit, '_EditEnter')
_GUICtrlListView_SetSelectedColumn($Info[1], $Info[4])
$title = WinGetTitle($GUI)
Local $mouse = MouseGetPos(), $posEdit = WinGetPos($EditBox)
Local $posGUI = WinGetPos($GUI), $posLV = ControlGetPos($GUI, '', $hListView)
Local $colInfo = _GUICtrlListView_GetColumn($Info[1], $Info[4]), $sumWidth = 0, $tmp
WinSetTitle($GUI, '', 'Editiere: Zeile ' & $Info[3]+1 & ', ' & $colInfo[5])
For $i = 0 To $Info[4]
$tmp = _GUICtrlListView_GetColumn($Info[1], $i)
$sumWidth += $tmp[4]
Next
$sumWidth -= $colInfo[4]
Local $xPos = $posGUI[0]+$posLV[0]+$sumWidth
If $xPos+$colInfo[4]+10 > @DesktopWidth Then $xPos = @DesktopWidth - ($colInfo[4] + 10)
If $xPos < 0 Then $xPos = 0
WinMove($EditBox, '', $xPos, $mouse[1]-$posEdit[3], $colInfo[4]+10)
GUICtrlSetData($hEdit, _GUICtrlListView_GetItemText($Info[1], $Info[3], $Info[4]))
$currentItem[0] = $Info[3]
$currentItem[1] = $Info[4]
GUISetState(@SW_SHOW, $EditBox)
EndFunc
Func _EscEdit()
WinSetTitle($GUI, '', $title)
Opt('GUICoordMode', $currentOpt[0])
Opt("GUIOnEventMode", $currentOpt[1])
$currentOpt[0] = "none"
GUISetState(@SW_HIDE, $EditBox)
EndFunc
Func _EditEnter()
WinSetTitle($GUI, '', $title)
Opt('GUICoordMode', $currentOpt[0])
Opt("GUIOnEventMode", $currentOpt[1])
$currentOpt[0] = "none"
_GUICtrlListView_SetItemText($hListView, $currentItem[0], GUICtrlRead($hEdit), $currentItem[1])
GUISetState(@SW_HIDE, $EditBox)
EndFunc
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
$hWndListView = $hListView ; ID des LV
If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView) ; ID des LV
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hWndListView
Switch $iCode
Case $NM_DBLCLK
Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
Local $aInfo[5] = [$hWndFrom, $iIDFrom, $iCode, DllStructGetData($tInfo, "Index"), _
DllStructGetData($tInfo, "SubItem")]
_LeftDblClick($aInfo)
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
Ein Einzeiler gefällig ? ![]()
MsgBox(0, "Newstring", StringReplace(StringReplace(StringReplace(StringReplace("Hallo", "h", "1"), "a", "2"), "l", "3"), "o", "4"))
[/autoit]Da du es aber sicher mit vorher nicht bekannten Wörtern unterschiedlicher Zeichenlänge zu tun hast, empfehle ich die Verwendung eines Array oder hier sogar besser eines Object.Dictionary um die Buchstaben-Ersatzzeichen Zuordnung zu speichern.
macht er ein File im MAC Format
?? - Ich sehe hier nicht, dass er etwas macht, sondern dass du explizit eine Schreibanweisung für die Datei ausgibst. Und genau nach dieser Anweisung wird die Datei erstellt.
Ein Bug wäre, wenn lt. Anweisung @CR geschrieben werden soll, im Text aber @CRLF erscheinen würde. Also nix da Bug. ![]()
( 90% der Fehler sitzen 80 cm vorm Monitor ) ![]()
FireFlyer: Hab dir einen Zugang eingerichtet, s. PN.
- Seite aufrufen
- ENTER drücken
fertig! (Username und Paßwort im Browser speichern
)
Die zu bearbeitende Datei mit FileOpen öffnen und den gewünschten Mode angeben (append, overwrite) s. Hilfe.
Liegt daran, dass einige Hersteller von AV-Proggis panische Angst vor Skriptprogrammen haben und alles, was dort neu ist, erst mal auf die schwarze Liste setzen, bis sich dann herausstellt, dass doch keine Gefahr besteht.
Ja ok, soweit kann ich folgen, aber warum ist die Konstante anders deklariert?
Sollte das nicht bei jeder AutoIt-Version gleich sein?
Nein, war auch in den Changes zur AutoIt-Version ausdrücklich angesprochen, dass in Zukunft nur noch diese Datentypen in DLL-Aufrufen zu verwenden sind.
Du kannst keinen Datei-Desktop Vergleich durchführen.
Dazu müßtest du die Datei anzeigen lassen, für jede Pixelposition die Farbwerte speichern und diese Werte mit einer späteren Bildschirmdarstellung vergleichen.
Welchen Sinn soll das übrigens haben?
Schau mal in der Hilfe unter For-Schleife.
Dein Label ($S3_Zeile01) hat nach der Erstellung folgenden Inhalt: "Die Software wurde" & $schonFertig & "installiert." - wobei $schon Fertig ein Leerstring ist.
Wenn du der Variablen $schonFertig einen neuen Inhalt zuweist, weiß das aber dein Label nicht. Du mußt den Inhalt des Labels jetzt mit GUICtrlSetData neu festlegen. Bei den 3 Worten würde ich auf Variablen verzichten:
- Label ohne Text erstellen
- Fall1: GUICtrlSetData($Label, 'Text1')
- Fall2: GUICtrlSetData($Label, 'Text2')
Hi,
also SubItems lassen sich leider so nicht bearbeiten. Ich hab dir aber mal eine recht passable Lösung gebastelt.
Beachte, dass der Style $LVS_EDITLABELS hierbei nicht aktiviert sein darf.
Per Doppelklick auf einen Eintrag wird ein kleines Editfenster an dieser Position geöffnet. Das Ereignis zum Schließen des Fensters ist ENTER nach Ändern des Inhalts. Darum habe ich zusätzlich ESC als HotKey zum Schließen aktiviert, falls keine Änderung vorgenommen wird (sonst könnte das Fenster nicht geschlossen werden
).
#include<StaticConstants.au3>
#include<GUIConstantsEx.au3>
#include<ListViewConstants.au3>
#include<StructureConstants.au3>
#include<WindowsConstants.au3>
#include <GUIListView.au3>
Opt("GUIOnEventMode", 1)
Global $currentItem[2], $title
$gui = GUICreate('test')
GUISetOnEvent($GUI_EVENT_CLOSE, '_ende')
$hListView = GUICtrlCreateListView('Spalte1|Spalte2|Spalte3', 10, 10, 300, 200, $LVS_REPORT)
_GUICtrlListView_SetColumnWidth($hListView, 0, 70)
_GUICtrlListView_SetColumnWidth($hListView, 1, 60)
_GUICtrlListView_SetColumnWidth($hListView, 2, $LVSCW_AUTOSIZE_USEHEADER )
For $i = 1 To 9
GUICtrlCreateListViewItem('Z. ' & $i & ' - Sp. 1|Z. ' & $i & ' - Sp. 2|Z. ' & $i & ' - Sp. 3', $hListView)
Next
$EditBox = GUICreate('', 200, 30, -1, -1, BitOR($WS_POPUP,$WS_BORDER), $WS_EX_TOPMOST)
$edit = GUICtrlCreateInput('', 5, 5, 190, 20, $SS_CENTER)
GUICtrlSetOnEvent(-1, '_EditEnter')
HotKeySet('{ESC}', '_escEdit')
GUISetState(@SW_SHOW, $gui)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
While True
Sleep(100)
WEnd
Func _LeftDblClick($Info)
If $Info[3] = -1 Then Return
_GUICtrlListView_SetSelectedColumn($Info[1], $Info[4])
$title = WinGetTitle($gui)
Local $mouse = MouseGetPos(), $wndEdit = WinGetPos($EditBox)
Local $wndGUI = WinGetPos($gui), $wndLV = ControlGetPos($gui, '', $hListView)
Local $colInfo = _GUICtrlListView_GetColumn($Info[1], $Info[4]), $sumWidth = 0, $tmp
WinSetTitle($gui, '', 'Editiere: Zeile ' & $Info[3]+1 & ', ' & $colInfo[5])
For $i = 0 To $Info[4]
$tmp = _GUICtrlListView_GetColumn($Info[1], $i)
$sumWidth += $tmp[4]
Next
$sumWidth -= $colInfo[4]
Local $xPos = $wndGUI[0]+$wndLV[0]+$sumWidth
If $xPos+$colInfo[4]+10 > @DesktopWidth Then $xPos = @DesktopWidth - ($colInfo[4] + 10)
WinMove($EditBox, '', $xPos, $mouse[1]-$wndEdit[3], $colInfo[4]+10)
GUICtrlSetData($edit, _GUICtrlListView_GetItemText($Info[1], $Info[3], $Info[4]))
$currentItem[0] = $Info[3]
$currentItem[1] = $Info[4]
GUISetState(@SW_SHOW, $EditBox)
EndFunc
Func _escEdit()
WinSetTitle($gui, '', $title)
GUISetState(@SW_HIDE, $EditBox)
EndFunc
Func _EditEnter()
WinSetTitle($gui, '', $title)
_GUICtrlListView_SetItemText($hListView, $currentItem[0], GUICtrlRead($edit), $currentItem[1])
GUISetState(@SW_HIDE, $EditBox)
EndFunc
Func _ende()
Exit
EndFunc
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
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 $NM_DBLCLK ; Sent by a list-view control when the user double-clicks an item with the left mouse button
Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
Local $aInfo[12] = [$hWndFrom, _
$iIDFrom, _
$iCode, _
DllStructGetData($tInfo, "Index"), _
DllStructGetData($tInfo, "SubItem"), _
DllStructGetData($tInfo, "NewState"), _
DllStructGetData($tInfo, "OldState"), _
DllStructGetData($tInfo, "Changed"), _
DllStructGetData($tInfo, "ActionX"), _
DllStructGetData($tInfo, "ActionY"), _
DllStructGetData($tInfo, "lParam"), _
DllStructGetData($tInfo, "KeyFlags")]
_LeftDblClick($aInfo)
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
Edit: Hab nach eine Codezeile eingefügt, um zu verhindern, dass bei einem Klick am rechten Bildschirmrand, das Eingabefenster außerhalb des Desktopbereiches erscheint.
Edit2: Noch eine Verbesserung, das Eingabefenster paßt sich automatisch an die Breite der angeklickten Spalte an.
Und wegen der besseren Optik markieren wir auch gleich noch die Spalte ![]()
Und noch ein bischen geschraubt ![]()
Das Eingabefenster liegt jetzt immer exakt über der angeklickten Spalte.
Noch eine Erweiterung: während des Editierens werden im Fenstertitel Zeilennummer und Spaltenbezeichnung angezeigt.
Du prüfst doch, ob installiert werden muß. Falls ja, beginnt die Installation und an deren Ende gibst die Meldung aus: "Installation erfolgreich".
Falls nein, gibst du nur die Meldung aus: "Installation nicht erforderlich".