Beiträge von alpines

    Nebenbei bemerkt ginge das ganze auch mit normalen Stringfunktionen, und das sogar sehr leicht wenn in den zufällligen Strings keine Delimeter auftauchen.

    Code
    1. Local $sSubject = "xyz1234-xyz12345-Suchstring\xyz123456"
    2. Local $sLinks = StringLeft($sSubject, StringInStr($sSubject, "\", 1, -1) - 1)
    3. Local $sErgebnis = StringTrimLeft($sLinks, StringInStr($sLinks, "-", 1, 2))
    4. ConsoleWrite($sErgebnis & @CRLF)

    Ich glaube, ich brauche einen Befehl, um nach einigen Zeilen das Fenster nach unten zu scrollen.


    Mit welchem Befehl kann ich das Fenster nach unten scrollen ?

    Ein Blick in die WebDriver Doku hätte dir die Antwort gegeben. Du kannst sogar direkt zu einem Element scrollen statt nur die Seite zu scrollen.

    To scroll into view an element perform the following steps only if the element is not already in view:

    1. Let options be the following ScrollIntoViewOptions:"behavior""instant"Logical scroll position "block""end"Logical scroll position "inline""nearest"
    2. On the element, Call(scrollIntoView, options).


    Sollte das zu kompliziert sein kannst du versuchen Javascript Code über die UDF auszuführen und dann einfach mit standard Javascript Code zu scrollen.

    Ein Blick in die Hilfe hätte ausgeholfen: https://www.autoitscript.com/a…s/_FileListToArrayRec.htm

    Multiple filters must be separated by ";" also *.txt;*.doc


    Lottich wieso hast du dafür eigentlich eine UDF gebraucht, mir fällt das grad erst jetzt auf.

    Wenn du nicht explizit regexen willst und nur mehrere Endungen brauchst tuts die Standard-UDF es doch auch.

    rel: Regex "Multipattern" möglich?


    (B) Was ist der einfachste Weg, um aus 2 Arrays 1 sortiertes Array zu machen, wenn die interne Struktur wie im obigen Beispiel indentisch ist?

    Beide zusammenfügen. Entweder manuell oder mit _ArrayAdd. Danach nach belieben _ArraySort verwenden.

    Musst aber aufpassen, dass dann in [0] nicht die Größe enthalten ist, da diese falsch sortiert wird bzw. du danach auch noch zwei Größen hast.

    Ich verstehe nicht wie du mit _InetGetSource Daten absendest. Du fordest damit nur eine Datei an.

    Wie schaut denn deine php aus? Erzeugt diese dann die Datenbankeinträge wenn du _InetGetSource aufrufst?


    Du schreibst ständig was von INSERT und UPDATE aber lieferst uns keine Hinweise wo das passiert, geschweige denn wie das passiert.


    ich will aber nicht am PC sitzen und immer wieder abfragen ob das nu 1 ist ?

    Dann musst du das in deiner php bewerkstelligen, dein Skript sollte nur einmal die Abfrage abschicken und die php sollte dann diese Abfragen verwalten.

    Dann muss das Skript auch nicht die ganze Zeit warten bis geschrieben worden ist.


    Speichere doch mit dem php-Skript alle Daten von den Clients ab und dann fang an sie zu inserten bzw. upzudaten.

    Du zeigst uns doch nicht mal deine Datenbank, deine Codeschnipsel sind auch nicht hilfreich.

    _InetGetSource liefert keine 1 zurück sondern den Quellcode zum Dokument, d.h. deine Abfrage ist schon falsch.


    der spieler der update machen will muss erst wissen ob kurt einen eintrag gemacht hat ?

    Das scheint ja deine InetGetSource-Abfrage zu sein, dort musst du prüfen ob das Dokument existiert oder nicht.


    Ich verstehe dein Problem nicht.

    Oscar einmal bitte moven.


    Da du uns deine Datenbankstruktur nicht gezeigt hast und dein Codeschnipsel ehrlich gesagt uns auch nicht weiterhilft können wir dir nur rudimentär aushelfen.

    Wenn du möchtest, dass 'weber' wartet bis 'kurt' die Datenbankeinträge geschrieben hat, so solltest du mit 'weber' prüfen ob er sie zu Ende geschrieben hat.


    Du weißt ja wer alles im Spiel vorhanden ist, also muss 'weber' warten, biss 'kurt' alle Einträge für turnier1 (für alle Spieler) erzeugt hat, dann kann 'weber' updaten.

    Wenn das nicht möglich ist, kannst du noch immer eine Spalte extra einfügen mit der Bezeichnung 'canUpdate' (oder ähnlich) wo 'kurt' dann diese Spalte 1 oder true setzt wenn 'weber' updaten darf.

    Schau dir mal die WM_SIZE Dokumentation an: https://docs.microsoft.com/en-…ws/desktop/winmsg/wm-size


    lParam

    The low-order word of lParam specifies the new width of the client area.

    The high-order word of lParam specifies the new height of the client area.


    Dort sind die entsprechenden Werte gespeichert, um allerdings die WindowMessages allgemein zu halten und so kompakt wie möglich zu gestalten hat man sich entschieden,

    in eine Variable zwei Werte zu packen.


    lParam ist ein DWORD, also 32-Bit Integer. Man teilt diesen 32-Bits einen Hi(gh) und Lo(w)-Bereich zu.

    DWORD = 32 Bit (double Word)

    WORD = 16 Bit (double Byte)

    Byte = 8 Bit


    00000000 00000000 00000000 00000000 = lParam (32-Bit)

    --------- HIGH ---------- ----------- LOW ----------


    Somit stehen im High 16-Bit und im Low ebenfalls 16-Bit zur Verfügung.

    16-Bit sind 2 Byte, d.h. der Zahlenraum erstreckt sich von -65536 bis +65535.


    Der Grund warum man hier beides in eine Variable stopft ist der, dass Fenster - für gewöhnlich - nicht bis 65000+ Pixel langgezogen werden.


    Das selbe Vorgehen kann man nochmal in HiByte/LoByte unterteilen, dort werden die 16-Bit Teile analog zum 32-Bit aufgeteilt, nur in 8-Bit Blöcken.

    Deine Buffer sind falsch. Es wird ein void* erwartet, d.h. du übergibst einen Pointer der auf ein unbestimmtes Datenfeld zeigt, der Typ kann nachträglich zu int, char, was auch immer gecastet werden.

    Was du übergibst ist ein void**. Schau dir an was in den Funktionen davon als Buffer verwendet wird (ich schätze mal int[] oder char[] respektive byte[]) und erzeug daraus ein Struct wessen Pointer du übergibst.


    Das gilt sowohl für pWBuffer als auch für pRBuffer.

    WinMove doch das Childfenster wenn dein Parent ein WM_SIZE bekommt.

    Also mein Problem ist, das es auch Artikel gibt, die zwar verfügbar sind aber nicht mehr angezeigt werden da kein TerminTagBS drin steht dort steht einfach nur NULL drin. Eine Lösung wäre es ja das ganze mit Order by zu sortieren und mit Top 1 nur den ersten auszugeben. Aber ich weiß nicht genau wie ich VOR dem Where den Order by befehl ausführen soll.

    Aber ich dachte du willst nur die aktuellsten Bestellungen ausgeben, und wenn da kein TerminTagBS gesetzt ist bedeutet das doch, dass niemand das Produkt bestellt hat.

    Kannst du vielleicht mal eine Beispieltabelle mit Daten in SQLFiddle basteln (kannst ja mein Template nehmen) und dann sagen was genau aus der Query rauskommen soll?

    Vielleicht kriege ich noch was dazu gebastelt aber aus deiner textuellen Beschreibung werde ich ehrlich gesagt nicht schlau.


    Du kannst grundsätzlich kein ORDER BY vor einem WHERE anwenden, weil das eh keinen Sinn machen würde, du kannst nur deine Ergebnistupel sortieren,

    sortierst du bevor du mit WHERE die Elemente prüfst wäre deine Ergebnismenge unsortiert.


    Möchtest du aus einer bereits sortierten Tabelle Daten queryen musst du sie in einer Unterquery starten, dort sortieren, und in der Hauptquery referenzieren, wie es BugFix bereits angesprochen hatte.

    Das macht aber nur bedingt Sinn, da du nicht auf die Subqueries von überall referenzieren kannst, deswegen müsstest du mehrere Subqueries haben und das ist zeitlich und speicherbedingt keine gute Idee.

    Da empfiehlt es sich eher eine Funktion zu schreiben welche mit einem Cursor deine Datenmenge iteriert, sortiert und ausgibt.

    Sowas wie RegEx, DLL-Calls oder ASM ist mir einfach zu kompliziert, da geht mir jede Logik ab.

    Ich hatte anfänglich auch sehr starke Probleme was DllCalls/Callbacks/Structs angeht aber es ist einfacher als es aussieht.


    ASM ist nun ein Thema was man wirklich vom Tisch wischen kann was AutoIt betrifft, das ist ja kein integraler Teil von AutoIt.

    Aber auch das lernt man wenn man sich langsam rantastet und einfach mal den x86-Befehlssatz durchprobiert.


    Kopf hoch, es ist noch kein Meister vom Himmel gefallen, jeder fängt klein an.

    Hallo Uwe und herzlich willkommen im AutoIt.de-Forum!


    Du benutzt als Fenstertitel immer [CLASS:#32770] und das kann so nicht gutgehen, da sowohl das Fenster "Sounds" als auch die "Eigenschaften" die selbe Klassennummer haben.

    (wie der Soundmixer unten rechts im Traymenu und tausend andere Programme auch)


    Also solltest du lieber das Fenster mit seinem Titel identifizieren um Duplikate zu vermeiden.

    Kopier dir die Titel aus dem Window Info Tool heraus und füg sie dort ein, du brauchst auch keine Advanced Identifier wie [TITLE:Blabla] zu nutzen. Blabla reicht vollkommen.

    Der Titel sollte aber linksvollständig sein (anpassbar mit der Opt: WinTitleMatchMode), da AutoIt ihn sonst nicht findet.


    Des Weiteren solltest du es vermeiden die Option "WinWaitDelay" so oft zu setzen, da sie nur einmal gesetzt werden muss und dieser Wert genommen wird bis er überschrieben worden ist.


    Da du bereits die ControlSend/GetText/...-Funktionen verwendest würde ich es dir auch anraten für das wechseln zwischen den Tabseiten ebenfalls ControlCommand zu nutzen.

    Es kann sein, dass, während dein Skript läuft, ein anderes Fenster auftaucht und dann würden deine Send-Befehle dorthin gesendet werden statt an das ursprüngliche Fenster.

    Dazu kannst du als Befehl TabLeft respektive TabRight verwenden.


    Du kannst ja die Anpassungen mal vornehmen und uns berichten ob es funktioniert :)

    Ich postuliere mal, dass >90% aller "Stringaufgaben" (gerade bei Anfängern) mit den einfachen Stringbefehlen hinzubekommen sind.

    Na klar, warum sich die Arbeit schwierig machen wenn es auch einfach geht.


    Ich persönlich nutze auch die normalen Stringfunktionen wo es geht, aber wenn ich gezielt Informationen aus einem Text extrahieren möchte dann ist RegEx mMn. einfach die komfortablste Variante,

    da man nicht über mehrere Zeilen mit Stringfunktionen alles parsen muss sondern ein Pattern nutzt und direkt alles im Array zurückbekommt.

    Und wenn ich es mit einem Pattern nicht hinbekomme alles zu extrahieren lass ich ein zweites Pattern oder Std-Stringfkt. drüberlaufen.


    regex101.com nutze ich auch immer. Falls Lottich sich das mal anschaut, solltest du dir die Flags rechts im Eingabefeld anschauen!!!

    Die musst du explizit im Pattern selber setzen wenn du sie in AutoIt umsetzt! Nicht dass du dich dort verklickst und dann den Flag im Pattern vergisst.


    /gm ist standardmäßig gesetzt, global ist standardmäßig gesetzt wenn du $STR_REGEXPARRAYGLOBALMATCH (3) verwendest.

    Das m steht für multiline und impliziert damit, dass ^ und $ Zeilenanfänge und -enden markieren und nicht die des gesamten Strings wie es bei AutoIt der Fall ist wenn du nicht explizit (?m) verwendest.

    So oft brauch ich RegEx nicht...

    Wenn du mal Zeit findest solltest du dich trotzdem an ein paar Pattern versuchen, so dass du ein Gefühl bekommst was man machen muss um das zu extrahieren was man kriegen muss.

    Ich bin selber kein Profi (und davon auch sehr weit entfernt), aber kriege (wenn auch miese) Pattern hin, womit ich an meine Daten komme.

    Mit ein paar Standardbegriffen wie . + ? ?: () | \d \\ [] ^ {} ?i ?s und dem Wissen was sie wo bedeuten reicht das schon.


    RegEx ist praktisch das Schweizer Taschenmesser für Stringverarbeitung.

    Da deine Dateiendung direkt in das Pattern gefüttert wird kannst du einfach das entsprechende RegEx übergeben.

    Nimm als Pattern mal folgendes (endung1|endung2). Das ?: (don't capture this group) kann man weglassen (habs nicht eingefügt), da das StringRegExp in der UDF nur True/False zurückgibt und nicht die Funde.


    Jetzt weißt du wie man mehrere Dateiendungen suchen kann, also kannst du auch die Funktion dementsprechend umbauen :)