1

Тема: AHK: Использование переменных внутри классов

Добрый день, форумчане. Возник такой вот вопрос:

class Tank {
  x := 400
  y := 300
  Lica := 0
  Pr1 := 0
  Tx := 0
  update(new) 
  {
    this.Lica := new
    lica:=this.lica
    GuiControl,, this.Tx, %new%
  }
  paint()
  {
    x:=this.x
    y:=this.y    
    Gui, Add, Picture, w100 h-1 x%x% y%y%, C:\Users\vic\Pictures\Tank.emf
    x2:=x+35
    y2:=y+70
    gui, add, text, x%x2% y%y2% vthis.Tx, text     <--------------------
    x1:=x+80
    y1:=y+10
    gui, add, Progress,Border w10 h150 x%x1% y%y1% vertical cBlue vPr1
    GuiControl,, Pr1, 50 
  }
}

Как правильно использовать переменную внутри класса?
Так же, может кто то знает как организовать перемещение данной группы элементов? То есть мне нужно что бы я мышкой мог перемещать элемент по окну gui, в последствии и группу элементов одновременно.
Или может быть более простой выход из данной ситуации? Ну, создание группы элементов, как одного составного элемента. Может я зря заморачиваюсь с классами? Просто я думал потом, когда все будет организованно, можно будет создавать классы не из IDE в autohotkey'е, а прям из окна gui по нажатию кнопки? Как тут лучше поступить то?

2 (изменено: serzh82saratov, 2017-08-21 20:30:02)

Re: AHK: Использование переменных внутри классов

Как правильно использовать переменную внутри класса?

Вопрос не понял.

То есть мне нужно что бы я мышкой мог перемещать элемент по окну gui, в последствии и группу элементов одновременно.

Как то так:


#SingleInstance Force 
#NoEnv 
OnMessage(0x201, "WM_LBUTTONDOWN")

Gui, +HWNDhMain -DPIScale
Gui, Color, F9D886
Gui, Show, w420 h420

Gui, New
Gui, +HWNDhChild -DPIScale -Caption +0x40000000 -0x80000000  ; Add WS_CHILD, remove WS_POPUP
Gui, Color, FF0000
Gui, Add, Text, , Пермещай мышкой 
Gui, Add, Progress, y+10 h66 w100 Background178D00, 50
Gui, Add, Text, , Пермещай мышкой 
Gui, +Parent%hMain%
Gui, Show, NA AutoSize x1 y1
Return

WM_LBUTTONDOWN() {
	Global 
	If (hChild = A_Gui)
		PostMessage, 0xA1, 2,,,ahk_id %hChild%
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

3

Re: AHK: Использование переменных внутри классов

+AlwaysOnTop +E0x08000000 +0x40000000 -0x80000000

А это всё зачем?

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

4 (изменено: serzh82saratov, 2017-08-21 19:24:23)

Re: AHK: Использование переменных внутри классов

Это лишнее, удалил

+AlwaysOnTop +E0x08000000

а это

+0x40000000 -0x80000000

за этим.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5

Re: AHK: Использование переменных внутри классов

А какой смысл показывать дочернее окно после родительского?


#SingleInstance Force 
#NoEnv 
OnMessage(0x201, "WM_LBUTTONDOWN")

Gui, +HWNDhMain -DPIScale
Gui, Color, F9D886

Gui, New
Gui, +HWNDhChild -DPIScale -Caption
Gui, Color, FF0000
Gui, Add, Text, , Пермещай мышкой 
Gui, Add, Progress, y+10 h66 w100 Background178D00, 50
Gui, Add, Text, , Пермещай мышкой 
Gui, +Parent%hMain%
Gui, Show, NA AutoSize x1 y1
Gui, 1:Show, w420 h420
Return

WM_LBUTTONDOWN() {
	Global 
	If (hChild = A_Gui)
		PostMessage, 0xA1, 2,,,ahk_id %hChild%
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6

Re: AHK: Использование переменных внутри классов

Ну мало ли надо будет потом добавить, почему это сразу не предусмотреть?

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

7 (изменено: teadrinker, 2017-08-21 20:08:12)

Re: AHK: Использование переменных внутри классов

А в каком случае может понадобиться непредвиденно добавлять какие-то дочерние окна? Обычно это планируется заранее, окна делаются скрытыми, а потом показываются/скрываются по мере необходимости.

Ну а если уж использовать стили, то лучше их хотя бы расшифровать, а не в виде «магических чисел».

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

8

Re: AHK: Использование переменных внутри классов

teadrinker пишет:

Обычно это планируется заранее

Вот например пользователь добавляет сам группы элементов, группу элементов можно представить как дочернее окно которое не может предполагатся заранее.

teadrinker пишет:

«магических чисел»

Это да

Add WS_CHILD, remove WS_POPUP

Офф: раз уже тут про классы, то интересует ещё такой вопрос.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9

Re: AHK: Использование переменных внутри классов

Я подробно не исследовал, сам откуда-то скопировал.

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

10

Re: AHK: Использование переменных внутри классов

Из темы на оф.форуме, кажется Lexicos писал.

11

Re: AHK: Использование переменных внутри классов

Давайте в той теме продолжим.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

12

Re: AHK: Использование переменных внутри классов

serzh82saratov

Вопрос не понял.

Ну вот есть у меня класс Tank. В этом классе есть метод paint(). В методе используется отрисовка текста.

gui, add, text, x%x2% y%y2% vTx, text 

Для изменения этого текста в классе как мне правильно использовать переменную Tx?

13

Re: AHK: Использование переменных внутри классов

Пример привидите, тот что в шапке не годится.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

14

Re: AHK: Использование переменных внутри классов

class Tank {
  x := 400
  y := 300
  Lica := 0
  Pr1 := 0
  Tx := 0
  paint()
  {
    x:=this.x
    y:=this.y    
    Gui, Add, Picture, w100 h-1 x%x% y%y%, C:\Users\vic\Pictures\Tank.emf
    x2:=x+35
    y2:=y+70
    gui, add, text, x%x2% y%y2% vTx, text
    x1:=x+80
    y1:=y+10
    gui, add, Progress,Border w10 h150 x%x1% y%y1% vertical cBlue vPr1
   }
}

Пусть так будет. Вот как мне в этом классе изменить показания Progress и менять текст? vPr1 и vTx нужно использовать, но оно пишет "a control variable must be global or static". Мне из них нужно сделать глобальные переменные или все же можно придумать метод для их изменения?

15

Re: AHK: Использование переменных внутри классов

Ну так оно же вам само говорит "Контрольная переменная должна быть глобальной или статической", а чтобы понять что вам нужно, надо привести пример как (откуда) вы хотите менять текст.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

16

Re: AHK: Использование переменных внутри классов

Raven, если создаёте GUI внутри класса, лучше для идентификаторов контролов использовать их hwnd, тогда не придётся их объявлять глобальными или статическими:

MyTank := new Tank
MyTank.paint()
Loop  {
   Sleep, 10
   GuiControl,, % MyTank.Pr1, % A_Index
}

class Tank  {
   x := 10, y := 10
   paint()  {
      x1 := this.x + 80
      y1 := this.y + 10
      Gui, Add, Progress, Border w10 h150 x%x1% y%y1% vertical cBlue hwndPr1
      this.Pr1 := Pr1
      Gui, Show
   }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

17

Re: AHK: Использование переменных внутри классов

teadrinker То что нужно! Именно этого мне и не хватало! Спасибо! А как можно получить имя объекта внутри класса? То есть в вашем примере это будет MyTank. С помощью this.__Class мы получаем тип объекта, то есть Tank.

18

Re: AHK: Использование переменных внутри классов

Наверное только так.

MyTank := new Tank("MyTank")
MyTank.paint()

class Tank  {
   x := 10, y := 10
   __new(name)  {
     this.name := name
   }
   paint()  {
      MsgBox % this.name
   }
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

19

Re: AHK: Использование переменных внутри классов

Raven пишет:

А как можно получить имя объекта внутри класса?

А зачем это может понадобиться? Классу ничего не известно про его экземпляры, их может быть множество, разве что передать вручную, как выше.

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

20 (изменено: Raven, 2017-08-23 17:47:14)

Re: AHK: Использование переменных внутри классов

teadrinker Это мне нужно для того что бы объект знал свое имя и мог его сразу же отрисовать в gui.
serzh82saratov Спасибо большое за ответ. Раз по другому нельзя, будем делать так как вы посоветовали.

21 (изменено: Alectric, 2017-08-23 18:22:53)

Re: AHK: Использование переменных внутри классов

С классами не работал, но предполагаю (справку лень читать), что можно любые параметры в класс передавать.

MyTank := new Tank
MyTank.paint(10,10)
Loop  {
   Sleep, 10
   GuiControl,, % MyTank.Pr1, % A_Index
}

class Tank  {
   paint(x,y)  {
      x1 := x + 80
      y1 := y + 10
      Gui, Add, Progress, Border w10 h150 x%x1% y%y1% vertical cBlue hwndPr1
      this.Pr1 := Pr1
      Gui, Show
   }
}
Raven пишет:

можно будет создавать классы не из IDE в autohotkey'е, а прям из окна gui по нажатию кнопки?

А как потом все эти элементы сохранять загружать?

Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

22

Re: AHK: Использование переменных внутри классов

Raven пишет:

что бы объект знал свое имя

Тогда проще так:

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

23

Re: AHK: Использование переменных внутри классов

Alectric Да так же записать конфигурацию в файл и потом ее загружать при старте программы.

24

Re: AHK: Использование переменных внутри классов

Raven пишет:

можно будет создавать классы не из IDE в autohotkey'е, а прям из окна

Вы имеете ввиду именно классы, или всё же их экземпляры?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

25 (изменено: Raven, 2017-08-24 17:43:03)

Re: AHK: Использование переменных внутри классов

serzh82saratov Пардон, конечно же объекты из классов.

26

Re: AHK: Использование переменных внутри классов

Форумчане, подскажите пожалуйста как из объекта, по нажатию кнопки создающейся в классе, вызвать метод?

MyTank := new Tank
MyTank.paint(10,10)

class Tank  {
   paint(x,y)  {
      Gui, Add, Button, Border x%x1% y%y1% gTEST hwndPr1, Button
      this.Pr1 := Pr1
      Gui, Show
   }
TEST() {
MsgBox Вызов из тела объекта
}
}

27

Re: AHK: Использование переменных внутри классов

MyTank := new Tank
MyTank.paint(10,10)
Return

class Tank  {
   paint(x,y)  {
      Gui, Add, Button, Border x%x% y%y% gTank.TEST hwndPr1, Button
      this.Pr1 := Pr1
      Gui, Show
   }
	TEST() {
		MsgBox Вызов из тела объекта
	}
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

28

Re: AHK: Использование переменных внутри классов

serzh82saratov Спасибо огромное!

29 (изменено: serzh82saratov, 2017-08-28 18:17:13)

Re: AHK: Использование переменных внутри классов

Правда непонятно как тут использовать function object.
http://ahkscript.org/docs/commands/Gui.htm#Events

[v1.1.20+]: If not a valid label name, a function name can be used instead. Alternatively, the GuiControl command can be used to associate a function object with the control.

MyTank := new Tank
MyTank.paint(10,10)
Return

class Tank  {
   paint(x,y)  {
	  obj := ObjBindMethod(This, "get")
      Gui, Add, Button, Border x%x% y%y% g%obj% hwndPr1, Button
      this.Pr1 := Pr1
      Gui, Show
   }
	get() {
		MsgBox Вызов из тела объекта
	}
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui