Тема: AHK v2: Рисование графиков из массива данных
Обсуждение этой темы.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Обсуждение этой темы.
Выглядит фундаментально!
Несколько моментов: метод __Delete() у вас не вызывается; непонятно, почему из окна убраны кнопки; где-то есть утечка памяти, посмотрите в Диспетчере Задач.
метод __Delete() у вас не вызывается
В описании к первой версии было. Пока что нет желания и сил сделать описание к этой версии.
Важно!
Для удаления экземпляра класса обязательно необходимо вызвать метод "Delete" до удаления объекта.
непонятно, почему из окна убраны кнопки
Какие?
где-то есть утечка памяти
Это из-за роста массива так кажется.
метод __Delete() у вас не вызывается
Это если вынести выбранный график в отдельное окно?
Понял, исправил.
Всё равно не вызывается, добавьте туда MsgBox, увидите.
Для удаления экземпляра класса обязательно необходимо вызвать метод "Delete" до удаления объекта
Выглядит, как костыль. Может лучше заставить __Delete() работать?
Какие?
Минимизации и закрытия.
Ещё такое заметил:
static WheelUp:=false
static WheelDown:=false
static HotKeymW:=0
А если будет создано несколько экземпляров класса, как они будут между собой делить эти значения?
Минимизации и закрытия.
По задумке их не должно быть. Может потом переделаю.
А если будет создано несколько экземпляров класса, как они будут между собой делить эти значения?
Мышка может находиться только в 1 окне одновременно.
Выглядит, как костыль. Может лучше заставить __Delete() работать?
Не получилось сделать из-за ссылок на ObjBindMethod. Нигде не нашел как сделать иначе.
Может лучше заставить __Delete() работать?
Попробуй заставить на этом примере:
a:=test()
;a:=a.Delete() ; раскоментируй чтобы вызвать деструктор
a:=""
Class test
{
__Delete()
{
msgbox "Деструктор вызван.`n"
}
Delete()
{
settimer this.obm,0
this.obm:=""
}
__New()
{
this.obm:=ObjBindMethod(this,"f")
settimer this.obm,100
}
f(*)
{
tooltip a_tickcount
}
}
Esc::exitapp
Без кнопок выглядит странно. Бывают такие окна в каких-то приложениях?
Не получилось сделать из-за ссылок на ObjBindMethod. Нигде не нашел как сделать иначе.
#Requires AutoHotkey v2.0
inst1 := MyClass1()
inst2 := MyClass2()
Sleep 1500
inst1 := ''
inst2 := ''
class MyClass1
{
__New() {
this.timer := ObjBindMethod(this, 'MyTimer')
ObjRelease(ObjPtr(this))
SetTimer this.timer, -10
}
MyTimer() {
ToolTip 'Timer from MyClass1'
}
__Delete() {
ObjAddRef(ObjPtr(this))
SoundBeep 800
}
}
class MyClass2
{
__New() {
this.clbks := MyClass2.Callbacks()
this.timer := ObjBindMethod(this.clbks, 'MyTimer')
SetTimer this.timer, -1000
}
__Delete() {
SoundBeep 1200
}
class Callbacks
{
MyTimer() {
ToolTip 'Timer from MyClass2'
}
}
}
Вернул кнопки. Отобрал "костыль", деструктор вызывается.
Теперь не могу сообразить: как сообщить родительскому экземпляру что "этот" экземпляр можно удалять в методе Hide()?
По непонятной причине, иногда, деструктор вызывается 2 раза... не могу разобраться в чем причина.
Вроде разобрался с двойным вызовом деструктора.
Как сообщить родительскому экземпляру что "этот" экземпляр можно удалять в методе Hide()? Еще не знаю.
Нет... все-таки деструктор вызывается дважды иногда... выдал ему костыль, вроде стабильно работает.
Если деструктор вызывается дважды, значит создаётся ещё один экземпляр, вероятно здесь:
this.Child.Push(Graph())
Как сообщить родительскому экземпляру что "этот" экземпляр можно удалять в методе Hide()?
Не совсем ясна суть вопроса, поясните, или лучше покажите на простом примере.
; Добавление меню ; Меню настроек this.GraphMenuSettings:=Menu() obm:=ObjBindMethod(this,"MenuSave") this.GraphMenuSettings.add(this.mi.MenuSave,obm) obm:=ObjBindMethod(this,"MenuLoad") this.GraphMenuSettings.add(this.mi.MenuLoad,obm ... ; Создание основного окна this.GuiGraph:=Gui("+MinSize400x100 +Resize",this.Name) this.GuiGraph.MarginX:=0 this.GuiGraph.MarginY:=0 ... ; Создание окна перехода по времени this.GuiGoToT:=Gui("+owner" this.GuiGraph.Hwnd " -sysmenu -Resize","Перейти на время") this.GuiGoToT.SetFont("s10") this.hTT:=this.GuiGoToT.Add("DateTime","xm+1","HH:mm:ss dd.MM.yyyy") obm:=ObjBindMethod(this,"TTOk") ...
Логические блоки лучше выделять не комментариями, а отдельными методами с соответствующими названиями.
Запусти пример, затем нажми на кнопку внизу графика "Выбран X" - появится дочерний экземпляр графика, в основном окне этот график станет скрытым.
Вообще, уже с этим разобрался... хотя не уверен что правильно сделал.
Почитай надписи при наведении на кнопки внизу, может какое-то описание непонятно?
Логические блоки лучше выделять не комментариями
Это не логические блоки, это содержимое метода __New. Выделяю в отдельные методы только то, что будет вызываться несколько раз.
Выделяю в отдельные методы только то, что будет вызываться несколько раз
Это не совсем верно. Вообще считается, что метод или функция по размеру не должны превышать видимый на одном экране текст. Количество вызовов не имеет значения. Структура должна быть примерно такая:
#Requires AutoHotkey v2
class MyClass
{
__New() {
this.FirstMethod()
this.SecondMethod()
; ...
this.LastMethod()
}
FirstMethod() {
}
SecondMethod() {
}
LastMethod() {
}
}
Запусти пример, затем нажми на кнопку внизу графика "Выбран X"
Нажимаю "Выбрать 1", почему-то появляется график 2, но скрывается кнопка 1:
Потому-что "График 1" это название первого окна где все графики.
Название можно поменять, укажу это в описании когда руки дойдут.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться