Text markieren

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
Holle
Posts: 187
Joined: 01 Oct 2013, 23:19

Text markieren

26 Mar 2014, 05:56

Hallo, ich habe da mal wieder ein kleines Problem...

...und zwar versuche ich per AHK einen Text zu markieren. Es gibt sicher die Möglichkeit das per "Send" zu machen (Shift halten, x * Pfeil rechts, Shift loslassen), aber das wäre recht unschön, da es vor allem bei größeren Markierungen recht lange dauern würde. Dann gäbe es da noch die Möglichkeit das ganze per Mausklicks zu realisieren, aber wenn man ein kleines Fenster hat in dem man scrollen müsste um das Ende der Markierung zu erreichen geht das auch nicht mehr so einfach.

Gibt es vielleicht eine einfachere/bessere Methode dafür?

Hier ist mal ein Beispielscript:

Code: Select all

Gui, Font,S12 cDefault,arial
Gui, add, Edit, x10 y10 w300 h50 vEdit, In diesem Text soll nur das Wort "Blubb" markiert werden.
Gui, add, button,x110 w100 Default, Markiere Blubb
Gui, Show,w320,Test
return

GuiClose:
ExitApp

ButtonMarkiereBlubb:
	GuiControlGet, Edit
    ControlGet, CaretX, CurrentCol,, Edit1,A
    ControlGet, CaretY, CurrentLine,, Edit1,A
	WortPos := InStr(Edit,"Blubb")
	MsgBox Nun sollte das Wort Blubb markiert werden.`nDer Cursor befindet sich in Zeile %CaretY% in Spalte %CaretX%.`nDas Wort befindet sich im String an Position %WortPos%.
return
Dann noch was: Warum ist der Text beim Programmstart direkt markiert? Und wie kann ich den Cursor an eine beliebige Position setzen?

Vielen Dank.
strobo
Posts: 125
Joined: 30 Sep 2013, 15:24

Re: Text markieren

26 Mar 2014, 07:27

Man kann natürlich

Code: Select all

send {down %zeilen_unterschied%} ; oder up
send ^{left %wort_unterschied%} ; oder right
send {left %rest_abstand%} ; oder right
Das ist aber eher als Köder für msdn kundige Helfer zu verstehen.
User avatar
Ragnar
Posts: 630
Joined: 30 Sep 2013, 15:25

Re: Text markieren

26 Mar 2014, 07:53

Code: Select all

Gui, Font,S12 cDefault,arial
Gui, add, Edit, x10 y10 w300 h50 vaEdit hwndhEdit +0x100, In diesem Text soll nur das Wort "Blubb" markiert werden.
Gui, add, button,x110 w100 Default, Markiere Blubb
Gui, Show,w320,Test
return

GuiClose:
ExitApp

ButtonMarkiereBlubb:
    ; Mit dem oben eingefügten Style ES_NOHIDESEL (0x100) kann Text markiert werden,
    ; ohne dass das Steuerelement fokussiert sein muss.
    Gui, Submit, NoHide
    Suchwort := "Blubb"
    StartPos := InStr(aEdit, Suchwort) - 1
    EndPos   := StartPos + StrLen(Suchwort)
    SendMessage, 0xB1, StartPos, EndPos,, ahk_id %hEdit% ; 0xB1 ist EM_SETSEL
return
Warum ist der Text beim Programmstart direkt markiert?
Weil das Edit-Steuerelement zu Beginn den Tastaturfokus hat. Mit -Tabstop in den Optionen von Edit könnte das beispielsweise verhindert werden.
Und wie kann ich den Cursor an eine beliebige Position setzen?
Auch mit EM_SETSEL. Einfach bei StartPos und EndPos die gleiche Position angeben.
Last edited by Ragnar on 26 Mar 2014, 07:58, edited 1 time in total.
User avatar
Holle
Posts: 187
Joined: 01 Oct 2013, 23:19

Re: Text markieren

26 Mar 2014, 07:57

Wow, vielen Dank Ragnar :)
just me
Posts: 9574
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Text markieren

26 Mar 2014, 08:52

Bitte beachten:

Bei mehrzeiligen Texten arbeitet das Edit-Control intern mit dem Zeilenwechsel `r`n und berücksichtigt auch beide Zeichen für die Zeichenposition der nachfolgenden Zeichen. Beim Auslesen mit Gui, Submit oder GuiControlGet wandelt AHK diesen Zeilenwechsel in ein einfaches `n um. Wenn man die für EM_SETSEL benötigten Positionen sucht, ist es deshalb besser, sich den Text mit ControlGetText zu holen, weil da auf die Konvertierung verzichtet wird. Noch mehr Wirrwarr gibt es, wenn der Text im Control automatisch umgebrochen wird.
User avatar
Holle
Posts: 187
Joined: 01 Oct 2013, 23:19

Re: Text markieren

27 Mar 2014, 00:07

Vielen Dank für den Hinweis. Werde mir diesbezüglich etwas einfallen lassen.

Edit: Habe eine paar Tests gemacht, Am besten klappt es wenn man folgendes benutzt:

Code: Select all

GuiControl,,Edit,%text%
;....
GuiControlGet, Edit
StringReplace, Edit, Edit, `n, `r`n, All
So klappt das auch mit den automatischen Zeilenumbrüchen ganz gut.
just me
Posts: 9574
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Text markieren

29 Mar 2014, 08:47

Mmmh, für mich liefert

Code: Select all

Gui, Add, Edit, ... vEdit hwndHEDIT, ...
...
GuiControl, , Edit, %Text%
...
ControlGetText, EditText, , ahk_id %HEDIT%
ohne StringReplace dasselbe Ergebnis.

Das mit dem internen Zeilenumbruch kannst Du getrost verdrängen. Der wird nur dann interessant, wenn Du statt der logischen die Nummer der physischen Zeile eines Edit-Controls ermitteln willst, die einen bestimmten Text enthält.

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 37 guests