1 (изменено: MandarinKa02, 2018-07-27 00:37:04)

Тема: AHK: ссылка на класс

Всем привет, есть два класса. Один класс дает второму задание: считать постепенно до 100.
Допустим вот:


MsgBox Start
_class1.start()
MsgBox End
Reload
return

F5::Reload

class _class1 {
	start() {
		_class2.start(10) ;даем команду считать до ста
	}
	action(value) {
		Tooltip % value
	}
}


class _class2 {
	Static _func
	set(func) {
		this._func := func
	}
	start(value) {
		i := 0
		While(i != 100) {
			i+= 1
			;<--сообщить значение-->
			Sleep 10
		}
	}
}

Как сделать так чтобы после каждого подсчета(i++), второй класс посылал значение экземпляру первого. (т.к. это класс, а не функция и я собираюсь использовать в дальнейших скриптах, то _class1.action(i) здесь не пойдет.)

2 (изменено: stealzy, 2017-11-07 02:51:22)

Re: AHK: ссылка на класс

MandarinKa02 пишет:

_class1.Action(i) здесь не пойдет

Тогда уж _class1.myCounter := i.
А вообще, откуда по-вашему вызываемый класс должен знать переменные вызывающего?

_class2.Start(10, this.counter)
...
Start(value, ByRef callerCounter)
...
callerCounter := A_Index

Думаю, мысль понятна.
Подобным же образом можно передать и экземпляр класса. Принимаем его в переменную caller и присваиваем caller.counter := A_Index.

3

Re: AHK: ссылка на класс

Насколько помню, все объекты - это ссылочный тип. Тогда, чтобы иметь доступ к пространству имён какого-то класса, достаточно иметь его экземпляр:


;MsgBox Start
oClass := New _class1()
oClass.start()
MsgBox End
;Reload
return

F5::Reload

class _class1 {
	lClass := {}
	__New() {
		this.lClass := New _class2()	; ссылка на пространство имён _class2
	}
	start() {
		this.lClass.Action(100) ;даем команду считать до ста
		this.action()
	}
	action() {
		Tooltip % this.lClass.counter
	}
}
class _class2 {
	counter := ""
	Action(value) {
		this.counter := 0
		while (this.counter < value)
			this.counter++
	}
}

4 (изменено: MandarinKa02, 2017-11-07 19:07:07)

Re: AHK: ссылка на класс

stealzy, немного не то, что я хотел.

KusochekDobra, тоже не совсем то.

Вот пример, где класс вызывает заданную функцию:

+ открыть спойлер
MsgBox Start
_class2.set(Func("action"))
_class1.start()
MsgBox End
Reload
return

action(value) {
	Tooltip % value
}

F5::Reload

class _class1 {
	start() {
		_class2.start(10) ;даем команду считать до ста
	}
	action(value) {
		Tooltip % value
	}
}


class _class2 {
	Static _func
	set(func) {
		this._func := func
	}
	start(value) {
		i := 0
		While(i != 100) {
			i+= 1
			func := this._func
			%func%(i)
			Sleep 10
		}
	}
}

Можно реализовать как-то вот эту строку?

+ открыть спойлер

var  := new _class1
var2 := "start"
var.%var2%(i)



class _class1 {
start(value) {
msgbox var=%value%
}
}

т.е. вместо %var2% должно подставиться start-----> var.start(i)

5 (изменено: stealzy, 2017-11-07 19:04:01)

Re: AHK: ссылка на класс

MandarinKa02, если не поняли, экземпляр создается с помощью ключевого слова new.
Использовать классы, как это делаете вы, допустимо, но абсолютно неправильно.

y := new _class1, x := new _class2
x._caller := y, y.start(x)

class _class1 {
	start(x) {
		x.start(10) ;даем команду считать до ста
	}
	action(value) {
		Tooltip % value
	}
}
class _class2 {
	start(value) {
		Loop 100 {
			this._caller.action(A_Index)
			Sleep 10
		}
	}
}
MandarinKa02 пишет:

var.%var2%(i)

ObjBindMethod.

6 (изменено: MandarinKa02, 2017-11-07 19:08:00)

Re: AHK: ссылка на класс

stealzy пишет:

ObjBindMethod

Да, именно то. Спасибо!

7

Re: AHK: ссылка на класс

var2 := "start"
var[var2](i)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder