Неправильная нумерация строк Topic is solved

Помощь в написании скриптов
marusa122
Posts: 135
Joined: 22 Mar 2023, 07:48

Неправильная нумерация строк

27 Sep 2023, 05:17

Здравствуйте. Есть скрипт, который при нажатии комбинации клавиш должен вставлять номер строки в текстовом поле, текущие дату и время и определенную запись:

Code: Select all

:*:да::
{
	FormatTime, CurrentDateTime,, dd.MM H:mm
	SetKeyDelay 0 
	ControlGetText, OriginalText, Edit1, A
	StringSplit, Lines, OriginalText, `n
	LineNumber := Lines0 + 1
	Result := LineNumber . ") " . CurrentDateTime . " выполнено"
	SendInput % Result
	Return
}
Проблема - при проставлении номера строки скрипт постоянно пропускает строку 2. Получается так:
1) 27.09 12:00 выполнено
3) 27.09 13:00 выполнено
4) 27.09 14:00 выполнено
А должно быть так:
1) 27.09 12:00 выполнено
2) 27.09 13:00 выполнено
3) 27.09 14:00 выполнено
И еще проблема - в каком-нибудь Блокноте скрипт считает строки (хоть как-то), а в текстовом поле в браузере не считает, постоянно пишет "1)...". Что не так со скриптом?
mcl
Posts: 387
Joined: 04 May 2018, 16:35

Re: Неправильная нумерация строк

27 Sep 2023, 13:41

marusa122 wrote: Здравствуйте. Есть скрипт, который при нажатии комбинации клавиш должен вставлять номер строки в текстовом поле, текущие дату и время и определенную запись
На самом деле скрипт пропускает первую строку, потому что StringSplit от пустой строки делает ноль частей.
  • Вы вводите 'да';
  • AHK услужливо стирает эти буквы перед тем, как выполнять код;
  • ControlGetText получает из поля пустую строку;
  • StringSplit от пустой строки запишет в переменную Lines число 0.
  • Вы прибавляете единичку, и вроде всё правильно...
  • ...но на следующей строке StringSplit увидит перенос строки и запишет в Lines число 2.
Есть другой способ считать строки (и не только), через StrReplace:

Code: Select all

	...
	StrReplace(OriginalText, "`n", "`n", Lines0)   ; считаем, сколько в тексте переносов строк
	LineNumber := Lines0 + 1                       ; и прибавляем 1.
	...
И еще проблема - в текстовом поле в браузере не считает, постоянно пишет "1)...". Что не так со скриптом?
Со скриптом всё в порядке, просто в браузере нет текстового поля Edit1. Там вообще нет привычных системных элементов — они сделаны чтоб работать и на Windows, и на Linux, и на MacOS, поэтому все кнопки и поля, которые там есть — самодельные, и через AHK к ним достучаться очень непросто.

Если Вас не раздражает мерцание и скачущий курсор, можно сделать чтение поля через выделение и копирование всего текста по Ctrl+A / Ctrl+C, а текст доставать из буфера обмена. В общем-то, надёжнее будет сразу в буфере обмена дописать нужное и вставить всё целиком.

Code: Select all

:*:да::
{
	FormatTime, CurrentDateTime,, dd.MM H:mm
	SetKeyDelay 0
	
	Clipboard := ""  ; Надеюсь, в буфере обмена не было ничего важного
	SendInput ^a^c   ; Выделяем и копируем весь текст
	ClipWait, 1      ; Ждём, пока скопируется текст - вдруг браузер задумался.
	OriginalText := Clipboard
	
	StrReplace(OriginalText, "`n", "`n", LinesCount)
	LineNumber := LinesCount + 1
	Result := LineNumber . ") " . CurrentDateTime . " выполнено"
	
	Clipboard .= Result
	SendInput ^v     ; Вставляем результат
	Return
}
Привет :3
marusa122
Posts: 135
Joined: 22 Mar 2023, 07:48

Re: Неправильная нумерация строк

27 Sep 2023, 14:52

mcl wrote:
27 Sep 2023, 13:41
Если Вас не раздражает мерцание и скачущий курсор, можно сделать чтение поля через выделение и копирование всего текста по Ctrl+A / Ctrl+C, а текст доставать из буфера обмена. В общем-то, надёжнее будет сразу в буфере обмена дописать нужное и вставить всё целиком.
А я пробовала так делать, кстати. Только у меня скрипт стирал весь текст, который уже был в этом поле и количество строк в котором нужно подсчитать))
Попробовала ваш скрипт - работает. Но когда я пытаюсь заполнять в обратном порядке (добавляя новую строку не сверху, а снизу), курсор сносит в конец последней строки, и он "склеивает" новую строку с ней. Как это исправить?
Должно быть так:
3) 27.09 14:00 выполнено
2) 27.09 13:00 выполнено
1) 27.09 12:00 выполнено
А получается так:
1) 27.09 12:00 выполнено2) 27.09 13:00 выполнено2) 27.09 14:00 выполнено
mcl
Posts: 387
Joined: 04 May 2018, 16:35

Re: Неправильная нумерация строк  Topic is solved

27 Sep 2023, 15:22

marusa122 wrote: Но когда я пытаюсь заполнять в обратном порядке (добавляя новую строку не сверху, а снизу), курсор сносит в конец последней строки, и он "склеивает" новую строку с ней. Как это исправить?
Эта задачка покучерявей — при выделении текста курсор смещается, поэтому таким способом вставить текст на прежнее место не выйдет. Можно, конечно, вырезать текст до курсора и текст после курсора, а результат воткнуть посредине — но все эти манипуляции идут через буфер обмена, а он не очень-то быстр и надёжен.

Code: Select all

:*:да::
{
	FormatTime, CurrentDateTime,, dd.MM H:mm
	SetKeyDelay 0
	
	Clipboard := ""        ; Надеюсь, в буфере обмена не было ничего важного
	SendInput +^{Home}^x   ; Выделяем и вырезаем текст от курсора до начала
	ClipWait, 0.15         ; Ждём, пока скопируется текст - вдруг программа задумалась
	TextBefore := Clipboard
	
	Clipboard := ""        ; Вторично очищаем буфер обмена
	SendInput +^{End}^x    ; Выделяем и вырезаем текст от курсора до конца
	ClipWait, 0.15         ; Ждём, пока скопируется текст
	TextAfter := Clipboard
	
	StrReplace(TextBefore . TextAfter, "`n", "`n", LinesCount)
	LineNumber := LinesCount + 1
	Result := LineNumber . ") " . CurrentDateTime . " выполнено"
	
	Clipboard := TextAfter
	SendInput ^v       ; Вставляем текст после курсора
	SendInput ^{Home}  ; Возвращаем курсор в самое начало текста
	Sleep 100          ; Небольшая задержка, чтобы браузер успел вставить текст
	Clipboard := TextBefore . Result
	SendInput ^v       ; Вставляем текст до курсора и результат — курсор должен оказаться на нужном месте
	Return
}
Возможны побочные эффекты — например, Ctrl+V до программы дойдёт как до жирафа, и вставится два куска „после“; можно поправить увеличением задержек в ClipWait / Sleep.
marusa122
Posts: 135
Joined: 22 Mar 2023, 07:48

Re: Неправильная нумерация строк

28 Sep 2023, 05:58

mcl, большое спасибо, теперь работает так, как нужно!

Return to “Помощь”

Who is online

Users browsing this forum: No registered users and 25 guests