1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. misterspeed

Beiträge von misterspeed

  • Drag & Drop einer Datei in externes Programmfenster automatisieren

    • misterspeed
    • 24. Juni 2013 um 11:49

    Danke hab den Thread zwischenzeitlich selbst gefunden und es funktioniert wie ich mir das vorgestellt habe.

  • Drag & Drop einer Datei in externes Programmfenster automatisieren

    • misterspeed
    • 24. Juni 2013 um 10:26

    Wollte mal fragen ob jemand Ideen hat ob und wie man ein Datei Drag & Drop auf ein externes Fenster bewerkstelligen kann. Ich nehme an, dass das mit speziellen windowmessages gehen müsste. Ich möchte das ganze nicht über herkömmliche GUI Automatisierung machen, also z.B. den Datei->Öffnen Dialog des Dateimenüs starten und erst recht möchte ich keine Mausautomatisierung nutzen. Hintergrund ist, dass sich das Programm bei einem Drag&Drop anderst verhält als wenn man den Datei->Öffnen Dialog verwendet. Jemand vorschläge bzw. das nötige Wissen wie man _sendmessage() dafür verwenden muss/kann?

    [autoit]

    _sendmessage()

    [/autoit]
  • sqlite -> unterminated string

    • misterspeed
    • 23. Juni 2013 um 21:03
    Zitat von chungwarlet

    Ich hab in meinem Studium gelernt fürs Programmieren für 'ß' sz zu schreiben

    Mich verwundert ein wenig, dass man euch nicht eher dazu geraten hat englische Variablennamen zu verwenden. Gerade in großen internationalen Unternehmen ist deutscher Quellcode eher hinderlich. Davon ab hat man dann keine solchen linguistischen Probleme mehr wenn es um Umlaute usw. geht. ;)

  • RegRead() liefert nichts zurück / WinRAR-API?

    • misterspeed
    • 23. Juni 2013 um 20:55

    Lies die Hilfe von winrar, wenn du es benutzen willst. Winrar kann wie viele Programme per cmdline Parameter völlig ohne GUI benutzt werden, wenn ich mich recht erinnere. Du könntest Alternativ auch die 7zip exe oder dll verwenden. 7zip hätte den Vorteil, dass es nicht kostenpflichtig ist, nicht zwingend installiert werden muss und ebenfalls per cmdline Parameter verwendet werden kann. Neben diesen externen Programmen kann man aber auch die Windowseigene ZIP Funktion automatisieren, am besten suchst du per google oder Forensuche nach den verfügbaren Alternativen, das wurde sowohl hier als auch im englischen Forum zu genüge behandelt.

    Die Suchbegriffe "autoit zip UDF" und "autoit rar UDF" sollten da auf jedenfall brauchbares liefern.

  • RegRead() liefert nichts zurück / WinRAR-API?

    • misterspeed
    • 23. Juni 2013 um 20:44

    1. Ich bezweifle das der RegKey stimmt, denn in Local_Machine werden keine userspezifischen sondern globale für den Computer notwendige und alle User gültige Informationen gespeichert. Der Key "defaultusername" im Zweig "Winlogon" dürfte der Benutzername des Standardbenutzers sein, welcher automatisch angemeldet wird. Das muss aber nicht zwingend der aktuell angemeldete User sein der das Script ausführt.
    2. Wie schon erwähnt ist da ein "\" der da nicht hingehört.
    3. Gibt es ein Autoit Makro um den aktuell angemeldeten Benutzernamen auszulesen:

    [autoit]

    @username

    [/autoit]
  • Variable aus Text und Forschleifenvariable zusammensetzen

    • misterspeed
    • 23. Juni 2013 um 17:42

    Versuch lieber ein Array zu benutzen und schau dir das Tutorial von Bugfix an: http://www.bug-fix.info/array_tut.htm

  • Verzwirdelt

    • misterspeed
    • 23. Juni 2013 um 17:32

    Ich seh zwar nur einen Fehler, aber der sollte nichts mit Einträgen in die ersten beiden Inputs zu tun haben:

    [autoit]


    Case $nMsg = $add_worker
    _SQLite_Exec ($hDB, "INSERT INTO Einstell (Was,Art,Preis) " & _
    "VALUES ( 'Mitarbeiter','" & GUICtrlRead($Input3) & "','" & GUICtrlRead($Input4) & "');")
    call("refresh_Einst")

    Case $nMsg = $add_steam
    _SQLite_Exec ($hDB, "INSERT INTO Einstell (Was,Art,Preis) " & _
    "VALUES ( 'Mitarbeiter','" & GUICtrlRead($Input5) & "','" & GUICtrlRead($Input6) & "');")
    call("refresh_Einst")

    [/autoit]

    Zweimal "Mitarbeiter" dürfte wohl falsch sein, einmal müsste es wohl eher "Maschinen" sein, aber das betrifft dann höchstens die Inputs 3-6.

    Was dieser ganze call(....) Müll soll musst du mir auch mal erklären. Das ist zwar nicht falsch aber sinnfrei, denn du kannst die gecallten Funktionen auch einfach direkt mit Funktionsname() aufrufen, also wozu per call()?

    Zum Schluss noch ein Hinweis:
    Wenn du willst, dass jemand den Fehler nachvollziehen kann und das Script auch testen kann solltest du eine lauffähige Version mit allen benötigten Includes und Funktionen posten. Ich habe weder Bock den fehlenden sqlite Kram nachträglich da reinzufummeln noch die notwendigen GUI Includes zusammenzusuchen. So wird es den meisten anderen hier auch gehen. Deine Chancen sind also gering, dass so jemand den Fehler findet, ich habe ihn anhand des geposteten Codes jedenfalls gerade nicht gefunden und bin der Meinung es müsste zumindestens für Input1+2 soweit funktionieren. Ohne zu testen aber wie gesagt nicht nachvollziehbar was schief geht. Möglicherweise entsteht der Fehler auch in Code Zeilen die du nicht gepostet hast.

  • ControlGetText

    • misterspeed
    • 23. Juni 2013 um 16:04

    Nein kann sie nicht, da sie kein eigenes Listview auslesen will, sondern ein Listview eines externen Programmes. Genau für solche Fälle gibt es die entsprechende controllistview() Funktion. ;)

  • Array durchsuchen

    • misterspeed
    • 23. Juni 2013 um 11:55

    Beeindruckend wieviel schneller die Scripting Dictionary Variante bei etwas größeren Testmengen ist, selbst bei deinen simplen Testdaten sind es schon 20%, reduziert man die Redundanz und nutzt zufällige 2 stellige Strings ist das scripting dictionary sogar bis zu 4000% schneller.

  • Array durchsuchen

    • misterspeed
    • 22. Juni 2013 um 23:37

    In meinem Script ist doch ein Beispiel zur Anwendung. Arrays kann man nicht in einer msgbox anzeigen, höchstens einzelne Werte des Arrays. Eine Funktion kann auch niemals mit eckigen Klammern versehen werden um den Rückgabewert der Funktion als Array anzusprechen. Du musst das Rückgabe Array schon vorher in eine Variable packen.

    EDIT: Ich empfehle dir einen Blick in das Array Tutorial von Bugfix http://www.bug-fix.info/array_tut.htm

    [autoit]


    #include <array.au3> ; wird für arraydisplay() gebraucht

    [/autoit][autoit][/autoit][autoit]

    ; zuerst natürlich $testarray mit daten füllen...
    dim $testarray[5]
    $testArray[0] = "abc"
    $testArray[1] = "123"
    $testArray[2] = "def"
    $testArray[3] = "123"
    $testArray[4] = "abc"

    [/autoit][autoit][/autoit][autoit]

    ; meine Funktion nutzen um neues Array zu erstellen
    $aUnique1D = _arrayUniqueCount($TestArray, 1, ",") ; 1D Variante mit geschweiften Klammern
    $aUnique2D = _arrayUniqueCount($TestArray, 2, ",") ; 2D Variante

    [/autoit][autoit][/autoit][autoit]

    ; $aUnique?D ist dein neues Array, welches von meiner Funktion erzeugt und zurückgegeben wurde
    ; das kann wie jedes Array verwendet werden, also z.B. mit

    [/autoit][autoit][/autoit][autoit]

    _arraydisplay($aUnique1D,"1D Variante mit geschweiften Klammern")
    _arraydisplay($aUnique2D,"2D Variante")

    [/autoit][autoit][/autoit][autoit]

    ; komplett anzeigen
    ; oder einzelne Felder per Index auslesen

    [/autoit][autoit][/autoit][autoit]

    msgbox(0,"1D Variante mit geschweiften Klammern","Treffer Nummer 1: " & $aunique1D[0])
    msgbox(0,"1D Variante mit geschweiften Klammern","Treffer Nummer 2: " & $aunique1D[1])

    [/autoit][autoit][/autoit][autoit]

    msgbox(0,"2D Variante","Treffer Nummer 1: " & $aunique2D[0][0] & " Anzahl der doppelten Treffer: " & $aunique2D[0][1])
    msgbox(0,"2D Variante","Treffer Nummer 2: " & $aunique2D[1][0] & " Anzahl der doppelten Treffer: " & $aunique2D[1][1])

    [/autoit][autoit][/autoit][autoit]

    ;usw.

    [/autoit]
  • Array durchsuchen

    • misterspeed
    • 22. Juni 2013 um 22:04

    Ich hab sowas vor einiger Zeit mal für ISI360 und sein ISN Autoit Studio geschrieben. Dort muss ein 1D Array mit Variablennamen durchsucht und Doubletten entfernt werden. Bei Doubletten soll die Anzahl der doppelten Einträge vermerkt werden, also genau das was du auch vorhast soweit ich dich verstanden habe.

    Wie funktioniert mein Code? Ich nehme das Input Array und prüfe für jeden Eintrag des Arrays ob er bereits in einen temporären String kopiert wurde (das geht schneller als ständig zwei Arrays miteinander zu vergleichen). Ist der Eintrag des Arrays noch nicht in diesem String, dann wird er hinzugefügt (Stringverkettung mit eindeutigem Trennzeichen $sepChar welches in keinem der Arrayeinträge vorkommen darf) und außerdem in ein neues 2D Array (Ergebnis) kopiert. Ist der Eintrag bereits im String und somit auch im Ergebnis Array vorhanden, dann wird die Stelle im Ergebnisarray gesucht und in der 2. spalte des Ergebnisarrays vermerkt, dass dieser Eintrag einmal mehr ($aNew[$k][1]+=1) gefunden wurde als bislang.

    Nachdem man das für alle Arrayzeilen gemacht hat muss man noch das Ergebnisarray kleiner machen (redim), da das neue Array ja sehr sicher weniger Zeilen haben wird als das Input Array. Damit man die richtige Größe kennt muss man sich bei jedem neuen Eintrag über eine Zählervariable merken wieviele einmalige Einträge man hinzugefügt hat (bei mir ist das die Zählervariable $j)

    Meine Funktion erlaubt es dann noch das 2D Ergebnisarray wieder in ein 1D Array zurückzuwandeln und dabei dann die Anzahl der doppelten Treffer nicht in einer 2. Spalte sondern in geschweiften Klammern zu vermerken.

    Ich gebe zu das ganze ist etwas komplizierter und vermutlich auf den ersten Blick nicht sofort verständlich, aber es funktioniert und es dürfte so ziemlich die schnellste und effizienteste Lösung für das Problem sein.


    Hier der Quellcode:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $avArray[11] = ["WM_KILLFOCUS", "WM_KILLFOCUS", "WM_ENABLE", "WM_SETREDRAW", "UnMountMOM", "MountMOM", "WM_CLOSE", "WM_PAINT", "WM_SETREDRAW", "WM_SETREDRAW", "Mountmom"]

    [/autoit] [autoit][/autoit] [autoit]

    $timer=TimerInit()
    $aUniqueCount = _arrayUniqueCount($avArray,1) ; Mode 1 für 1D-Rückgabe
    ConsoleWrite(TimerDiff($timer) & @CRLF)
    If $aUniqueCount = -1 Then
    ConsoleWrite("Fehler: Es wurde kein Array übergeben!" & @CRLF)
    Else
    _ArrayDisplay($aUniqueCount)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Func _arrayUniqueCount(ByRef $aData, $mode=2, $sepChar=",") ; mode: 1 = 1D Rückgabe , 2 = 2D Rückgabe

    [/autoit] [autoit][/autoit] [autoit]

    If Not IsArray($aData) Then Return -1 ; wichtig: bitte Rückgabe dieser Funktion prüfen bevor weiter gearbeitet wird...

    [/autoit] [autoit][/autoit] [autoit]

    Local $aNew[ubound($aData)][2] ; für 2D Rückgabe // geändert: array wird am schluß neu dimensioniert!
    Local $aNew1D[1] ; für 1D Rückgabe
    Local $sTemp=$sepChar ; string verkettung des ergebnis arrays für schnelle unique prüfung
    Local $j=0 ; zahl der unique treffer

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Anmerkung: Der Vergleich sollt vielleicht doch nicht case sensitiv sein, da ansonsten gleichnamige Variablen mit anderer Schreibweise nicht erkannt werden, daher wieder auf not casesensitiv geändert, ist aber ein wenig langsamer...
    For $i=0 To UBound($aData)-1
    If StringInStr($sTemp,$sepChar & $aData[$i] & $sepChar,0,-1) Then ; stringprüfung arbeitet schneller als große arrays zu durchlaufen und "viele" strings zu vergleichen // geändert: sepchar muss nun ganze Variable umschließen
    For $k=0 To UBound($aNew)-1 ; bei bereits vorhandenen einträgen müssen wir zwangsweise die bisherigen suchergebnisse durchlaufen um den korrekten index zu finden
    If $aNew[$k][0]=$aData[$i] Then
    $aNew[$k][1]+=1
    ExitLoop
    EndIf
    Next
    Else
    $aNew[$j][0] = $aData[$i]
    $aNew[$j][1] = 1
    $sTemp &= $aData[$i] & $sepChar
    $j += 1
    ;ReDim $aNew[$j+1][2] ; geändert: wäre lahm, wurde im thread denke ich damals auch erwähnt...
    EndIf
    Next
    ReDim $aNew[$j][2] ; geändert: array wird erst zum schluß auf richtige Größe gebracht, performanter....

    [/autoit] [autoit][/autoit] [autoit]

    ;If UBound($aNew) > 1 Then ReDim $aNew[UBound($aNew)-1][2]

    [/autoit] [autoit][/autoit] [autoit]

    ; sofern zwingend ein 1D Array als Ausgabe benötigt wird muss das neue Array noch einmal durchlaufen werden:
    if $mode = 1 Then
    ReDim $aNew1D[UBound($aNew)]
    For $i=0 To UBound($aNew)-1
    If $aNew[$i][1] > 1 Then
    $aNew1D[$i]=$aNew[$i][0] & " {" & $aNew[$i][1] & "x}"
    Else
    $aNew1D[$i]=$aNew[$i][0]
    EndIf
    Next
    $aNew=$aNew1D
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Return $aNew
    EndFunc

    [/autoit]
  • _INetMail direkt senden

    • misterspeed
    • 22. Juni 2013 um 16:36

    Gar nicht, weil ich kein Outlook habe. Allgemein würde ich nicht den Client automatisieren sondern eben die oben genannte Funktion verwenden. Wo ist der Unterschied ob das PW nun in Outlook oder in deinem Script gespeichert wird? Auch ein Outlook PW kann man spielend leicht auslesen. Wenn das PW allgemein nicht gespeichert wird und jedesmal auch in Outlook eingegeben werden muss dann könntest du eine PW Eingabe auch in deinem Script realisieren ohne es zwischenzuspeichern.

    Aber wenns unbedingt sein muss, würde ich mir wie erwähnt die Outlook UDF anschauen: https://autoit.de/index.php?page=Thread&amp;threadID=25830

    Insbesondere die Funktion _OL_Wrapper_SendMail() sollte dich interessieren.

  • sqlite -> unterminated string

    • misterspeed
    • 22. Juni 2013 um 15:12
    Zitat von chungwarlet

    Wie kann ich denn in SciTe einstellen das die SQlite sachen so hellblau markiert werden ?


    Keine Ahnung wo du dein Scite her hast, aber wenn du Scite4Autoit von der Autoit Webseite herunterlädst sollten auch alle Standard und UDF Funktionen farbig gekennzeichnet werden. Ich vermute mal du hast das originale Scite ohne Autoit Syntax Anpassung?

  • sqlite -> unterminated string

    • misterspeed
    • 22. Juni 2013 um 14:56

    Die Fehlermeldung ist doch eindeutig. Du verwendest die markierte Variable $hDB ohne sie zuvor deklariert zu haben. Da ich in deiner Funktion nirgendwo ein _sqlite_open() sehe, welches dir das DB Handle $hDB liefern würde nehme ich mal an, dass du das _sqlite_Open() erst machst nachdem function1() aufgerufen wird, oder aber du machst das _sqlite_Open() innerhalb einer anderen Funktion und hast das Handle welches in dieser Funktion erzeugt wird nicht global deklariert. Hier meine Vermutung wie dein Code ausschaut:

    [autoit]


    connect() ; verbindung mit DB herstellen
    function1() ; gui erzeugen und Einträge zur DB hinzufügen, hier tritt dein Fehler auf

    [/autoit][autoit][/autoit][autoit]

    func connect()
    $hDB = _sqlite_Open(...) ; diese Variable ist nur solange gültig bis die Funktion verlassen wird, da sie nicht global deklariert wurde
    endfunc

    [/autoit]


    Eine Warnung statt einem Fehler würdest du bei diesem Script erhalten ("variable possibly used without beeing declared"):

    [autoit]


    connect() ; verbindung mit DB herstellen
    function1() ; gui erzeugen und Einträge zur DB hinzufügen, hier tritt dein Fehler auf

    [/autoit][autoit][/autoit][autoit]

    func connect()
    global $hDB = _sqlite_Open(...) ; diese Variable ist global bekannt sobald diese Zeile ausgeführt wurde
    endfunc

    [/autoit]

    Grund für die Warnung: Theoretisch könntest du function1() aufrufen ohne zuvor connect() aufzurufen, deswegen warnt dich der Compilercheck.


    Richtig wäre es z.B. so:

    [autoit]


    global $hDB = connect() ; verbindung mit DB herstellen, die zurückgegebene lokale variable wird nun in einer globalen variable gespeichert und ist in allen anderen Funktionen bekannt
    if $hDB = 0 then exit msgbox(0,"Fehler","DB konnte nicht geöffnet werden!")
    function1() ; gui erzeugen und Einträge zur DB hinzufügen, hier tritt dein Fehler auf

    [/autoit][autoit][/autoit][autoit]

    func connect()
    local $hDB = _sqlite_Open(...) ; diese Variable ist nur solange gültig bis die Funktion verlassen wird, wir geben diese aber mit return zurück, somit lebt sie an anderer Stelle weiter
    return $hDB
    endfunc

    [/autoit]
  • ControlGetText

    • misterspeed
    • 22. Juni 2013 um 14:37

    Ich würds mal mit

    [autoit]

    ControlListView ()

    [/autoit]


    versuchen.

    Wenn es aber kein Windows Standard Listview ist wirst du damit vermutlich auch nichts bekommen.

  • Array Display Limit ?

    • misterspeed
    • 22. Juni 2013 um 11:10

    Diese Limitierung ist erst in Version 3.3.8.1 hinzugekommen. Es wurde ein Bug behoben der in der alten 3.3.6.1 keine Inhalte anzeigte wenn ein Array Feld mehr als 4094 Zeichen hatte. Dafür wurde aber die maximale Größe des Listviews beschnitten.

    Hier habe ich aus beiden Varianten der _arraydisplay() Funktion eine gefixte Variante gebastelt, die beide Probleme behebt:

    https://autoit.de/index.php?page…1524#post261524

  • sqlite -> unterminated string

    • misterspeed
    • 21. Juni 2013 um 23:35

    Der Zeilenumbruch ist syntaktisch falsch und ein endif fehlt auch. So sollte es richtig sein:

    [autoit]


    Case $nMsg = $WeiterButton
    If BitAND(GUICtrlRead($Pauschale), $GUI_CHECKED) = $GUI_CHECKED Then
    _SQLite_Exec ($hDB, "INSERT INTO Tabelle (Name,Telefon,Adresse,Postleitzahl,Ort,Rechnungsart,RegNr) " & _ ; <----- bei einem Zeilenumbruch immer String mit " schließen, mit & _ verketten und neue Zeile mit " beginnen
    "VALUES ( '" & GUICtrlRead($Name) & "','" & GUICtrlRead($Nummer) & "','" & GUICtrlRead($Strasze) & "','" & GUICtrlRead($Postleitzahl) & "','" & GUICtrlRead($Wohnort) & "','Pauschale','0');")
    GUIDelete($Angebot)
    ExitLoop
    ElseIf BitAND(GUICtrlRead($Rechnung), $GUI_CHECKED) = $GUI_CHECKED Then
    _SQLite_Exec ($hDB, "INSERT INTO Tabelle (Name,Telefon,Adresse,Postleitzahl,Ort,Rechnungsart,RegNr) " & _ ; <----- bei einem Zeilenumbruch immer String mit " schließen, mit & _ verketten und neue Zeile mit " beginnen
    "VALUES ( '" & GUICtrlRead($Name) & "','" & GUICtrlRead($Nummer) & "','" & GUICtrlRead($Strasze) & "','" & GUICtrlRead($Postleitzahl) & "','" & GUICtrlRead($Wohnort) & "','Rechnung','0');")
    GUIDelete($Angebot)
    ExitLoop
    endif
    EndSelect
    WEnd

    [/autoit][autoit][/autoit][autoit]

    EndFunc

    [/autoit]
  • _INetMail direkt senden

    • misterspeed
    • 21. Juni 2013 um 23:17

    Steht doch in der Hilfe, was _inetmail() macht bzw. eben gerade nicht macht. Wenn du Emails versenden willst ohne ein Standard Email-Programm zu automatisieren benötigst du:

    [autoit]

    _INetSmtpMail()

    [/autoit]

    Ansonsten wirst du uns dein Mail Programm nennen müssen, denn jedes Programm dürfte wohl unterschiedlich zu automatisieren sein. Für Outlook gibts eine UDF, wie es mit Thunderbird ausschaut keine Ahnung. Tastenkombinationen sollten jedenfalls immer der letzte Weg sein, davor würde ich eher mal die winXXX und controlXXX Funktionen verwenden.

  • sqlite -> unterminated string

    • misterspeed
    • 21. Juni 2013 um 17:20

    Die Fehlermeldung unterminated String bekommt man im übrigen, wenn eine Zeile des Scriptes länger als 4000 Zeichen ist.
    Die Zeile muss in solch einem Fall in mehrere aufgeteilt werden, siehe auch mein Scriptbeispiel oben...

    [autoit]


    $test = "4000 Zeichen" & _
    "weitere 4000 Zeichen"

    [/autoit]
  • Binärdatei schreiben

    • misterspeed
    • 21. Juni 2013 um 17:16

    Ich versteh dein Problem noch immer nicht. Willst du nun Daten aus der DB lesen um diese als Stringverkettung in ein anderes Script einzufügen oder willst du Daten aus der DB lesen und diese direkt in eine Datei schreiben?
    Im letzteren Fall spielt es keine Rolle wie lange ein String ist, nur wenn das ganze in Stringform in ein Script soll muss der String in 4k Zeichenblöcke geteilt werden, weil dies eben die maximal erlaubte Zeilenlänge ist.

    Überschreitet man diese Zeilenlänge in einem Autoit Quellcode gibts besagte Fehlermeldung. Das passiert aber sicher nicht wenn du den langen String in einer Variable hast die du für irgendwas verwendest.

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™