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. BugFix

Beiträge von BugFix

  • Text in ein Fenster einfügen mit $WM_SETTEXT nicht möglich?

    • BugFix
    • 21. November 2017 um 12:42
    Zitat von Bitnugger

    Schau mal hier... ob das evtl. hilft.

    Dort geht es nur um das Ändern des Fenstertitels - das klappt ja auch mit meiner Methode.

    Ich möchte jedoch im Textbereich einfügen und das ist scheinbar nur genau bei den von MSDN benannten Typen (Edit, Combobox, Button) möglich. Der Word-Edit-Bereich ist aber eine völlig andere Fensterklasse, wie bei den meisten Office-Programmen.

  • Text in ein Fenster einfügen mit $WM_SETTEXT nicht möglich?

    • BugFix
    • 21. November 2017 um 12:13

    OK, Danke fürs Probieren. An Wordpad hatte ich gar nicht gedacht. Aber dadurch ist zumindest klar, dass es mit Word oder anderen Editoren, deren Schreibfläche kein (Rich)Edit-Ctrl ist, nicht funktionieren kann.

    Ich hatte gehofft, dass das universell ist - war dann nix.

    Nun muss ich nach einer Alternative suchen.

  • Text in ein Fenster einfügen mit $WM_SETTEXT nicht möglich?

    • BugFix
    • 21. November 2017 um 10:51

    Kennt sicher jeder: Im Internet ein paar Angebote suchen, rauskopieren und zusammenstellen in einem eigenen Dokument.

    Copy & Paste übernimmt dann leider die Formatierung inkl. Tabelle etc., sodass man dann nachbearbeiten muss.

    Deshalb hatte ich mir jetzt eine Funktion erstellt, die den Inhalt der Zwischenablage als Nur-Text ausliest und an der Mausposition im aktuell geöffneten Fenster einfügt.

    Send() möchte ich auf jeden Fall vermeiden und hatte deshalb mit _SendMessage(HWnd, $WM_SETTEXT, ... ) probiert. Obwohl das Child-Window erkannt wird, an das die Nachricht gesendet wird, läßt sich kein Text einfügen. Fehler gibt _SendMessage nicht zurück. Habe ich zuviel in diese Funktion hinein interpretiert, kann sie gar keinen Text, wie von mir gewünscht, einfügen?

    Bin auch für andere (Send-freie) Lösungen zu haben.

    AutoIt
    #include <Clipboard.au3>
    #include <WinAPISys.au3>
    
    HotKeySet('^u', '_ClipBoard_InsertUnformat') ; Ctrl+U
    HotKeySet('^+e', '_exit')                    ; Ctrl+Shift+E
    
    Func _ClipBoard_InsertUnformat()
        ; get clipboard entry as text-only
        Local $sClip = _ClipBoard_GetData($CF_UNICODETEXT)
    
        ; get current window & child window from mouse position
        Local $hWnd = WinGetHandle('[ACTIVE]')
        Local $tPOINT = _WinAPI_GetMousePos(True, $hWnd)
        Local $hChild = _WinAPI_ChildWindowFromPointEx($hWnd, $tPOINT)
    
        ; check if child exists
        If $hChild = $hWnd Then Return
    
        ; create buffer
        Local $tCLIP = DllStructCreate('wchar buffer[' & StringLen($sClip)+1 & ']')
        $tCLIP.buffer = $sClip & Chr(0)
    
        ; sets text from buffer to mouse position
    #cs  >> https://msdn.microsoft.com/en-us/library/windows/desktop/ms632644(v=vs.85).aspx <<
        Remarks
        The DefWindowProc function sets and displays the window text. For an edit control, the text is the contents of the edit control.
        For a combo box, the text is the contents of the edit-control portion of the combo box. For a button, the text is the button name.
        For other windows, the text is the window title.
    #ce
    ;~     _SendMessage($hWnd, $WM_SETTEXT, 0, DllStructGetPtr($tCLIP))      ; mit $hWnd wird Titel gesetzt --> das funktioniert
        _SendMessage($hChild, $WM_SETTEXT, 0, DllStructGetPtr($tCLIP))    ; den Text in ein offenes Editor- oder Wordfenster eintragen funktioniert nicht
    EndFunc
    
    Func _exit()
        Exit
    EndFunc
    
    While True
        Sleep(10)
    WEnd
    Alles anzeigen
  • Listbox Item

    • BugFix
    • 20. November 2017 um 16:03

    Standardmäßig ist das nicht vorgesehen. Ich weiß nicht, wie deine Vorkenntnisse sind - du müsstest im Ownerdraw Modus zeichnen und die standardmäßige Verarbeitung der zu blockierenden Item unterbinden, sowie in der gewünschten grauen Färbung zeichnen. Für Listbox habe ich das noch nicht gemacht. Beispiele findest du für Listview im Forum. Das Vorgehen sollte ähnlich sein.

  • GUI NUR 1 mal Starten

    • BugFix
    • 20. November 2017 um 11:51

    [Blockierte Grafik: https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRIVZLFQk8JBW6njiyk2FcKru_HG78zDNpF3aPHPv6Lik5V6-Z4XA]

    Code?

  • Case $GUI_EVENT_DROPPED gibt es analog auch etwas wie case event writen ?

    • BugFix
    • 15. November 2017 um 13:38

    Du musst einen Button einfach doppelt belegen

    - Wenn alle Inhalte bearbeitet sind, drückst du <<PDF Erstellen>>

    ---> Flag Mail-Erlaubt

    ---> Button-Text ändern von <<PDF Erstellen>> auf <<Korrektur>>

    ---> wenn Button jetzt gedrückt wird: Mail-Flag zurücksetzen, Button-Text wieder <<PDF Erstellen>>

    ---> wird Korrektur nicht gedrückt ist Mail-Flag noch gesetzt --> Mail-Button drücken: Versand Mail, Button-Text <<PDF Erstellen>> setzen

  • Case $GUI_EVENT_DROPPED gibt es analog auch etwas wie case event writen ?

    • BugFix
    • 15. November 2017 um 13:19

    Vielleicht denke ich jetzt zu einfach:

    - Globale Variable Status = 0

    - Erstelle PDF wenn Status = 0

    - Vorschau fehlerfrei >> setze Status 1

    - Button Mail >> Status = 1 dann Mail und Status = 0, sonst nichts

  • StringFormat -- und kein bisschen weise?

    • BugFix
    • 15. November 2017 um 09:25

    Rechtsbündige Ausgabe wäre schon machbar:

    - Gesamtausgabebreite festlegen

    - Länge Zahlenstring messen

    - Leerzeichenstring der Differenzlänge erstellen (ganz normal wie Text messen - GDI+ Funktionen)

    - beides zusammenfügen und ausgeben

    ABER

    Das bringt dir letztlich überhaupt nichts! Denn bei proportionaler Schriftart sind natürlich auch die Bereiche nach dem Komma unterschiedlich lang und somit hast du niemals eine sauber aufgereihte Liste.

  • Forenupdate - September 2017 - Probleme / Anregungen / Feedback - Sammelthread

    • BugFix
    • 15. November 2017 um 09:16

    Nachfrage:

    Ist denn schon absehbar, wann die url-Pfade der Beiträge aktualisiert werden? Zum Einen sind die selbst verlinkten Posts nicht erreichbar (evtl. verschmerzbar oder mit sehr sehr viel Aufwand von Hand aktualisierbar) und zum Anderen ist das eine sehr unangenehme Aussendarstellung für unser Forum, weil mit Google gefundene Beiträge beim Anklicken immer auf der Forums Hauptseite landen.

  • Intel RST, Raid Status Abfrage

    • BugFix
    • 15. November 2017 um 09:03
    Zitat von Darktower

    BugFix

    _ImageSearch findet soweit ich weiß vorgegeben Grafiken auf dem Bildschirm, das ist gut und schön, aber wie bringt mich das weiter?

    He he, der Einwurf kam von alpines.

    Aber als letzter Ausweg ist das durchaus möglich, vorausgesetzt du bist immer an einem Bildschirm mit derselben Auflösung. Wenn ich mich recht erinnere hatte Andy mal ein Button-Search-Click Programm geschrieben, basierend auf _ImageSearch. Musst du mal die Forumssuche bemühen.

  • Intel RST, Raid Status Abfrage

    • BugFix
    • 14. November 2017 um 22:48
    Zitat von Darktower

    Wie kann es sein das man in dem Fenster absolut nichts automatisieren kann?

    Weil es Programmiersprachen gibt, die eigene Fensterklassen erstellen, auf die mit Standardbefehlen nicht zugegriffen werden kann (z.B. Delphi). Habe einige professionelle Software, die mit Delphi geschrieben wurde - da hast du null Möglichkeit zum Automatisieren.

  • Intel RST, Raid Status Abfrage

    • BugFix
    • 11. November 2017 um 22:06

    Da ich noch nie mit Intel Raid zu tun hatte, sind meine Angaben jetzt eher Überlegungen.

    Bei den bisher von mir verwendeten Raid Controllern war immer ein Auswertetoll dabei, das entweder per Web-Interface ansprechbar war oder als eigenständige exe aufgerufen wurde. Das wären dann auch meine Ansatzpunkte, bei Web-Interface z.B. mit der _IE-UDF die Infos abfragen, bei einer exe schauen, ob die Angaben mit AutoIt auslesbar sind und dann entsprechend automatisieren.

  • Einbinden DLL für das Einlesen von Messwerten über die serielle Schnittstelle

    • BugFix
    • 11. November 2017 um 21:51
    Zitat von AspirinJunkie

    Laut der Beschreibung wird dort als boolean ein 32 Bit-Integer verwendet - oder?

    Dann würde ja der Rückgabewert und der 4. Parameter nicht passen da boolean in DLLCall ein 8 Bit-Wert darstellt.

    Ich denke daher dass man für den Rückgabewert und den 4. Parameter daher stattdessen INT verwenden sollte.

    Oops, hast natürlich recht - ich wollte eigentlich "BOOL" verwenden, also den 32 Bit Typ.

    Zitat von AspirinJunkie

    Und zu dem 3. Parameter: Kann mich irren aber spontan hätte ich Double* statt Double verwendet.

    Das ist immer recht fraglich. Mal reicht tatsächlich die vordefinierte Variable, mal muss sie als Pointer übergeben werden. Das sind dann die Dinge, die mit Trial&Error erledigt werden. ;)

  • Einbinden DLL für das Einlesen von Messwerten über die serielle Schnittstelle

    • BugFix
    • 11. November 2017 um 21:30

    Ich würde das so angehen, basierend auf der Beschreibung. ich habe nur geändert, dass die Funktion den Messwert zurückgibt, statt ihn ByRef auszulesen. Das passiert nur innerhalb der Funktion beim DllCall so.

    Schau dir mal mein DLL-Tut (in meiner Signatur) an. Da habe ich noch ein paar Bsp.

    AutoIt
    ; Declare Function HINET_Get Lib "DCH_32.DLL" (ByVal Typ As Long, ByVal Chan As Long, ByRef Messwert As Double, ByVal fWait As Long) As Long
    
    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _HINET_Get
    ; Parameters ....: $_iTyp   Typ des Messwertes: 0=aktuell, 1=maximal, 2=minimal, 3=Diff min/max
    ; ...............: $_iChan  Nummer des auszulesenden Kanals, 0=alle
    ; ...............: $_fWait  Ausleseflag, False=sofort / True=Betätigung Übernahmekontakt
    ; Return values .: Erfolg   Der Messwert, @extended=True
    ;                  Fehler   @error (s. Hilfe DllCall), @extended=False
    ; ===============================================================================================================================
    Func _HINET_Get($_iTyp, $_iChan, $_fWait=False)
        Local $iMesswert = 0
        Local $aRet = DllCall('DCH_32.DLL', 'boolean', 'HINET_Get', 'long', $_iTyp, 'long', $_iChan, 'double', $iMesswert, 'boolean', $_fWait)
        Return SetError(@error,$aRet[0],$iMesswert)
    EndFunc
    Alles anzeigen


    EDIT:

    Ich habe mal die Überlegungen aus den nachfolgenden Posts zusammengefasst. Probier aus, was funktioniert.

    AutoIt
    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _HINET_Get
    ; Parameters ....: $_iTyp   Typ des Messwertes: 0=aktuell, 1=maximal, 2=minimal, 3=Diff min/max
    ; ...............: $_iChan  Nummer des auszulesenden Kanals, 0=alle
    ; ...............: $_fWait  Ausleseflag, False=sofort / True=Betätigung Übernahmekontakt
    ; Return values .: Erfolg   Der Messwert, @extended=True
    ;                  Fehler   @error (s. Hilfe DllCall), @extended=False
    ; ===============================================================================================================================
    Func _HINET_Get($_iTyp, $_iChan, $_fWait=False)
        ; wie im Thraed mit @AspirinJunkie diskutiert, sind mehrere Varianten denkbar (durch Probieren die korrekte finden)
    
        ; Variante 1 -- Variable für Aufnahme des Messwertes wird deklariert und direkt an den DllCall übergeben und beim Aufruf befüllt
        Local $iMesswert = 0
        Local $aRet = DllCall('DCH_32.DLL', 'bool', 'HINET_Get', 'long', $_iTyp, 'long', $_iChan, 'double', $iMesswert, 'bool', $_fWait)
        Return SetError(@error, $aRet[0], $iMesswert)
    
        ; Variante 2 -- Variable für Aufnahme des Messwertes wird deklariert und explizit ByRef als Pointer an den DllCall übergeben und beim Aufruf befüllt
    ;~     Local $iMesswert = 0
    ;~     Local $aRet = DllCall('DCH_32.DLL', 'bool', 'HINET_Get', 'long', $_iTyp, 'long', $_iChan, 'double*', $iMesswert, 'bool', $_fWait)
    ;~     Return SetError(@error, $aRet[0], $iMesswert)
    
        ; Variante 3 -- Struktur für Aufnahme des Messwertes wird deklariert und als Pointer an den DllCall übergeben und beim Aufruf befüllt
    ;~     Local $tDouble = DllStructCreate('double')
    ;~     Local $aRet = DllCall('DCH_32.DLL', 'bool', 'HINET_Get', 'long', $_iTyp, 'long', $_iChan, 'ptr', DllStructGetPtr($tDouble), 'bool', $_fWait)
    ;~     Local $iErr = @error
    ;~     Local $iMesswert = DllStructGetData($tDouble, 1)
    ;~     Return SetError($iErr, $aRet[0], $iMesswert)
    
    EndFunc
    Alles anzeigen
  • regexreplace

    • BugFix
    • 5. November 2017 um 11:41
    Zitat von Oscar

    Inzwischen muss man wohl sagen, dass StringRegExpReplace schneller ist.

    Was sagt uns das: Nichts ist von Dauer. ;)

    Das ist das Gute am Forum - letztlich wird eine Lösung nahe am Optimum gefunden. :rock:

  • regexreplace

    • BugFix
    • 3. November 2017 um 19:15
    Zitat von Bitnugger

    Hihi... wohl eher "schneckenlahm"... denn die Version von Musashi ist ca. 4x schneller!

    Bei 2 möglichen Treffern brauchst du gar nicht erst vergleichen, die gemessene Zeit reflektiert dann eher deine Raumtemperatur oder die Lautstärke der vorbeifahrenden Straßenbahn als die tatsächlich benötigte Zeit. Wir hatten mal in einem Thread zu Ersetzungen, diese Funktion als die um mindestens Faktor 10 schnellere festgestellt. Getestete Strings von mehreren Tausend Zeichen. Da kannst du die Arrayvariante dahinsiechen sehen. ^^

  • regexreplace

    • BugFix
    • 3. November 2017 um 17:57
    Zitat von Peter S. Taler

    aber Bugfixes erster Post hat mich dann doch verunsichert....

    :P

    Das war gar nicht meine Absicht. Aber keine der Lösungen kann alles auf einmal ersetzen. Die Callbackfunktion ist am Elegantesten, weil der String für die Suche nur einmal durchgegangen wird, von Match zu Match und dann entsprechend die Treffer ersetzt werden. Wenn du große Texte hast ist der Speed spürbar.

  • regexreplace

    • BugFix
    • 3. November 2017 um 17:22

    Oder du nimmst _StringRegExpReplace_Callback von Taz77 , das ist sauschnell:

    AutoIt
    $s = "ä_ber_ü_keiner"
    _StringRegExpReplace_Callback($s, '([äöüÄÖÜß])', '_MyCallbackReplace("$1")')
    
    ConsoleWrite('Ergebnis' & @CRLF & $s & @CRLF)
    
    Func _MyCallbackReplace($_sMatch)
        Local Static $sReplace = 'äöüÄÖÜß'   ; durchsuchen mit StringInStr -- Pos ist Index für Replace Array
        Local Static $aReplace[] = ['bleibt-leer', 1, 2, 3, 4, 5, 6, 7]   ; Ersetzungen
        Local $iPos = StringInStr($sReplace, $_sMatch)
        If $iPos = 0 Then  ; kann eigentlich nicht passieren
            Return $_sMatch
        Else
            Return $aReplace[$iPos]
        EndIf
    EndFunc
    
    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _StringRegExpReplace_Callback
    ; Description ...: Replaces ByRef all matches in a string by manipulation of the matches in a callback function
    ; Parameters ....: $sString    String to manipulate
    ; ...............: $sPattern   RegExp pattern for the match
    ; ...............: $sCallback  Callback function as string, i.e. "MyCallback('$1')" -- '$1' represents the match
    ; .....optional..: $sBefore    String to insert before the manipulated match
    ; .....optional..: $sAfter     String to insert after the manipulated match
    ; Return values .: Success     1
    ; ...............: Failure     0  set error = 1
    ; Author ........: Taz77
    ; ===============================================================================================================================
    Func _StringRegExpReplace_Callback(ByRef $sString, $sPattern, $sCallback, $sBefore = '', $sAfter = '')
        $sString = Execute("'" & StringRegExpReplace(StringReplace($sString, "'", Chr(26), 0, 2), $sPattern, $sBefore & "'&" & $sCallback & "&'" & $sAfter) & "'")
        If @error Then
            ConsoleWrite('_StringRegExpReplace_Callback error! Pattern: "' & $sPattern & '", Callback: "' & $sCallback & '"' & @LF)
            Return SetError(1,0,0)
        EndIf
        $sString = StringReplace($sString, Chr(26), "'", 0, 2)
        Return 1
    EndFunc  ;==>_StringRegExpReplace_Callback
    Alles anzeigen
  • regexreplace

    • BugFix
    • 3. November 2017 um 15:54

    Also ich vermute, dir schwebt eine Aktion: "Alles auf einmal Ersetzen" vor. Das geht jedoch nicht, bzw. ist es nicht unbedingt sinnvoll Konstrukte zu erstellen, die das hinbiegen. Das Ersetzen in einer Schleife ist hierfür sicher noch die schnellste Variante, ein Wert nach dem anderen. Und dann kannst du auch auf StringReplace zurückgreifen und benötigst kein RegEx.

  • Copy and Paste Gui

    • BugFix
    • 1. November 2017 um 20:26

    Geht mir oft ähnlich, aber ich setze zum Suchen inzwischen meist zuerst bei MSDN an. Aber selbst, wenn ich anderswo eine Lösung entdeckt habe, ist das Nachlesen auf MSDN doch recht hilfreich. Oft sind es Dinge, die dann einfach auch mal "hängen" bleiben. :thumbup:

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™