Regexmach, хранилище результатов GUI - PullRequest
0 голосов
/ 08 мая 2019

У меня есть текст, в этом тексте данные изменены, я хотел бы собрать необходимые данные и показать в текстовых полях графического интерфейса пользователя. Первый скрипт представляет собой графический интерфейс, который может собирать данные из текста. Я хотел бы, если бы только значения загружались в эти поля редактирования.

Для экземпляра:

UserInput1 Tony

UserInput2 Stark

UserInput3 34234u4

т.д ...

First

Gui, Add, Edit, x22 y39 w190 h20 vUserInput1 readonly,  
Gui, Add, Edit, x22 y79 w190 h20 vUserInput2 readonly,
Gui, Add, Edit, x22 y119 w190 h20 vUserInput3 readonly,
Gui, Add, Edit, x22 y159 w190 h20 vUserInput4 readonly,
Gui, Add, Edit, x22 y199 w190 h20 vUserInput5 readonly,
Gui, Add, Edit, x22 y239 w190 h20 vUserInput6 readonly,
Gui, Add, Edit, x22 y279 w190 h20 vUserInput7 readonly,
Gui, Add, Edit, x22 y319 w190 h20 vUserInput8 readonly,
Gui, Add, Edit, x22 y359 w190 h20 vUserInput9 readonly,
; Generated using SmartGUI Creator 4.0
Gui, Show, x127 y87 h508 w242, New GUI Window
Return

GuiClose:
ExitApp

Secound

str=
(
|-----------------------------------+-+-----------------------------------|
| Title | |Mr. |
|-----------------------------------+-+-----------------------------------|
| First Name * | |TONY |
|-----------------------------------+-+-----------------------------------|
| Last Name * | |STARK |
|-----------------------------------+-+-----------------------------------|
| Please select the reference | |Rental Agreement Number |
| number type you can provide * | | |
|-----------------------------------+-+-----------------------------------|
| Providing Number / ID * | |1111111 |
|-----------------------------------+-+-----------------------------------|
| Reservierungsnummer | |34234u4 |
|-----------------------------------+-+-----------------------------------|
| Country of Rental * | |usa |
|-----------------------------------+-+-----------------------------------|
| Rental Station[<BR>](address) | |Airport |
|-----------------------------------+-+-----------------------------------|
| Pick-Up Date | |15/04/2019 |
|-----------------------------------+-+-----------------------------------|
| Return Date | |18/04/2019 |
|-----------------------------------+-+-----------------------------------|
| E-Mail Address * | |tony.stark@pwaero.utc.com |
|-----------------------------------+-+-----------------------------------|
| | | |
|-----------------------------------+-+-----------------------------------|
| | | |
|-----------------------------------+-+-----------------------------------|
| | | |
|-----------------------------------+-+-----------------------------------|
| | | |
|-----------------------------------+-+-----------------------------------|
| | | |
|-----------------------------------+-+-----------------------------------|
| | | |
|-----------------------------------+-+-----------------------------------|
| | | |
|-----------------------------------+-+-----------------------------------|
| | | |
|-----------------------------------+-+-----------------------------------|
| | | |
|-----------------------------------+-+-----------------------------------|
| | | |
|-----------------------------------+-+-----------------------------------|
| | | |
|-----------------------------------+-+-----------------------------------|
| | | |
|-----------------------------------+-+-----------------------------------|
| | | |
|-----------------------------------+-+-----------------------------------|
| | | |
|-----------------------------------+-+-----------------------------------|
)
Loop, Parse, str, `n, `r
{
    If (RegExMatch(A_LoopField,"^\|------|^\| \||Title|Agreement|type") > 0 )
        continue
    m := StrSplit(A_LoopField, "|")

    gui, add, text, xm,% m[4]
}

return

GuiEscape:
GuiClose:
Esc::
  ExitApp
return

1 Ответ

0 голосов
/ 20 мая 2019

Я предполагаю, что вам нужно загрузить поля элементов управления Edit, доступных только для чтения, из строки во втором сценарии.

Чтобы изменить содержимое элементов управления Edit и предположить, что выВы делаете это из того же скрипта, который создал GUI, вы можете использовать команду GuiControl с подкомандой Text, которая позволяет вам установить текст уже созданного элемента управления вместо добавления новогоТекстовые элементы управления для графического интерфейса.

Синтаксис этой команды:

GuiControl, Text, ControlID[, Value]

Где ControlID - это переменная, связанная с имеющимся элементом управления (UserInput1, UserInput2,и т. д.) (или также имя его класса и номер экземпляра (в вашем случае Edit1, Edit2 и далее) или уникальный идентификатор элемента управления, его HWND ).

Например, вы могли бы заменить свой цикл следующим:

count = 1
Loop, Parse, str, `r`n,
{
    If (RegExMatch(A_LoopField,"^\|------|^\| \||Title|Agreement|type") > 0 )
        continue
    m := StrSplit(A_LoopField, "|")

    GuiControl, Text, UserInput%count%, % m[4]
    count += 1
}

Что бы сработать.Заметьте, что я использую переменную count для ссылки на правильный элемент управления Edit каждый раз.
Вам не нужно беспокоиться о том, что элемент управления Edit равен ReadOnly, так как этот параметр запрещает только пользователю изменять его содержимое, а не ваши сценарии.
Я также изменил разделитель цикла на `r`n, который является правильным разделителем строки для циклов анализа, но это не должно повлиять на ваш скрипт.


Однако предыдущий подходпредполагается, что переменные, связанные с элементами управления вашего графического интерфейса (UserInput1, UserInput2, ...), также существуют во втором сценарии, что не происходит, если они не оба включаются в один и тот же основной сценарий с использованием директивы #include или вставляя их вместе вручную в один файл.

Если ваши сценарии нуждаются в для разделенияпроцессы, выполняющиеся параллельно по какой-то причине (возможно, нет), вы все равно можете установить текст элемента управления из второго сценария, используя команду ControlSetText, синтаксис которой:

ControlSetText[, Control, NewText, WinTitle, WinText, ExcludeTitle, ExcludeText]

В вашем случае вы можете указать 'EditN' в параметре Control для вашего N-го элемента управления Edit и 'New GUI Window ahk_class AutoHotkeyGUI' для параметра WinTitle (и оставить остальные параметры пустыми).), который будет соответствовать окну и элементу управления вашего графического интерфейса пользователя (если не существует нескольких AutoHotkeyGUI с одинаковыми заголовками или если в первом из них есть несколько элементов управления редактированием).[ Подробнее о параметре WinTitle ].

Используя эту команду, ваш цикл можно переписать так:

count = 1
Loop, Parse, str, `r`n
{
    If (RegExMatch(A_LoopField,"^\|------|^\| \||Title|Agreement|type") > 0 )
        continue
    m := StrSplit(A_LoopField, "|")

    ControlSetText, Edit%count%, % m[4], New GUI Window ahk_class AutoHotkeyGUI
    count += 1
}

Где, конечно, вы можете заменить 'New GUI Window 'под любым названием, которое вы можете прекратить использовать.


С другой стороны, я настоятельно рекомендую вам рассмотреть другую стратегию хранения данных вашего графического интерфейса, а не использовать этот сложный синтаксис разметки и ваш пользовательский (ноработает;)) RegEx.

Существует много различных альтернатив для хранения данных скрипта в отдельном файле, но очень простой может быть использование Ini File , способного хранить пары ключ-значение информации, структурированный по разделам, для которых AutoHotKey предоставляет встроенные команды IniRead, IniWrite и IniDelete

...