Beiträge von Musashi
-
-
-
Werden mehrere der Kombinationen abgefragt, muss gesichert werden, dass diese nicht falsch verknüpft werden. Dazu einfach die einzelnen Ausdrücke einklammern.
Allgemein : Das Setzen von Klammern ist unbestritten und dient zudem der Übersichtlichkeit .
Hier mal deine Befehlszeile, so, wie AutoIt sie Interpretiert (And hat eine höhere Priorität als Or)
[...]
Du hast somit ein: If A And B Or C And D
A & B & D müssen somit wahr sein, damit der gesamte Ausdruck wahr ist.
Ob And aber (in AutoIt) eine höhere Priorität als Or besitzt, da bin ich mir nicht so sicher.
Laut Operatoren liegen sie auf der gleichen Prioritätsebene.
Wenn zwei Operatoren die gleiche Priorität besitzen, wird der Ausdruck von links nach rechts ausgewertet.
AutoItLocal $bA, $bB, $bC, $bD $bA = True $bB = False $bC = True $bD = True If $bA And $bB Or $bC And $bD Then MsgBox(BitOR(4096, 64), "Ergebnis", "1. Vergleich = TRUE") Else MsgBox(BitOR(4096, 64), "Ergebnis", "1. Vergleich = FALSE") EndIf
Hätte And eine höhere Priorität, dann müsste hier FALSE herauskommen.
Da ich solche Konstrukte aber seit Urzeiten auch immer in Klammern setze, mag ich hier durchaus falsch liegen
.
(in z.B. Pascal hat And eine höhere Priorität als Or, bei AutoIt aber offenbar nicht)
Gruß Musashi
-
-
Sind die Grünen Felder im Bild q wichtig für die Ordnung der Range?
Wichtig schon, im Sinne des Verständnisses, nicht für den Programmablauf. Es handelt sich um Kommentare, mit denen Bitnugger Dir die Zuordnung verdeutlichen wollte.
Gruß Musashi
-
Ich bin jedenfalls generell der Meinung, dass es eh kein guter Stil ist, Variablen innerhalb von Schleifen Do...Until, While...Wend, For...Next, oder einer If...Then...Else...Endif-Anweisung zu deklarieren.
Täter-Opfer-Umkehr?
[...]
Ich sehe nicht ein winziges bisschen ein warum ich meinen Programmierstil (der eben auf verbreiteten Grundsätzen beruht) an einen Bug in einem anderen Programm anpassen muss, welches für den Betrieb meines Programmes völlig irrelevant ist.(OT)
Könnte man sich ggf. darauf einigen, dass es hinsichtlich 'Guter Programmierstil" einen allgemeinen und einen sprachabhängigen Bereich gibt
?
In z.B. AutoIt verwende ich, wie viele andere auch, Typenpräfixe (also $aArr, $sString usw.). In Pascal mache ich das nicht, da dort die Variablen typisiert werden müssen (MaxPos : Integer;).
Das ist wie im realen Leben. Es gibt meines Wissens keine Kultur in der man es schätzt, wenn einem in die Kronjuwelen getreten wird. Auf den sozialistischen Bruderkuss kann ich, aus ästhetischen und auch hygienischen Gründen, allerdings herzlich gerne verzichten
.
Gruß Musashi
-
OK, dass ControlGetPos kein Array zurückliefert, und damit ...- $Start_Bar[3]-25) einen Error wirft, hat BugFix bereits angesprochen.
Eine Möglichkeit (auf die Schnelle) wäre z.B. :
AutoIt
Alles anzeigen#include <GUIConstants.au3> #include <IE.au3> #include <StaticConstants.au3> #include <MsgBoxConstants.au3> Local $hMain_App = GUICreate("Browser") Local $oIE = _IECreateEmbedded() Local $CtrlObj = GUICtrlCreateObj($oIE, 0, 0, @DesktopWidth, @DesktopHeight) Local $msg, $ping $ping = Ping("www.google.com") If $ping > 0 then _IENavigate($oIE, "https://google.com") ConsoleWrite($oIE.left & @CRLF & $oIE.top & @CRLF & $oIE.width & @CRLF & $oIE.height & @CRLF) WinMove($hMain_App, "Browser", $oIE.left, $oIE.top, $oIE.width, $oIE.height-250) Else MsgBox($MB_OK, "Fehler", "Sie können nur dieses Programm starten, wenn Ihre Internetverbindung aktiv ist. Bitte versuchen Sie es erneut.") GUIDelete($hMain_App) Exit EndIf GUISetState() While True $msg = GUIGetMsg() If $msg = $GUI_EVENT_CLOSE Then ExitLoop Wend GUIDelete($hMain_App)
Gruß Musashi
-
Leider überschreitet das absolut meine Inkompetenz und suche jemand der mir dabei helfen kann
Sollte die Aufgabe Deine Inkompetenz absolut überschreiten, dann könntest Du sie wahrscheinlich selbst lösen
.
Spaß beiseite.
So wie ich das sehe, wäre die Funktion StringFormat Dein Freund (ggf. noch etwas RegEx).
Poste einfach mal eine CSV-Datei mit Angabe von max. Längen und Formatierungsregeln.
Gruß Musashi
-
Muss wohl am Montag liegen, aber 100% genau weiß ich immer noch nicht, was Du möchtest
.
Du könntest mal folgendes probieren (Quelle : web-screenshot von KaFu )
AutoIt
Alles anzeigen#include <IE.au3> #include <WinAPI.au3> #include <ScreenCapture.au3> #include <WindowsConstants.au3> _WebCaptureTest("https://autoit.de/wcf/", "autoit.de.png") ShellExecute(@ScriptDir & "\autoit.de.png") Func _WebCaptureTest($Url, $ImageName) Local $hBmp = _WebCapture($Url, 1280) _ScreenCapture_SaveImage($ImageName, $hBmp, True) EndFunc ;==>_WebCaptureTest Func _WebCapture($Url, $WebWidth = 1024) Local $oIE = ObjCreate("Shell.Explorer.2") Local $hGUI = GUICreate("", $WebWidth, 768, -1, -1) Local $cObj = GUICtrlCreateObj($oIE, 0, 0, $WebWidth, 768) _IELoadWaitTimeout(20000) ; 20 sec _IENavigate($oIE, $Url) _IELoadWait($oIE) Local $oDocument = $oIE.document Local $oBody = $oIE.document.body Local $oHtml = $oIE.document.documentElement $oBody.scroll = "no" $oBody.style.borderStyle = "none" $oHtml.style.overflow = 'hidden' $oBody.style.overflow = 'hidden' Local $oIViewObject2 = ObjCreateInterface($oDocument, "{00000127-0000-0000-C000-000000000046}", "Draw hresult(dword;long;ptr;ptr;handle;handle;struct*;struct*;bool;ulong_ptr);") If @error Then Return SetError(1, 0, 0) Local $BodyWidth = $oBody.scrollWidth Local $BodyHeight = $oBody.scrollHeight Local $RootWidth = $oHtml.scrollWidth Local $RootHeight = $oHtml.scrollHeight Local $Width = $BodyWidth Local $Height = $RootHeight If $BodyHeight > $Height Then $Height = $BodyHeight $oIE.width = $Width $oIE.height = $Height Local $hDC = _WinAPI_GetDC(0) Local $hMemDC = _WinAPI_CreateCompatibleDC($hDC) Local $hBmp = _WinAPI_CreateCompatibleBitmap($hDC, $Width, $Height) _WinAPI_SelectObject($hMemDC, $hBmp) Local $sRECT = DllStructCreate($tagRECT) DllStructSetData($sRECT, "Top", 0) DllStructSetData($sRECT, "Left", 0) DllStructSetData($sRECT, "Right", $Width) DllStructSetData($sRECT, "Bottom", $Height) $oIViewObject2.Draw(1, -1, 0, 0, $hDC, $hMemDC, $sRECT, 0, 0, 0) _WinAPI_DeleteDC($hMemDC) _WinAPI_ReleaseDC(0, $hDC) GUIDelete($hGUI) Return $hBmp EndFunc ;==>_WebCapture
Gruß Musashi
-
Sollte(n) die Website(s) Captchas verwenden oder den automatisierten Upload per Nutzerbedingungen verbieten, dann wäre eine weitere Hilfestellung gemäß unserer Forenregeln nicht mehr möglich. Könntest Du daher bitte mal die entsprechenden Links posten.
Musashi Danke für deine Antwort. spreadshirt.de ist die Seite.
Ok !
Ich vermute stark, dass Du dort ein sogenanntes "Partner Account" hast (wahrscheinlich mit einer eigenen Shopseite). Daher habe ich deren AGB und auch die gesonderten Partner-AGB mal überflogen. Ein Verbot, Designs mittels Automatisierung der Upload-Seite hochzuladen, konnte ich so nicht finden. Das ist aber nur meine private Interpretation, keinesfalls eine rechtsverbindliche Bewertung !
Raupi / Gun-Food : Falls ihr trotzdem ein Problem seht, dann holt bitte den Hammer 'raus
Um geneigten Helfern eine Vorstellung des Ablaufes zu geben, wäre folgendes sinnvoll :
- Screenshot(s) der Uploadseite (n)
- Persönliche Daten wie z.B. Deine Shopadresse bitte unkenntlich machen, da das Forum keine Werbeplattform darstellt
- Beschreibung des Uploadprozesses in kurzen Sätzen
- in welcher Form liegen die hochzuladenen Daten vor (wahrscheinlich als Tabelle mit Pfaden)
Gruß Musashi
-
Wieso ist wäre dies alles andere als sinnvoll? Ist diese Methode fehlerbehaftet oder arbeitet dadurch auoit sehr langsam?
[Anmerkung : gemeint ist /AutoIt3ExecuteLine bzw. /AutoIt3ExecuteScript ]
(Ich beschreibe die Dinge nachfolgend mal vereinfacht)
Diese "Methode" ist nicht im eigentlichen Sinne "fehlerbehaftet" oder sonst etwas - Du benötigst sie schlicht und ergreifend nicht. Zudem birgt sie gewisse Risiken, da z.B. jemand Schadcode in die Exceldatei einbauen könnte.
An Alle : Jetzt bitte keine Diskussion über die Sicherheit von AutoIt-Skripten im Allgemeinen
Es heißt übrigens AutoIt , nicht Auto it oder auoit )
Die Betreiber der T-Shirt Plattform Seiten, sehen es nicht gern, dass "Bots" die Designs hochladen, dementsprechend gibt es immer wieder Änderungen an den Websiten.
Die Webdriver-UDF greift z.B. über Control-IDs auf die Buttons zu, nicht mittels Mausklick auf eine bestimmte XY-Position. Es spielt daher keine Rolle WO sich ein Button befindet. Hinzu kommen die von water angesprochenen Aspekte (Bildschirmauflösung, Fensterposition usw.).
Sollte der jeweilige Webseitenbetreiber allerdings auch die Control-IDs ändern, dann musst Du eh Anpassungen vornehmen.
Ich würde vorschlagen, Du machst Dich erst mal ein wenig mit Loops (Schleifen) und Arrays vertraut, dann sehen wir weiter. Wahrscheinlich wirst Du dann selbst feststellen, dass der Umweg (AutoIt-Quellcode in Excel) unsinnig ist.
Wichtige Anmerkung zu : "Die Betreiber ... sehen es nicht gern, ..." :
Sollte(n) die Website(s) Captchas verwenden oder den automatisierten Upload per Nutzerbedingungen verbieten, dann wäre eine weitere Hilfestellung gemäß unserer Forenregeln nicht mehr möglich. Könntest Du daher bitte mal die entsprechenden Links posten.
Gruß Musashi
-
Hi Bernd Albrecht :
Was die Ergänzungen von water angeht, das sehe ich genauso !
Wahrscheinlich haben wir es hier mal wieder mit dem beliebten XY_Problem zu tun
.
Sodann hätte ich gerne, dass AutoIt von der Zelle A1, welche es gelesen hat, den Code ausführt welchen ich vorher dort in die Excel Datei reingeschrieben habe.
[...]
In der Exceldatei in Zelle A1 steht folgender Code :
ShellExecute("https://google.de")
sleep(500)
...
So wie ich das verstehe, enthalten die Excel-Zellen nicht (nur) die jeweiligen Namen der hochzuladenen Dateien, sondern komplette Quellcodesequenzen, die eingelesen und innerhalb von AutoIt ausgeführt werden sollen. Das wäre mit z.B. RunWait(@AutoItExe & ' /AutoIt3ExecuteLine ' & $sCommand) zwar bedingt möglich, aber alles andere als sinnvoll.
Beiße Dich daher nicht zu sehr in Excel fest. Beschreibe was Du erreichen möchtest, also z.B. :
- ich habe X Dateien (Dateiliste liegt in Excel, CSV o.Ä. vor)
- diese möchte ich an folgende Adresse hochladen
- es werden ggf. Logindaten benötigt
usw.
Gruß Musashi
-
-
(Vorab : es ist schon spät, daher bin ich bereits etwas platt im Kopf
)
Es wäre zwar möglich, einen eingelesenen Text als Code innerhalb von AutoIt auszuführen, aber das ist selten notwendig und in der Regel auch nicht zu empfehlen.
In AutoIt gibt es sogenannte Schleifen (Loops).
Die bei jedem Durchlauf benötigten Werte kann man z.B. in einem Array ablegen. Bei Dir wären das wohl die jeweiligen XY-Werte für die Mausklicks, oder?
Beschreibe mal etwas genauer, was Du erreichen möchtest.
Gruß Musashi
-
Ist das überhaupt möglich, das was ich vorhabe?
Die Frage sollte wohl eher lauten : "Ist das überhaupt sinnvoll, was ich dort vorhabe ?"
Warum willst Du den Umweg über Excel gehen ? Schreibe die Befehle doch gleich in Dein AutoIt-Skript.
Gruß Musashi
-
Gibt es eine einfache Möglichkeit, eine GUI beim nächsten Start des Scripts an der Position zu öffnen, wo sie der Benutzer beim letzten Mal hingeschoben hat?
Du könntest z.B. mittels WinGetPos die aktuelle Position und Größe des laufenden (aktiven) GUI's ermitteln und beim Beenden des Skriptes in eine .ini-Datei schreiben. Startest Du das Programm erneut, dann lese die Werte aus der .ini wieder ein. Sollten sie sich von den Defaults unterscheiden, dann öffne das GUI mit diesen Werten.
Du kannst auch mal einen Blick in den Thread WindowPlacement werfen.
Gruß Musashi
-
-
Wenn ich zur Zeit (09.06.2020 / 16:30) die Onlinehilfe von AutoIt aufrufe, dann erhalte ich einen 404 Not Found Error ! Das betrifft (logischerweise) auch alle Suchergebnisse von z.B. Google zu einzelnen Funktionen etc.
Gruß Musashi
-
Och wie gerne würde ich einfach ein scheußliches Proof-Of-Concept basteln nur um dir zu zeigen, dass es doch möglich ist, aber ich weiß ja wie du das gemeint hast
Und dafür bin ich Dir auch dankbar
.
Dass es diverse 'Tricksereien' gibt um ein Standardverhalten zu umgehen, habe ich auch schon des Öfteren gesehen. Ob der TE damit am Ende aber glücklich wird, wage ich (und Du wahrscheinlich auch) zu bezweifeln.
Der TE wollte übrigens mMn. einen Teil des Strings blinken lassen, das ist mit dem Standardlabel nicht möglich
Stimmt (hatte ich ja auch angesprochen).
HansJ54 :
Stellt sich die Frage, ob ein solcher (für meinen Geschmack eh nerviger) Effekt, den Aufwand wert ist ?
Gruß Musashi
-
Ich möchte einen Teil eines Textes (langer String) in rot, bold und blinkend darstellen. Ich habe nichts dazu gefunden, obwohl es sicher einfach geht?
Ob das sooo einfach geht, bin ich mir nicht mal sicher !
Hier ein absoluter Schnellschuss bzgl. 'blinkendes Label", allerdings das komplette.
Um einen Teil des Labels blinken zu lassen, benötigt man wohl GDI+
.
AutoIt
Alles anzeigen#include <ColorConstants.au3> #include <GUIConstantsEx.au3> #include <FontConstants.au3> Global $idMsg, $hForm, $idLabel, $bColor1 = True $hForm = GUICreate("Blinking Label", 300, 60, -1, -1) $idLabel = GUICtrlCreateLabel("Text des blinkenden Labels", 5, 5, 290, 25) GUICtrlSetFont($idLabel, 12, $FW_BOLD) GUICtrlSetColor($idLabel, $COLOR_RED) GUISetState(@SW_SHOW) AdlibRegister("_BlinkingLabel") While True $idMsg = GUIGetMsg() Select Case $idMsg = $GUI_EVENT_CLOSE ExitLoop EndSelect WEnd AdlibUnRegister("_BlinkingLabel") Func _BlinkingLabel() If $bColor1 Then GUICtrlSetColor($idLabel, $COLOR_RED) $bColor1 = False Else GUICtrlSetColor($idLabel, $COLOR_BLUE) $bColor1 = True EndIf EndFunc
Würde mich aber auch für den Text in einer MsgBox interessieren.
In der Standard-Messagebox geht das nicht - dafür müsste man sich eine eigene GUI-MessageBox erstellen.
Gruß Musashi