1

Тема: AHK: Динамический Gui + A_Index

Нужно сваять динамический gui с добавлением контролов.
Вот че получилось:

points := 2

Gui Add, Text, w200 y20 Center, Количество Edit Box:
Gui Add, Edit, wp Center Limit1 vNewpoints gAddpoints, % points
Loop % points {
	Gui Add, Edit, % "wp vVar" A_Index
	}
Gui Show
Return

Addpoints:
	Gui Submit, NoHide
	Loop % Newpoints {
		Gui Add, Edit, % "wp vVar" A_Index
		}
	Gui Show, AutoSize
Return

При увеличении количества Edit вываливает ошибку, типа "Низя одну и ту же переменную юзать!".
Изменяю во втором цикле vVar на vVar1 - работает, но нужно чтоб было "vVar" A_Index
Кроме того, как потом уменьшить количество контролов?
Ведь такой опции нет, а только GuiControl hide .... GuiControl delete нету .... че делать???

Помогите пожалуйста ....

2

Re: AHK: Динамический Gui + A_Index

Добавлять можно так:

GoSub, Addpoints
Gui Show
Return

F3::
Addpoints:
points++
Gui Add, Edit, v%points%
Gui Show, AutoSize
Return

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

3

Re: AHK: Динамический Gui + A_Index

Вот щас нарыл на забугорном форуме одну штуку. Пишут, что удаляет контролы, сам еще не разобрался и не пробовал.
Рабочих примеров тоже нет, тока это:

DllCall("DestoryWindow", "UInt", ControlID)

Кто-нить пробовал это?

И ваще как ЭТО прикрутить к ТОМУ???

4

Re: AHK: Динамический Gui + A_Index

Лучше сразу создать максимальное количество контролов, а потом скрывать и показывать:

EditNumber := 2
editMaxNumber := 10

Loop % editMaxNumber
   list .= (A_Index = 1 ? "" : "|") . A_Index

Gui, Add, Text, x50 y13 vText, Количество Edit Box:
Gui, Add, ComboBox, vEditNumber gChangeEditNumber x+5 yp-3 w40 Choose%EditNumber% r10, % list

GuiControlGet, Text, Pos
editW := TextW + 40*3 + 5

Loop % editMaxNumber
   Gui, Add, Edit, % "x10 w" . editW . " vVar" . A_Index . (A_Index > EditNumber ? " Hidden" : "")

GuiControlGet, Var%EditNumber%, Pos
Gui, Show, % "h" Var%EditNumber%Y + Var%EditNumber%H + 10
Return

ChangeEditNumber:
   GuiControlGet, EditNumber
   Loop % editMaxNumber
      GuiControl, % A_Index > EditNumber ? "Hide" : "Show", Var%A_Index%
   
   GuiControlGet, Var%EditNumber%, Pos
   Gui, Show, % "h" Var%EditNumber%Y + Var%EditNumber%H + 10
   Return
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5 (изменено: Mambr, 2017-11-12 01:31:00)

Re: AHK: Динамический Gui + A_Index

teadrinker, это я знаю - слишком громоздко получается, если show/hide использовать.

А что по поводу этого:

DllCall("DestoryWindow", "UInt", ControlID)

6 (изменено: Mambr, 2017-11-12 01:49:11)

Re: AHK: Динамический Gui + A_Index

Кстати, вот линк:

https://autohotkey.com/board/topic/8805 … i-control/

Может чего не так понял ....

7

Re: AHK: Динамический Gui + A_Index

Думаю, будет не менее громоздко. Кроме того могут возникнуть проблемы, связанные с тем, что такое удаление не поддерживается GUI-синтаксисом AHK.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8 (изменено: Mambr, 2017-11-12 01:53:30)

Re: AHK: Динамический Gui + A_Index

печалька .... буду че-нить другое изобретать ...

9 (изменено: Malcev, 2017-11-12 10:59:55)

Re: AHK: Динамический Gui + A_Index

В принципе можно удалять контролы.
Правда в памяти Ahk они всё-равно остаются.
Но не заметил в этом никаких глюков, разве, что память будет слегка отъедать.

count := points := 2
Gui, +LastFound
Gui Add, Text, w200 y20 Center, Количество Edit Box:
Gui Add, Edit, wp Center Limit1 vNewpoints gAddpoints, % points
Loop % points
{
   Gui Add, Edit, % "wp vVar" A_Index
   If (A_Index = points)
      GuiControlGet, LastPosition, Pos, Var%A_Index%
}
Gui Show
Return

Addpoints:
Gui Submit, NoHide
WinGet, CL, ControlListHwnd
StringReplace, CL, CL, `n, `n, UseErrorLevel
ControlCount := ErrorLevel - 1
if (Newpoints > ControlCount)
{
   Loop % Newpoints - ControlCount
   {
      count++
      LastPositionY+=27
      Gui Add, Edit, % "wp vVar" count " x" LastPositionX " y" LastPositionY
   }
}
else
{
   Loop, Parse, CL, `n
   {
      If (A_Index = Newpoints + 2)
         GuiControlGet, LastPosition, Pos, %A_LoopField%
      If (A_Index > Newpoints + 2)
         DllCall("DestroyWindow", "Ptr", A_LoopField)
   }
}
Gui Show, AutoSize
Return

10

Re: AHK: Динамический Gui + A_Index

Значит не обманули буржуины - работает эта фигня!
У меня тоже вроде не глючит.
Ну а память я не заметил, чтобы много съедало, да и че ее экономить в наше время, когда у всех ее от 6-8 Gb +

В этой справке обещают сделать GuiControl, Delete:

https://www.autohotkey.com/docs/commands/GuiControl.htm

GuiControl, Delete (not yet implemented): This sub-command does not yet exist. As a workaround, use Hide and/or Disable (above), or destroy and recreate the entire window via Gui Destroy.

... но сколько еще ждать - не известно.

11

Re: AHK: Динамический Gui + A_Index

Полагаю ждать бессмысленно.
Во всяком случае в автохотки 2 такого метода нету.
https://lexikos.github.io/v2/docs/objec … ontrol.htm

12

Re: AHK: Динамический Gui + A_Index

Был у меня подобный случай.
Я пришел к следующему умозаключению:
при "удалении" контрола мы его просто скрываем, а при "добавлении" нового мы его редактируем как нам угодно и показываем где нужно.
При таких раскладах памяти выделиться ровно столько, сколько раз мы нажали на кнопочку добавить контрол.

В принципе можно организовать массив с "удаленными" контролами...
Надеюсь я вам помог.

13

Re: AHK: Динамический Gui + A_Index

Можно еще самому создавать гуи через dllcall и уже с ними делать, что угодно.