1

Тема: AHK v2: Рисование графиков из массива данных

Обсуждение этой темы.

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

2

Re: AHK v2: Рисование графиков из массива данных

Выглядит фундаментально!
Несколько моментов: метод __Delete() у вас не вызывается; непонятно, почему из окна убраны кнопки; где-то есть утечка памяти, посмотрите в Диспетчере Задач.

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

3

Re: AHK v2: Рисование графиков из массива данных

teadrinker пишет:

метод __Delete() у вас не вызывается

В описании к первой версии было. Пока что нет желания и сил сделать описание к этой версии.

Alectric пишет:

Важно!
Для удаления экземпляра класса обязательно необходимо вызвать метод "Delete" до удаления объекта.

teadrinker пишет:

непонятно, почему из окна убраны кнопки

Какие?

teadrinker пишет:

где-то есть утечка памяти

Это из-за роста массива так кажется.

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

4

Re: AHK v2: Рисование графиков из массива данных

teadrinker пишет:

метод __Delete() у вас не вызывается

Это если вынести выбранный график в отдельное окно?
Понял, исправил.

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

5

Re: AHK v2: Рисование графиков из массива данных

Всё равно не вызывается, добавьте туда MsgBox, увидите.

Alectric пишет:

Для удаления экземпляра класса обязательно необходимо вызвать метод "Delete" до удаления объекта

Выглядит, как костыль. Может лучше заставить __Delete() работать?

Alectric пишет:

Какие?

Минимизации и закрытия.

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

6

Re: AHK v2: Рисование графиков из массива данных

Ещё такое заметил:

  static WheelUp:=false
  static WheelDown:=false
  static HotKeymW:=0

А если будет создано несколько экземпляров класса, как они будут между собой делить эти значения?

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

7 (изменено: Alectric, 2025-04-15 21:29:23)

Re: AHK v2: Рисование графиков из массива данных

teadrinker пишет:

Минимизации и закрытия.

По задумке их не должно быть. Может потом переделаю.

teadrinker пишет:

А если будет создано несколько экземпляров класса, как они будут между собой делить эти значения?

Мышка может находиться только в 1 окне одновременно.

teadrinker пишет:

Выглядит, как костыль. Может лучше заставить __Delete() работать?

Не получилось сделать из-за ссылок на ObjBindMethod. Нигде не нашел как сделать иначе.

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

8

Re: AHK v2: Рисование графиков из массива данных

teadrinker пишет:

Может лучше заставить __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
Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

9

Re: AHK v2: Рисование графиков из массива данных

Без кнопок выглядит странно. Бывают такие окна в каких-то приложениях?

Alectric пишет:

Не получилось сделать из-за ссылок на 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'
        }
    }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10 (изменено: Alectric, 2025-04-16 10:22:21)

Re: AHK v2: Рисование графиков из массива данных

Вернул кнопки. Отобрал "костыль", деструктор вызывается.
Теперь не могу сообразить: как сообщить родительскому экземпляру что "этот" экземпляр можно удалять в методе Hide()?

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

11

Re: AHK v2: Рисование графиков из массива данных

По непонятной причине, иногда, деструктор вызывается 2 раза... не могу разобраться в чем причина.

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

12

Re: AHK v2: Рисование графиков из массива данных

Вроде разобрался с двойным вызовом деструктора.

Как сообщить родительскому экземпляру что "этот" экземпляр можно удалять в методе Hide()? Еще не знаю.

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

13

Re: AHK v2: Рисование графиков из массива данных

Нет... все-таки деструктор вызывается дважды иногда... выдал ему костыль, вроде стабильно работает.

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

14

Re: AHK v2: Рисование графиков из массива данных

Если деструктор вызывается дважды, значит создаётся ещё один экземпляр, вероятно здесь:

this.Child.Push(Graph())
Alectric пишет:

Как сообщить родительскому экземпляру что "этот" экземпляр можно удалять в методе Hide()?

Не совсем ясна суть вопроса, поясните, или лучше покажите на простом примере.

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

15

Re: AHK v2: Рисование графиков из массива данных

Alectric пишет:
; Добавление меню
    ; Меню настроек
    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")
...

Логические блоки лучше выделять не комментариями, а отдельными методами с соответствующими названиями.

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

16

Re: AHK v2: Рисование графиков из массива данных

Запусти пример, затем нажми на кнопку внизу графика "Выбран X" - появится дочерний экземпляр графика, в основном окне этот график станет скрытым.
Вообще, уже с этим разобрался... хотя не уверен что правильно сделал.
Почитай надписи при наведении на кнопки внизу, может какое-то описание непонятно?

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

17

Re: AHK v2: Рисование графиков из массива данных

teadrinker пишет:

Логические блоки лучше выделять не комментариями

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

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

18

Re: AHK v2: Рисование графиков из массива данных

Alectric пишет:

Выделяю в отдельные методы только то, что будет вызываться несколько раз

Это не совсем верно. Вообще считается, что метод или функция по размеру не должны превышать видимый на одном экране текст. Количество вызовов не имеет значения. Структура должна быть примерно такая:

#Requires AutoHotkey v2

class MyClass
{
    __New() {
        this.FirstMethod()
        this.SecondMethod()
        ; ...
        this.LastMethod()
    }

    FirstMethod() {
 
    }

    SecondMethod() {
        
    }

    LastMethod() {
        
    }
}
Alectric пишет:

Запусти пример, затем нажми на кнопку внизу графика "Выбран X"

Нажимаю "Выбрать 1", почему-то появляется график 2, но скрывается кнопка 1:

 https://i.imgur.com/m8Fg9Zd.png

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

19 (изменено: Alectric, 2025-04-16 20:19:04)

Re: AHK v2: Рисование графиков из массива данных

Потому-что "График 1" это название первого окна где все графики.

Название можно поменять, укажу это в описании когда руки дойдут.

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