Поддерживаю.
В моём понимании, класс полезен для тонкой настройки поведения и описывает за раз одну сущность, отделяя "мух и котлеты" друг от друга. Таким образом, у Вас, по идее, должно быть описание устройств из компонентов, описанных классами, а GUI - всего лишь интерфейс, в который транслируется их состояние. Иными словами, управляющая оболочка работает с экземплярами классов, которые глобальны в контексте сценария, чем удобны в доступе, а не является их частью, из-за чего возникают трудности, как в первом примере.
#SingleInstance, Force
#NoEnv
Global currVol := 1000 ; текущая наполненность бочек(для примера)
allBarrels := {"Красная бочка": New Barrel("Красная бочка", 1000
, "Синий насос")
,"Зелёная бочка": New Barrel("Зелёная бочка", 2000
, "Игрушечный насос", 10, 10)}
Gui,1: Add, Text,Border gShowMyBarrel,Красная бочка
Gui,1: Add, Text,x+5 Border gShowMyBarrel,Зелёная бочка
Gui,1: Show,,Бочки
return
ShowMyBarrel:
if (showed)
Gui,2: Destroy
Gui,2: Add, Text,,Бочка:
Gui,2: Add, Text,x+5,% allBarrels[A_GuiControl].name
Gui,2: Add, Text,xm y+5,Макс объём:
Gui,2: Add, Text,x+5,% allBarrels[A_GuiControl].maxVol
Gui,2: Add, Text,xm y+5,Заполненность:
Gui,2: Add, Text,x+5,% allBarrels[A_GuiControl].currentVol "%"
Gui,2: Add, Text,xm y+5,Состояние:
Gui,2: Add, Text,x+5,% allBarrels[A_GuiControl].state
Gui,2: Add, GroupBox,xm y+5 w150 h100,Насос
Gui,2: Add, Text,xm+5 yp+15,Наименование:
Gui,2: Add, Text,xm+5 y+2,% allBarrels[A_GuiControl].oPump.name
pwrOn := allBarrels[A_GuiControl].oPump.state
Gui,2: Add, Radio,xm+5 y+15 von Checked%pwrOn%,Вкл
pwrOff := !pwrOn
Gui,2: Add, Radio,x+5 voff Checked%pwrOff%,Выкл
forw := allBarrels[A_GuiControl].oPump.direction
Gui,2: Add, Radio,xm+5 y+5 vforward Group Checked%forw%,Вперёд
bckw := !forw
Gui,2: Add, Radio,x+5 vbackward Checked%bckw%,Назад
Gui,2: Show,,ЦПУ
showed := true
return
2GuiClose:
Gui,2: Destroy
showed := false
return
GuiClose:
ExitApp
Class Barrel {
__New(bName, bMaxVol, pName, pPower := 1000, pMaxPower := 1000, pState := false) {
this.name := bName
this.maxVol := bMaxVol
this.currentVol := this.CheckMyself(currVol)
this.state := this.currentVol < 100 ? "Наполняется" : "Полная"
this.oPump := New Pump(pName, pPower, pMaxPower, pState)
}
CheckMyself(vol) {
; диагностика
; провеить текущее наполнение
; вернуть процент заполненности бочки
return vol * 100 // this.maxVol
}
ToFill() {
this.state := "Наполняется"
(!this.oPump.direction && this.oPump.Reverse())
}
ToEmpty() {
this.state := "Опустошается"
(this.oPump.direction && this.oPump.Reverse())
}
ToFaster(count) {
this.oPump.PowerUp(count)
}
ToSlower(count) {
this.oPump.PowerDown(count)
}
Stop() {
this.oPump.PowerOff()
}
}
Class Pump {
__New(name, power, maxPower, state) {
this.name := name
this.power := power
this.maxPower := maxPower
this.state := state
this.direction := true
}
PowerOn() {
this.state := true
{
; ожидание отклика устройства
; установка текущей мощности и прочие параметры
}
}
PowerOff() {
this.state := false
{
; остановка
; ожидание полной остановки
}
}
PowerUp(uPwr) {
if (!this.state)
this.PowerOn()
this.power := this.power + uPwr <= this.maxPower ? this.power + uPwr : this.maxPower
}
PowerDown(dPwr) {
if (this.state) {
if (this.power - dPwr > 0)
this.power := this.power - dPwr
else {
this.power := 0
this.PowerOff()
}
}
}
Reverse() {
; сменить направление работы насоса на обратное
this.PowerOff()
this.direction := !this.direction
this.PowerOn()
}
}
Здесь, в первом GUI отображён кликабельный список бочек, отображающий второй GUI с их состояниями. Все данные доступны глобально и не мешают внутреннему описанию своих компонентов.