Einzelne Zeilen aus Textfeld auslesen

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Einzelne Zeilen aus Textfeld auslesen

20 Oct 2017, 17:17

Hallo Programme,

ich habe ein Textfenster, in das ich Ausgaben mache (logo).
Alle Zeilen haben eine Feste breite von 32 Zeichen und am Ende ein "`n".

Ein Beispiel Textblock:

Code: Select all

 #000025   31.05.2017     10:00 
 01 BED. 1               000000 
           *SD*                 
 ORDNER WÄHLEN                  
 NAME                  NOSTALGI 
 SD NORMAL                      
 ------------------------------ 
 #000026   31.05.2017     10:00 
 01 BED. 1               000000 
           *SD*            |        <<<<====  Hier soll sich z.B. gerade der Cursor befinden    
 GESAMT RAM SICH                
 SD NORMAL                      
 ------------------------------ 
 #000027   31.05.2017     10:00 
 01 BED. 1               000000 
           *SD*                 
 PROG.SICHERN                   
 ALLE PROG.DATEN                
 SD NORMAL                      
 ------------------------------ 
 #000033   31.05.2017     11:32 
 01 BED. 1               000000 
           *SD*                 
 GESAMT RAM SICH                
 SD NORMAL                      
 ------------------------------ 
 #000034   31.05.2017     11:33 
 01 BED. 1               000000 
           *SD*                 
 PROG.SICHERN                   
 ALLE PROG.DATEN                
 SD NORMAL                      
Ich möchte nun per Contextmenü und/oder Tastenkürzel eine Funktion aufrufen, die den Textblock, in dem sich z.B. aktuell der Cursor befindet, ausgewählt und ins Clipboard kopiert werden kann.
Das einzige Kriterium in jedem Block ist " #000034 31.05.2017 11:33 ".
Die "-----" Linien kann der User nach eigenen Wünschen ein- oder ausschalten, man kann sie also nicht als Kriterium zur Trennung heranziehen.

Wie kann ich, wenn das überhaupt mit AHK geht, feststellen, wo sich der Cursor befindet und dann diesen betreffenden Block markierern, bzw. kopieren?

Ich habe im Code mal einen Cursor gesetzt, um es zu verdeutlichen.
Ich möchte also diesen Text nachher bekommen:

Code: Select all

 #000026   31.05.2017     10:00 
 01 BED. 1               000000 
           *SD*                
 GESAMT RAM SICH                
 SD NORMAL                      
Lieben Dank für Tipps,

Gucky.
User avatar
LuckyJoe
Posts: 335
Joined: 02 Oct 2013, 09:52

Re: Einzelne Zeilen aus Textfeld auslesen

21 Oct 2017, 10:01

Hi Gucky,

nur so als Ideenansatz: wie wäre es, wenn du mit "Pos1" und "Shift-Up" den Text (rückwärts) markierst, vielleicht bis zu einer max. Anzahl von Schritten (z.B. max. 5 x hoch). Dann den Text in die Zwischenablage und dort prüfen, ob sich darin dein "Selector" (#..... usw) befindet. Mit der Position hast du dann Position 1 und kannst wieder mit "Shift-Down"/"Ctrl-c" weiterarbeiten.

Viel Erfolg
Lucky Joe
Herzliche Grüße aus dem Rheinland
Lucky Joe
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Einzelne Zeilen aus Textfeld auslesen

21 Oct 2017, 10:11

Man könnte in diesem Kontext auch ctrl+a verwenden und alle Daten auslesen und danach mit denen anders weiterarbeiten ( Weil diese Methode mit dem Textfeld erhalten scheint mir suboptimal ).
Recommends AHK Studio
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Einzelne Zeilen aus Textfeld auslesen

21 Oct 2017, 12:12

@ nnnik:
Wenn ich alles kopiere (was nicht nötig ist, da ich den Inhalt des Textfeld eh in einer Variablen habe),
dann fehlt mit die aktuelle Cursorposition.
Aber mit LuckyJoes Hinweis könnte ich von dieser an den Text markieren und habe die Anzahl der Zeichen von Anfang an. Damit kann ich dann rechnen und z.B. nach den Markern suchen.
Von daher war sein Tipp klasse. Danke!
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Einzelne Zeilen aus Textfeld auslesen

21 Oct 2017, 13:27

Mein Tipp war als Erweiterung zu LuckyJoes Kommentar gemeint. Oder Optional das Textfeld komplett entfernen und in einer seperaten scripteigenen GUI weiterarbeiten und danach zurückschreiben.
Recommends AHK Studio
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Einzelne Zeilen aus Textfeld auslesen

22 Oct 2017, 11:06

Das oben beschriebene klappt wunderfeinstens XD

1) Ich sende {Home}, um an den Zeilenanfang der Zeile, in der der Cursor gerade ist, zu gelangen.
2) Ich sende {SHIFT} {DOWN}, um diese Zeile komplett zu markieren.
3) Ich frage ab, ob am Zeilenanfang das Suchmuster vorkommt.
4) Wenn ja, sende ich [SHIFT} {DOWN}, um die nächste Zeile zu der bisherigen Auswahl dazu zu markieren.
Wenn nein, mache ich nix, da der User den Cursor in die erste Zeile bewegen muss, wenn er diese Funktion nutzen will.
5) Ich selektiere so lange die nächste Zeile dazu, bis auch in dieser das Suchmuster vorkommt.
6) Ist dies der Fall, sende ich {SHIFT} {UP}, um die zuletzt gefundene Zeile wieder zu delselektieren.
7) Dann sende ich [CTRL c}
8) Habe fertig.

Danke für Eure Tipps. Manchmal ist es das einfachste, an das man nicht denkt.

Gucky.
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Einzelne Zeilen aus Textfeld auslesen

23 Oct 2017, 02:21

Hallo zusammen,

noch ´ne, vermutlich saublöde, Frage zu Editfledern:

Wenn ich (s. Beispiel oben) auf die Nummer "#012345" doppelt klicke, wird diese markiert.
Wie kann ich im Script auf den Doppelklick reagieren?

Mit dem G Label geht es schon mal nicht.

Dank Euch,

Gucky.
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Einzelne Zeilen aus Textfeld auslesen

23 Oct 2017, 02:29

OnMessage()/A_GuiEvent/A_GuiControlEvent :?:
User avatar
LuckyJoe
Posts: 335
Joined: 02 Oct 2013, 09:52

Re: Einzelne Zeilen aus Textfeld auslesen

23 Oct 2017, 02:34

Hi Gucki,

such mal in der Hilfe nach "A_GuiEvent" oder "A_GuiControlEvent". Dort kan das Ereignis "DoubleClick" abgefangen werden. In der Hilfe findest du übrigens auch weitere Unterstützung zum "Doppelklick" (z.B. g-Label-Benachrichtigungen beim ListView).

Viel Erfolg!
Lucky Joe
Herzliche Grüße aus dem Rheinland
Lucky Joe
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Einzelne Zeilen aus Textfeld auslesen

23 Oct 2017, 03:46

Hallöchen,

"A_GuiEvent" oder "A_GuiControlEvent" werden jedoch nur dann übergeben, wenn das G Label aufgerufen wird, was offenbar bei Textfeldern nicht gegeben ist, bzw. nur dann stattfindet, wenn sich der Textinhalt ändert.

Das G Label wird zumindest in meinem Script aber bei einem Doppel- Rechts- oder Linksklick nicht aufgerufen. Daher auch meine Frage.

HIER steht geschrieben:
"A g-label such as gMySubroutine may be listed in the control's options. This would cause the MySubroutine label to be launched automatically whenever the user or the script changes the contents of the control."

Das verstehe ich so, dass ausschließlich die Änderung des Testes (durch EIngabe oder per Kommando) einen Aufruf des G Label nach sich zieht, nicht aber ein Mausklick.


@ Bobo:
OnMessage schau ich mir gerade mal an. Das könnte klappen klappt!
Last edited by Gucky_87 on 23 Oct 2017, 05:05, edited 2 times in total.
User avatar
LuckyJoe
Posts: 335
Joined: 02 Oct 2013, 09:52

Re: Einzelne Zeilen aus Textfeld auslesen

23 Oct 2017, 04:40

Herzliche Grüße aus dem Rheinland
Lucky Joe
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Einzelne Zeilen aus Textfeld auslesen

23 Oct 2017, 05:06

Ich hab mein Script bzgl. dessen zwar inzwischen am Laufen, dennoch ist der Link von Dir sehr interessant. Dank Dir.
just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Einzelne Zeilen aus Textfeld auslesen

28 Oct 2017, 03:33

Moin,

das kommt etwas spät, weil ich im Urlaub war, aber:

AHK hat einige nützliche Control-Anweisungen, wie z.B. ControlGet. Die liefern auch für GUI-Controls auf einfache Weise einige interessante Informationen, die man mit den entsprechenden GuiControl-Anweisungen erstaunlicherweise nicht bekommt. Der Zugriff ist recht einfach, wenn man sich vom GUI-Control per Option Hwnd die ID holt und diese in der Anweisung als ahk_id (Fenstertitel) verwendet.

Du hast geschrieben, dass Du den kompletten Text ohnehin in einer Variablen hast. Du könntest Dir deshalb mit

Code: Select all

Gui, Add, Edit, HwndMeineEditID ...
...
ControlGet, CurLine, CurrentLine, , , ahk_id %MeineEditID%
die Nummer der Zeile holen, in der sich die Einfügemarke befindet, und den Rest dann über die vorhandene Variable erledigen, ohne die Zwischenablage zu bemühen.

ControlGet hat auch einen Sub-Befehl Selected, mit dem man sich den markierten Text aus einem Edit holen kann. Man muss nur beachten, dass enthaltene Zeilenumbrüche anders als bei GuiControlGet als `r`n geliefert werden.
User avatar
Gucky_87
Posts: 375
Joined: 03 Jul 2014, 05:09

Re: Einzelne Zeilen aus Textfeld auslesen

30 Oct 2017, 08:29

Hey, das liest sich ja klasse.
Ein HWND anlegen dauert ja jetzt nicht sooo fürchterlich lange (lach).

Lieben Dank für diesen Tip!

Gucky

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 33 guests