_FileWriteLog($LogPath, $Message)
kann das für dich übernehmen.
Beiträge von BugFix
-
-
Dann setze einen Zähler in die Schleife. Irgendeine Abbruchmöglichkeit wirst du ja haben. Nach Beendigung der Schleife gibst du den Zähler in einer MsgBox aus.
-
Naja, wenn die Gefahr besteht
:Spoiler anzeigen
[autoit]Func makedate()
[/autoit]
$i_count = ControlCommand ( $gui, "", $edit, "GetLineCount", "" )
For $i = 1 To $i_count
$text = ControlCommand ( $gui, "", $edit, "GetLine", $i)
$pos = StringInStr($text, '/')
If $pos = 1 Then
_ArrayAdd( $array2, $text )
Else
_ArrayAdd( $array2, StringTrimLeft($text, $pos-1) )
EndIf
Next
GUICtrlSetData($edit, '' )
For $i = 1 To UBound($array2)-1
GUICtrlSetData($edit, $array2[$i] & @CRLF, 1)
Next
ReDim $array2[1]
EndFunc
So kannst du es problemlos öfter ausführen. -
OK, das Problem liegt mal wieder in den Fehlerhaften UDF zum Edit.
So funkt es
[autoit]
(getestet)Func makedate()
[/autoit]
$i_count = ControlCommand ( $gui, "", $edit, "GetLineCount", "" )
For $i = 0 To $i_count
$text = ControlCommand ( $gui, "", $edit, "GetLine", $i_count) ; Zeilentext
$pos = StringInStr($text, '/') ; Position von '/' suchen
_ArrayAdd( $array2, StringTrimLeft($text, $pos-1) ); alles davor abschneiden
Next
GUICtrlSetData($edit, '' )
For $i = 1 To UBound($array2)-1
GUICtrlSetData($edit, $array2[$i] & @CRLF, 1)
Next
EndFuncEdit: Kopierfehler für Variable $text
$text = ControlCommand ( $gui, "", $edit, "GetLine", $i_count)
RICHTIG:
$text = ControlCommand ( $gui, "", $edit, "GetLine", $i) -
Ich glaub nicht das das so geht Xeno.
Dann wird jedes Mal der vorhandene Inhalt des Editfensters gelöscht.Hier mal Lesen und Ersetzen in einem Aufwasch.
Spoiler anzeigen
[autoit]Func makedate()
[/autoit]
$i_count = _GUICtrlEditGetLineCount ( $edit )
For $i = 1 To $i_count
$text = _GUICtrlEditGetLine($edit, $i) ; Zeilentext
$pos = StringInStr($text, '/') ; Position von '/' suchen
$text = StringTrimLeft($text, $pos-1) ; alles davor abschneiden
$i_Char = _GUICtrlEditLineIndex ( $edit , $i ) ; Index erstes Zeichen der Zeile
$len_Line = _GUICtrlEditLineLength ( $edit , $i ) ; Länge der Zeile
_GUICtrlEditSetSel ( $edit, $i_Char, $i_Char+$len_Line-1 ) ; Zeile markieren
_GUICtrlEditReplaceSel ( $edit, 1, $text ) ; markierten Bereich mit gekürztem Text ersetzen
Next
EndFunc -
Der Fehler liegt hier:
[autoit]For $i = 1 To $i_count
[/autoit]
GUICtrlSetData($edit, "/" & $array2[$i])
Next
[autoit]
Du hast den Parameter zum Anfügen vergessen:For $i = 1 To $i_count
[/autoit]
GUICtrlSetData($edit, "/" & $array2[$i], 1)
Next -
Weil du nicht die Änderung vorgenommen hast, die ich dir gesagt habe.
Du solltest NUR in der Deklaration statt "Global $Switch = 0" auf "Global $Switch = 1" ändern.
Stattdessen änderst du im Code der Funktion "mnuLangClick()" und vergißt dort den $Switch-Parameter anzupassen.Es ist nicht gerade hilfreich, wenn du die angebotene Lösung nicht übernimmst und stattdessen neue Fehler produzierst. Dann muß ich jedesmal kpl. alles durchwursteln um die Fehler zu finden.
Übrigens, schmeiß bloß das _IsPressed() aus deinem Code. Schau dir die Arbeitsweise dieser Funktion genau an, dann wirst du merken, dass sie so nicht einsetzbar ist.
Und was soll dieses Konstrukt bewirken?
Spoiler anzeigen
[autoit]While $i = 0
[/autoit]
If _IsPressed (24) Then
GUISetState(@SW_SHOW)
Sleep (800)
$i = +1
EndIf
WEndZum Schleife Verlassen gibt es ExitLoop()

-
:lol: Da du die Controls mit EN vorbelegst und auf EN gewechselt wird wenn "$Switch = 0" und genau das deine Starteinstellung ist!
Also setze in der Variablendeklaration "$Switch = 1" und dann klappts auch. -
Der ganze String wird untersucht und er enthält einen Bestandteil auf den das Suchmuster zutrifft - ergo: Wahr.
Das hängt mit der Arbeitsweise der RegexEngine zusammen. Es wird Zeichen für Zeichen geprüft. Und nach "123." ist bereits die Bedingung erfüllt.
Es wird dann weiter geprüft, ob noch weitere Treffer vorhanden sind.
"123.456." würde 2 Treffer liefern: "123." und "456."Wenn du aber möchtest, dass der String in voller Länge als Match erscheinen soll, mußt du dein Pattern daraufhin anpassen, dass ausschließlich bei Vorliegen dieser Bedingung ein Match erfolgt.
Edit: Dein Suchmuster sagt: ( (Zahl) n-mal und dann ein Punkt ) n-mal
Noch ein Nachtrag:
Hier gibt es Unterschiede im Verhalten der RegEx-Engines.
Hab es jetzt mal noch in einem andren RegEx-Programm getestet, da wird dein Pattern für den vollen Match anerkannt.
Da hatte ich mich auch etwas vertan, du beendest ja mit '+', also Auftreten mindestens einmal. Insofern hast du natürlich recht, dass ein Match dann vorher nicht auftreten kann. Da hatte ich doch irgendwie ein '*' im Auge
- muß am Wetter liegen.
Also, ich revidiere mich. Dein Pattern sollte eig. funktionieren (allerdings auch bei weniger als 3 Ziffern, Hauptsache Punkt folgt). Dass das nicht funzt scheint wohl eine Eigenheit der Autoit-Regex-Engine zu sein. -
Dein Pattern besagt:
"([0-9]+\.)+"
die Ziffern 0-9 beliebig oft
gefolgt von einem Punkt
alles beliebig oft.
Diese Bedingung ist bereits mit "123." erfüllt. Wäre auch nur mit "1." erfüllt.
Demzufolge ist die Abfrage wahr, da ein auf das Pattern zutreffender String in deinem Suchstring enthalten ist.Edit:
[autoit]
Das siehst du, wenn du dir die Matches anzeigen läßt:#include <array.au3>
[/autoit]
$ret = StringRegExp("123.45", "([0-9]+\.)+", 3)
_ArrayDisplay($ret)Hiermit sucht er nach: ( Zahl-Zahl-Zahl-Punkt ) - 2-mal
[autoit]$ret = StringRegExp("123.464.", "([0-9]{3}\.){2}")
[/autoit]
MsgBox(0, "return", $ret) -
[autoit]
$arControl[18] GUICtrlCreateMenuItem ("Englisch", $arControl[15])
[/autoit]
[autoit]
da fehlt die Zuweisung
$arControl[18] = GUICtrlCreateMenuItem ("Englisch", $arControl[15])
[/autoit] -
Poste bitte die Fehlermeldung aus der Scite-Console.
Und noch was:
Bitte rücke deinen Code nur ein, wo Unterprogrammschritte laufen, also innerhalb von Schleifen und Statements.
Ansonsten wird das viel zu unübersichtlich. -
Schau in der Registry, unter welchem Schlüssel der InstallPath eingetragen wird.
[autoit]
Das fragst du beim Programmstart ab. Ist es nicht installiert bringt die Funktion einen Fehler. Daraufhin installierst du dotnet und anschließend die Produkt-SW.
Tritt kein Fehler auf kannst du sofort die Produkt-SW installieren$Path = RegRead ( "HKEY_LOCAL_MACHINE\SOFTWARE\.....", "InstallDir" )
[/autoit]
If @error Then
; nicht installiert ==> Installroutine dotnet starten
EndIf
; Installcode Produkt-SW -
Ich hab mal noch eine Verbesserung vorgenommen.
Mit Blick auf eine möglichst geringe Speicherbelegung ist es günstiger, die INI nur bei Bedarf auszulesen und das Array anschließend zu leeren.
Somit wird auch nur noch eine ArrayTitle-Variable benötigt.Spoiler anzeigen
[autoit]Global $arTitle
[/autoit]
;...
;...
Func mnuLangClick()
Switch $Switch
Case 0
$arTitle = IniReadSection($INIPath, 'EN') ; Array Sektion EN einlesen
$Switch = 1
Case 1
$arTitle = IniReadSection($INIPath, 'DE') ; Array Sektion DE einlesen
$Switch = 0
EndSwitch
SetTitle($arTitle)
$arTitle = 0 ; Array wieder aus dem Speicher entladen
EndFunc
Ein Tipp noch. Auch wenn du multilingual arbeitest, solltest du immer bei der Controlerstellung einen Titel verwenden - also
"GUICtrlCreateMenuItem("Open", $arCtrl[1])"
statt
"GUICtrlCreateMenuItem("", $arCtrl[1])".
Anschließend auf die Systemsprache prüfen und ggf. neu setzen.
Ansonsten hast du keine Einträge bei den MenüItems ;). -
Hi Alina,
ich habe mal mein Skript reingestellt und kommentiert, das das vielleicht etwas deutlicher macht.
Schau mal hier: Hilfe bei Arbeit mit IE.au3 -
Hi,
da recht häufig Anfragen kommen, wie denn auf Objekte in Websites zugegriffen wird, stelle ich mal mein Skript rein, mit dem ich Form- und Element- Index aller verfügbaren Formelemente einer Seite ermittle.
Ich habe auch alles kommentiert, damit ihr wißt, was dort passiert.Spoiler anzeigen
[autoit]#include <ie.au3>
[/autoit] [autoit][/autoit] [autoit]Global $url = "http://www.autoit.de/jgs_portal.php?sid="
[/autoit] [autoit][/autoit] [autoit]
Global $oIE = _IECreate($url) ; IE-Objekt für die URL erstellen
; übrigens:
; _IELoadWait ist nicht notwendig, der 4.te Parameter von _IECreate ist bereits per default auf "wait" gesetzt!
Global $i = 0, $k = 0$oForm = _IEFormGetCollection($oIE) ; Objekt mit allen Formen der URL erstellen
[/autoit] [autoit][/autoit] [autoit]
If IsObj($oForm) Then
For $form In $oForm ; für jede Form im Objekt Form
$oElement = _IEFormElementGetCollection($form) ; Zusammenstellung aller Formelemente dieser Form
If IsObj($oElement) Then
For $element In $oElement ; für jedes Element dieser Form
ConsoleWrite('Form: ' & $i & ', Element: ' & $k & ' ' & $element.name & @CRLF)
; Index von Form / Element und Name des Elements in Console schreiben
$k += 1 ; Elementindex um eins erhöhen
Next
EndIf
$i += 1 ; Formindex um eins erhöhen
$k = 0 ; Elementindex auf Null zurücksetzen
Next
EndIf_IEQuit($oIE) ; Objekt IE löschen
[/autoit]
Edit: Hier mal noch analog zum Ermitteln des Table-Index:Spoiler anzeigen
[autoit]#include <ie.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <array.au3>
Global $url = "http://www.autoit.de/jgs_portal.php?sid="
Global $oIE = _IECreate($url) ; IE-Objekt für die URL erstellen
Global $arTable, $i = 0$oTable = _IETableGetCollection($oIE) ; Objekt mit allen Tabellen der URL erstellen
[/autoit] [autoit][/autoit] [autoit]
If IsObj($oTable) Then
For $table In $oTable ; für jede Tabelle im Objekt Tabellen
_ArrayDisplay(_IETableWriteToArray($table), 'Tabellen-Index: ' & $i) ; gibt Tabelle in ein Array aus
$i += 1
Next
EndIf_IEQuit($oIE) ; Objekt IE löschen
[/autoit] [autoit][/autoit] [autoit]; Tabellen sind beim Auslesen meist gespiegelt
[/autoit]
; Mit _Array2DMirror() aus meiner Signatur könnt ihr sie wieder 'zurückspiegeln' -
Ob das geht, weiß ich nicht. Das Problem ist immer die Adressen zu finden. Clevere Spiele benutzen dynamische Adressen. Wie du da die richtigen findest (Pointer-Offset beachten), habe ich aber schon mal in einem Thread kurz erläutert. Also bemühe mal die Suche.
Bots sind hier nicht sooo beliebt. Für rein programmtechnische Fragen bekommst du natürlich immer Unterstützung.
Falls du es nicht kennst, such mal nach "Ollydbg". -
Hi Manu,
das ist wirklich ziemlich unstrukturiert.

Und meine Codebeispiele waren nur Beispiele und nicht direkt auf dein Programm bezogen. Insofern bringt es wenig diesen Code unangepaßt reinzukopieren.
Ich habe dir hier mal ein Muster erstellt. Die benötigte INI-Datei habe ich als Kommentarblock vorangestellt. Mußt du also nur in den Editor kopieren und als "Language.INI" abspeichern.
Spoiler anzeigen
[autoit]#cs
[/autoit] [autoit][/autoit] [autoit][EN]
[/autoit] [autoit][/autoit] [autoit]
1=ENGLISH
2=File
3=Open
4=Save
5=Delete
6=Edit
7=Copy
8=Paste
9=?
10=Help
11=Choose German Language
[DE]
1=DEUTSCH
2=Datei
3=Öffnen
4=Speichern
5=Löschen
6=Bearbeiten
7=Kopieren
8=Einfügen
9=?
10=Hilfe
11=Wähle Englisch#ce
[/autoit] [autoit][/autoit] [autoit]#include <GUIConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
Opt("GUIOnEventMode", 1)Global $arControl[11], $Switch = 0
[/autoit] [autoit][/autoit] [autoit]
Global $INIPath = @ScriptDir & '\Language.INI'
Global $arTitleEN = IniReadSection($INIPath, 'EN')
Global $arTitleDE = IniReadSection($INIPath, 'DE')$arControl[0] = GUICreate("DEUTSCH", 633, 454, -1, -1)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
$arControl[1] = GUICtrlCreateMenu("Datei")
GUICtrlSetOnEvent(-1, "mnuFileClick")
$arControl[2] = GUICtrlCreateMenuItem("Öffnen", $arControl[1])
GUICtrlSetOnEvent(-1, "mnuOpenClick")
$arControl[3] = GUICtrlCreateMenuItem("Speichern", $arControl[1])
GUICtrlSetOnEvent(-1, "mnuSaveClick")
$arControl[4] = GUICtrlCreateMenuItem("Löschen", $arControl[1])
GUICtrlSetOnEvent(-1, "mnuDelClick")
$arControl[5] = GUICtrlCreateMenu("Bearbeiten")
GUICtrlSetOnEvent(-1, "mnuEditClick")
$arControl[6] = GUICtrlCreateMenuItem("Kopieren", $arControl[5])
GUICtrlSetOnEvent(-1, "mnuCopyClick")
$arControl[7] = GUICtrlCreateMenuItem("Einfügen", $arControl[5])
GUICtrlSetOnEvent(-1, "mnuPasteClick")
$arControl[8] = GUICtrlCreateMenu("?")
GUICtrlSetOnEvent(-1, "mnuHelpClick")
$arControl[9] = GUICtrlCreateMenuItem("Hilfe", $arControl[8])
GUICtrlSetOnEvent(-1, "mnuHelClick")
$arControl[10] = GUICtrlCreateMenuItem("Wähle Englisch", $arControl[8])
GUICtrlSetOnEvent(-1, "mnuLangClick")
GUISetState(@SW_SHOW)While 1
[/autoit] [autoit][/autoit] [autoit]
Sleep(100)
WEndFunc Form1Close()
[/autoit] [autoit][/autoit] [autoit]
Exit
EndFunc
Func mnuLangClick()
Switch $Switch
Case 0
SetTitle($arTitleEN)
$Switch = 1
Case 1
SetTitle($arTitleDE)
$Switch = 0
EndSwitch
EndFunc
Func SetTitle(ByRef $ARRAYTITLE)
For $i = 0 To UBound($arControl) -1
If $i = 0 Then
WinSetTitle($arControl[0], '', $ARRAYTITLE[1][1])
Else
GUICtrlSetData($arControl[$i], $ARRAYTITLE[$i+1][1])
EndIf
Next
EndFunc
Func mnuCopyClick()EndFunc
[/autoit] [autoit][/autoit] [autoit]
Func mnuDelClick()EndFunc
[/autoit] [autoit][/autoit] [autoit]
Func mnuEditClick()EndFunc
[/autoit] [autoit][/autoit] [autoit]
Func mnuFileClick()EndFunc
[/autoit] [autoit][/autoit] [autoit]
Func mnuHelClick()EndFunc
[/autoit] [autoit][/autoit] [autoit]
Func mnuHelpClick()EndFunc
[/autoit] [autoit][/autoit] [autoit]
Func mnuOpenClick()EndFunc
[/autoit] [autoit][/autoit] [autoit]
Func mnuPasteClick()EndFunc
[/autoit] [autoit][/autoit] [autoit]
Func mnuSaveClick()EndFunc
[/autoit] -
Zitat
aber wir erstellen doch dann auch brav die GUI dazu, oder?
Genau, mach das!

-
ich bin mir nicht ganz sicher was du erreichen möchtest. Benenne genau welches Control was machen soll.
Also das übliche "Vorher-Aktion-Nachher" - Szenario.Deine Fragestellung ist mir momentan zu allgemein.