Beiträge von HansJ54
-
-
Als Syntax wird angegeben
ControlSend ( "title", "text", controlID, "string" [, flag = 0] ) - ControlID dritter Parameter
und im Example
ControlSend ( $hWnd, "", "Edit1", "This is some Text") - ControlID erster Parameter
Sieht bei allen Control* genau so aus.
Verstehe ich da was falsch oder sollte die Hilfe korrigiert werden?
-
Du verwendest eine ältere Version von AutoIt ohne Maps.
installiere dir die aktuelle Version von AutoIt.
Vielen Dank, funktioniert jetzt.

Gibt es eigentlich eine Möglichkeit zu sehen, dass es eine neue Version von AutoIt gibt ohne auf der Webseite nachzuschauen? Manche Programme zeigen das per Popup, bei anderen geht es mit Hilfe und "Über". Da ich bei AutoIt nur in SciTE arbeite, habe ich nicht gemerkt, dass es eine neue Version gab.
-
Um eine ListView editierbar zu machen habe ich mal eine UDF geschrieben. Du musst sie quasi nur mit dem Array befüllen und beim "speichern" (deselektieren/enter/...) den Array-Eintrag an dem Index+SubIndex verändern.
Sollte das sein, was du willst: Listview edit subitems UDF
Sieht gut aus und ist es vermutlich auch, aber bekomme bei der ListViewEditInput.au3 Fehlermeldung wegen fehlender Functions MapExists() , MapRemove(), MapKeys(). Habe ich vergessen etwas runterzuladen?
-
Ich versuche es noch einmal:
Gegeben ein Array in AutoIt mit 2 Spalten. Das möchte ich anzeigen und durch Anklicken einer Zelle in der 2. Spalte den Wert in dieser Zelle per Tastatur ändern (reiner Text, keine Formeln). So eine Art Array-Editor oder Mini-Excel.
Das Skript oben produziert die Anzeige, aber ich konnte nicht herausfinden, was umzustellen ist um eine Eingabe zu ermöglichen. Für zukünftige Zwecke könnten es auch mal 3 oder 4 Spalten sein, aber vorerst nicht wichtig.
Vielleicht hilft das Bild?
-
Hallo Andy,
ich dachte, ich hätte mein Problem verständlich genug beschrieben - ich versuche es noch einmal:
Ziel: aus einem 2D-Array die Spalte 1 (Namen) und wahlweise irgendeine weitere Spalte x anzeigen und einzelne per Maus angeklickte Werte in der Spalte x ändern/eintragen/überschreiben können.
Interessant übrigens: ich habe gestern von ChatGPT ein Skript bekommen, das zwar nur teilweise funktionierte (war nur ein Viewer und ich konnte die Einträge in der 2. Spalte nicht ändern). Aber zumindest konnte ich sehen, dass die Lösung wohl irgendwie über ListView möglich ist und habe dadurch zumindest einen besseren Suchbegriff und Ansatz.
Beispiel unten: wenn ich jetzt noch einzelne Werte aus Spalte "Local" anklicken und ändern könnte, wäre ich am Ziel. Vielleicht liegt es $LVN_ENDLABELEDIT - wurde benutzt aber ist unbekannt und ich konnte auch nichts dazu finden. In der Diskussion mit ChatGPT kam dann raus, ich sollte dafür den Wert -177 einsetzen - warum auch immer.
AutoIt
Alles anzeigen#include <Array.au3> #include <GUIConstantsEx.au3> #include <GuiListView.au3> #include <WindowsConstants.au3> #include <WinAPI.au3> Global $LVN_ENDLABELEDIT = -177 ; DIESE VARIABLE IST UNBEKANNT UND CHATGPT MEINTE, MAN KÖNNTE SIE EINFACH DURCH -177 ERSETZEN GLOBAL $aMyArray[30][2] = [ _ ["Check","0000000"], _ ["Damb21","1312355"], _ ["Damb19","1312355"], _ ["Damb4","1342355"], _ ["Damb11","1372355"], _ ["Damb2","1312355"], _ ["Damb14","1310655"], _ ["Damb4","1312355"], _ ["Damb13","1312355"], _ ["Damb2","1312955"], _ ["Damb214","1312355"], _ ["Damb114","1312355"], _ ["Damb13","1312255"], _ ["Dasb27","1312355"], _ ["Dasb43","1312355"], _ ["Dasb4","1312355"], _ ["Dasb13","1312355"], _ ["Dasb2","1392355"], _ ["Dasb214","1312355"], _ ["Dasb114","1812355"], _ ["Dasb13","1312355"], _ ["Dasb27","1312355"], _ ["Dasb43","1312355"], _ ["Dasb12","1312355"]] ; Erstelle das GUI-Fenster Global $hGUI = GUICreate("Array Viewer", 600, 400) ; Erstelle die ListView-Kontrolle Global $hListView = GUICtrlCreateListView("Name|Local", 10, 10, 580, 380) _GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER)) ; Füge die Daten aus dem Array zur ListView-Kontrolle hinzu For $i = 0 To UBound($aMyArray) - 1 GUICtrlCreateListViewItem($aMyArray[$i][0] & "|" & $aMyArray[$i][1], $hListView) Next ; Aktualisiere das Array, wenn der Benutzer Änderungen vornimmt GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") GUISetState() ; Haupt-Loop While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop EndSwitch WEnd Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg, $wParam Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam) Local $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom")) Local $iCode = DllStructGetData($tNMHDR, "Code") Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam) Local $iItem = DllStructGetData($tInfo, "Item") Local $iSubItem = DllStructGetData($tInfo, "SubItem") If $hWndFrom = $hListView And $iCode = $LVN_ENDLABELEDIT Then Local $tLVITEM = DllStructCreate($tagLVITEM, $lParam) Local $sText = DllStructGetData($tLVITEM, "Text") $aMyArray[$iItem][$iSubItem] = $sText _GUICtrlListView_SetItemText($hListView, $iItem, $iSubItem, $sText) EndIf Return $GUI_RUNDEFMSG EndFunc -
Habe meine "Cells.au3" noch mal angeschaut. Grundsätzlich wäre es damit machbar, müsste aber auf jeden Fall stark verändert werden, da in jetziger Form nur das Anzeigen (und bedingte Formatieren) von Werten vorgesehen ist. Aber das auszuschlacken und umzubauen ist sicher komplizierter, als es selbst zu Erstellen.
Würde es bei Dir unter Meine UDF erwarten, bin aber entweder blind oder Cells.au3 ist nicht da? Nur zum Anschauen.
Andere Idee: ich habe gerade eine UDF gefunden, mit der man CSV-Dateien bearbeiten kann. Ist nur ziemlich langsam bei großen Dateien. Wenn ich da eine Einschränkung auf die Anzeige von 2 Spalten hinbekäme, würde ich nicht das Array sondern die csv bearbeiten und dann das Array neu laden. https://ttps//www.autoitscr…sv-file-editor/ Leider geht das Script weit über meine Verständnisgrenzen

-
Es ist eine große csv-Datei, die ich im Programm in ein Array einlese. Gelegentlich muss ich in einer Spalte testweise einige Werte ändern. Bisher verlasse ich das Programm, starte Excel, suche die Spalte, ändere und lese wieder ein und teste. Wenn die Tests erfolgreich waren, dann sollen die Werte in der ursprünglichen csv-Datei bleiben, sonst wieder zurück zum alten Stand.
Daher ist meine Idee, in einer Spalte im eingelesenen Array einige Werte zu ändern wie mit Excel, also vom AutoIt-Programm aus.
-
Danke! Bei mir stehen nur Texte drin, keine Formeln und Formatierungen. Ist vielleicht einfacher.
-
Nach langer Zeit ohne Probleme
denke ich mal wieder über eine Optimierung nach:Ich lese eine große csv-Datei in ein Array ein und möchte im Programm eine Spalte davon anzeigen und bearbeiten - so als ob ich diesen Teil des Arrays alleine in Excel vor mir hätte. Bisher habe ich die Input-Datei mit Excel geöffnet, Spalte gesucht und geändert, Datei gespeichert und die ganze Datei neu im Programm eingelesen.
In der ersten Spalte stehen die Feldbezeichnungen, daher müsste ich Spalte 1 und Spalte xx anzeigen können, die Werte in Spalte xx ändern und das Ganze wieder speichern.
Gibt es dafür schon eine fertige Lösung?
Danke für Eure Hilfe!
-
Super, danke! Besser eine direkte Funktion als "hintenrum"

-
Mal wieder ein Spezialproblem von mir:
Wir nutzen ChromeDriver.exe, befindet sich in einem Netzpfad. Wenn es eine neue Version gibt, kopiere ich sie dorthin. Falls aber gerade jemand die Datei nutzt, geht das schief und ich lande in einer Windows-Fehlermeldung.
Gibt es in AutoIt eine Möglichkeit zu prüfen, ob ich eine Datei überschreiben kann, also ob sie nicht benutzt ist, ohne dass ich auf die Windows-Ebene zurückfalle?
Das Ergebnis von $sOk = FileRead("I:\BlpMenu\Webdriver\chromedriver.exe", 1) scheint eine Lösung zu sein, aber gibt es eine bessere Idee (wobei mir die schon gut vorkommt)?
-
-
-
AspirinJunkie : Aber nicht im Urlaub stören lassen, hat Zeit und mit Workaround gelöst!
_ArrayMinMax() hat keinen Range, den man für die Untersuchung angeben kann (z.B. Zeile 2-9 + Spalte 2-4)?
Kann man einem neuen Array direkt einen Range aus einem bestehenden Array zuweisen? Also $aB = (Zeile 2-9 und Spalte 2-4) aus Array $aA? Habe mal wieder nichts gefunden. Mein Workaround: ich kopiere das Array komplett und lösche die nicht gewünschten Zeilen und Spalten anschließend.
-
-
Ich sollte mal schneller hier reinschauen, bei mir sind es bisher mehr als 30 Zeilen Code und AspirinJunkie macht das mit 5

Es funktioniert einwandfrei für meine Fälle, allerdings vom Verstehen bin ich ganz weit entfernt.

AspirinJunkie Im Beispiel unten gibt es ein Problem mit der Sortierung der "Release #nn" - da klappt die Sortierung (#29 vor #2) nicht - für mich nicht wichtig, kommt bei mir nicht vor.
Und: Deine ArrayPlus-UDF ist super, Einiges kann ich auch benutzen weil ich es verstehe, aber z.B. für das Beispiel unten nur das Maximum oder die Zeile des Maximums zu ermitteln dazu reicht es bei mir nicht. Ebenfalls kein großes Problem, da ich mit der Sortierung das Ergebnis auch bekomme, aber vielleicht gibt es ja auch die entsprechende direkte Funktion bei Dir?
Und ist "Array-Plus-UDF" der Nachfolger von "DynArray"?Nochmals vielen Dank an alle hier im Forum!
AutoIt
Alles anzeigen; Spezial-Sortierung Array nach Software-Versionsnummern #include "ArrayPlus.au3" Local $aVersionsAndReleases[][] = [["999.2.8.9", "Release #1"],["1000.2.9.10", "Release #3"],["0.2.8.10", "Release #9"],["0.2.8.9999", _ "Release #10"],["0.2.8.19999", "Release #10"], ["0.2.8.10", "Release #2"],["0.3", "Release #5"],["0.39999.101", "Release #5"], _ ["0.3.9999", "Release #5"],["0.2.8.10", "Release #29"]] _ArraySortFlexible($aVersionsAndReleases, _MyCompare) _ArrayDisplay($aVersionsAndReleases) Func _MyCompare(ByRef $A, ByRef $B) ; user defined comparison function for user-defined sorting Local Static $h_DLL_Shlwapi = DllOpen("Shlwapi.dll") Return -DllCall($h_DLL_Shlwapi, "int", "StrCmpLogicalW", "wstr", $A[0], "wstr", $B[0])[0] EndFunc ;==>_MyCompare -
Moombas : Zeile 15 - IniReadSectionNames ist eine vorhandene Funktion und liefert schon einen @error. Der Fehler lag in meiner IniGetAllKeys, da muss auch noch eine Errorbearbeitung hin. Falls die Ini-Datei $sIni nicht vorhanden ist, dann braucht es m.E. insgesamt 4 "If @error then". Bitte mal meine Logik prüfen.
Versionsnummern sortieren: da denke ich gerade drüber nach, kommt
AutoIt
Alles anzeigenOpt('MustDeclareVars', 1) #include <Array.au3> #include <MsgBoxConstants.au3> Global $sBrowserVersionsFile = @ScriptFullPath ; testweise mal auf eine nicht vorhandene Datei setzen c:\temp\test.ini _BrowserVersions($sBrowserVersionsFile) Func _BrowserVersions($sIni) Global $aErgebnis = Ini2Array($sIni, True, True, False, "---") ; sort sections and keys, no transpose, empty = "---" If @error Then Return SetError(@error, 0, MsgBox($MB_TOPMOST, "_BrowserVersions()", "Ini-Datei nicht ok!")) $aErgebnis[0][0] = "Client" ; Zeile "Latest" mit der aktuellsten vorhandenen Version auffüllen Local $aRowLatest = _ArrayFindAll($aErgebnis, "Latest-->") ; row for latest version If @error = 0 Then For $i = 1 To UBound($aErgebnis, $UBOUND_COLUMNS) - 1 $aErgebnis[$aRowLatest[0]][$i] = _ArrayMax($aErgebnis, 0, 1, $aRowLatest[0], $i) Next EndIf _ArrayDisplay($aErgebnis, "Browser- und WebDriver-Versionen", "1:", $ARRAYDISPLAY_NOROW + $ARRAYDISPLAY_COLALIGNCENTER, Default, _ArrayToString($aErgebnis, "|", 0, 0)) EndFunc Func Ini2Array($sIni, $bSortSections = False, $bSortKeys = False, $bTranspose = False, $sEmptyField = "---") ;Habe auch mal den "Füller" für leere Felder Optional gemacht, nicht jeder mag das dort etwas drin steht obwohl dort nix drin steht^^ Local $sSection Local $aSectionNames = IniReadSectionNames($sIni) If @error Then Return SetError(@error, 0, 0) Local $aKeys = IniGetAllKeys($sIni) Local $aResult[$aSectionNames[0] + 1][$aKeys[0] + 1] ; Das Sortieren ist kritisch, wenn ein Schlüssel Zahlen enthält passt das ganz so nicht mehr, daher geändert. If $bSortSections Then _ArraySort($aSectionNames, Default, 1) If $bSortKeys Then _ArraySort($aKeys, Default, 1) For $I = 1 To $aKeys[0] $aResult[0][$I] = $aKeys[$I] Next For $I = 1 To $aSectionNames[0] $sSection = $aSectionNames[$I] $aResult[$I][0] = $sSection For $J = 1 To $aKeys[0] $aResult[$I][$J] = IniRead($sIni, $sSection, $aKeys[$J], $sEmptyField) Next Next If $bTranspose Then _ArrayTranspose($aResult) Return $aResult Endfunc Func IniGetAllKeys($sIni) Local $sData = "|" Local $aSectionNames = IniReadSectionNames($sIni) If @error Then Return SetError(@error, 0, 0) For $i = 1 To $aSectionNames[0] Local $aInhalt = IniReadSection($sIni, $aSectionNames[$i]) If @error = 0 Then For $j = 1 To $aInhalt[0][0] If Not StringInStr($sData, "|" & $aInhalt[$j][0] & "|") Then $sData &= $aInhalt[$j][0] & "|" Next EndIf Next If StringRight($sData, 1) = "|" Then $sData = StringTrimRight($sData, 1) Local $aKeys[0] _ArrayAdd($aKeys, $sData) $aKeys[0] = Ubound($aKeys) - 1 ;Lieber direkt die Anzahl mit übergeben, da hier so oder so Zeile 0 leer ist Return $aKeys EndFunc #Region eingebettete INI #cs [Latest-->] [BLP1-WX] EdgeVersion=99.0.1293.63 FirefoxVersion=103.0.3.8255 ChromeVersion=105.0.5112.102 OfficeVersion=16.0.10389.20033 [BLP3-WX] ChromeVersion=104.0.5112.102 EdgeVersion=104.0.1293.63 FirefoxVersion=103.0.2.8255 OfficeVersion=16.0.10389.20033 [BLP2-WX] EdgeVersion=104.0.1293.63 ChromeVersion=104.0.5112.102 FirefoxVersion=103.0.2.8255 OfficeVersion=16.0.10389.20033 [Server] ChromeVersion=104.0.5112.102 EdgeVersion=105.0.1293.63 FirefoxVersion=104.0.2.8255 OfficeVersion=16.0.10389.20033 [BLP5-WX] ChromeVersion=104.0.5112.102 EdgeVersion=104.0.1293.63 FirefoxVersion=103.0.2.8255 OfficeVersion=16.0.10389.20033 Test=1234 [BLP6-WX] ChromeVersion=104.0.5112.102 EdgeVersion=104.0.1293.63 FirefoxVersion=103.0.2.8255 OfficeVersion=16.0.10389.20033 [WebDriver] ChromeVersion=104.0.5112.79 EdgeVersion=104.0.1293.63 FirefoxVersion=0.31.1 #ce #EndRegion eingebettete INI -
Zeile 12: gute Idee
Zeile 15: wenn etwas nicht passt (Filename oder Inhalt), dann sollte abgebrochen werden. Normalerweise sind die Daten ja nicht eingebettet, ich schreibe die z.B. regelmäßig von den Clients aus in eine gemeinsame Ini-Datei.
Zeile 19: sehr gut, hatte auch mal testweise eine Sektion "1234" probiert, führte zum Error. Habe aber nicht sofort verstanden warum - jetzt ist es mir klar. Daher konnte ich die Anzahl in Zeile 54 auch nicht setzen und musste oben UBound nutzen.
Bei Sortieren ergibt sich noch ein Problem mit den Versionen. Hat jetzt nicht mit der Funktion allgemein zu tun, sondern nur mit meiner Anwendung. Aber vielleicht gibt es da ja auch schon eine Lösung für die Sortierung von Versionsnummern? 99.0.1234.741 würde jetzt fälschlich als "neuer" eingeordnet als 105.0.1234.102.
Andy: Projekt erfolgreich abgeschlossen, die Überschrift des Threads passt?
-
Hier sind jetzt die fertigen beiden Funktionen, die ich aus den Beispielen oben dank Eurer Hilfe zusammengesetzt habe. Dazu ein noch ein Beispiel für die Anwendung. Fehler und Verbesserungen bitte melden

IniGetAllKeys() erzeugt eine Tabelle mit allen vorhandenen Keys in einer ini-Datei
Ini2Array() erzeugt ein Array aus allen Werten einer ini-Datei mit Zeilenbeschriftung "Sections" und Spaltentext "Keys" oder das ganze transponiert.
AutoIt
Alles anzeigen#include <Array.au3> Global $sIniDatei = @ScriptFullPath Global $aErgebnis = Ini2Array($sIniDatei, True, True, False) ; sort sections and keys $aErgebnis[0][0] = "Client" Local $aRowLatest = _ArrayFindAll($aErgebnis, "Latest-->") ; row for latest version For $i = 1 To UBound($aErgebnis, $UBOUND_COLUMNS) - 1 $aErgebnis[$aRowLatest[0]][$i] = _ArrayMax($aErgebnis, 0, 1, $aRowLatest[0], $i) Next _ArrayDisplay($aErgebnis, "Browser- und WebDriver-Versionen", "1:", $ARRAYDISPLAY_NOROW + $ARRAYDISPLAY_COLALIGNCENTER, Default, _ArrayToString($aErgebnis, "|", 0, 0)) Func Ini2Array($sIni, $bSortSections, $bSortKeys, $bTranspose) Local $aSectionNames = IniReadSectionNames($sIni) If @error Then Return SetError(@error, 0, 0) Local $aKeys = IniGetAllKeys($sIni) If $bSortSections Then _ArraySort($aSectionNames) If $bSortKeys Then _ArraySort($aKeys) Local $aResult[UBound($aSectionNames)][UBound($aKeys)] Local $iMax = UBound($aKeys) - 1 For $I = 0 To $iMax $aResult[0][$I] = $aKeys[$I] Next Local $sSection For $I = 1 To $aSectionNames[0] $sSection = $aSectionNames[$I] $aResult[$I][0] = $sSection For $J = 1 To $iMax $aResult[$I][$J] = IniRead($sIni, $sSection, $aKeys[$J], "---") Next Next If $bTranspose Then _ArrayTranspose($aResult) Return $aResult Endfunc Func IniGetAllKeys($sIni) Local $sData = "|" Local $aSectionNames = IniReadSectionNames($sIni) If @error Then Return SetError(@error, 0, 0) For $i = 1 To $aSectionNames[0] - 1 Local $aInhalt = IniReadSection($sIni, $aSectionNames[$i]) If @error = 0 Then For $j = 1 To $aInhalt[0][0] If Not StringInStr($sData, "|" & $aInhalt[$j][0] & "|") Then $sData &= $aInhalt[$j][0] & "|" Next EndIf Next If StringRight($sData, 1) = "|" Then $sData = StringTrimRight($sData, 1) Local $aKeys[0] _ArrayAdd($aKeys, $sData) Return $aKeys EndFunc #Region eingebettete INI #cs [Latest-->] [BLP1-WX] EdgeVersion=105.0.1293.63 FirefoxVersion=103.0.3.8255 ChromeVersion=105.0.5112.102 OfficeVersion=16.0.10389.20033 [BLP3-WX] ChromeVersion=104.0.5112.102 EdgeVersion=104.0.1293.63 FirefoxVersion=103.0.2.8255 OfficeVersion=16.0.10389.20033 [BLP2-WX] EdgeVersion=104.0.1293.63 ChromeVersion=104.0.5112.102 FirefoxVersion=103.0.2.8255 OfficeVersion=16.0.10389.20033 [BLP4-WX] ChromeVersion=104.0.5112.102 EdgeVersion=105.0.1293.63 FirefoxVersion=104.0.2.8255 OfficeVersion=16.0.10389.20033 [BLP5-WX] ChromeVersion=104.0.5112.102 EdgeVersion=104.0.1293.63 FirefoxVersion=103.0.2.8255 OfficeVersion=16.0.10389.20033 [BLP6-WX] ChromeVersion=104.0.5112.102 EdgeVersion=104.0.1293.63 FirefoxVersion=103.0.2.8255 OfficeVersion=16.0.10389.20033 [WebDriver] ChromeVersion=104.0.5112.79 EdgeVersion=104.0.1293.63 FirefoxVersion=0.31.1 #ce #EndRegion eingebettete INI