FreeBasic
Главная
Вход
Регистрация
Пятница, 29.03.2024, 14:50Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Библиотеки для FreeBasic » Библиотека Window9 для Freebasic » Как послать событие гаджету?
Как послать событие гаджету?
electrikДата: Пятница, 28.01.2022, 19:35 | Сообщение # 1
Полковник
Группа: Друзья
Сообщений: 180
Репутация: 3
Статус: Offline
У пурика есть PostEvent, но в Window9 я подобного ненашёл. пробовал так:

Код

  PostMessage(hwnd, EventGadget, NULL, ID_MAIN_BUTTON_SELECT_FILE)


Не работает.

Скажу сразу, кнопка находится в контейнере.
 
haavДата: Пятница, 28.01.2022, 20:34 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Не знаю , зачем тебе это нужно, но вот пример для windows и linux:


Код
#Include "window9.bi"
Dim Shared  As HWND hw
hw=OpenWindow("",10,10,500,500)
ContainerGadget(4,100,0,300,300)
ButtonGadget(1,10,10,100,30 , "1 button")
ButtonGadget(2,10,40,100,30 , "2 button")
 
Do
    Var ev=WaitEvent
    If ev=EventClose Then
        exit do
    elseif ev = eventgadget then
        if eventnumber = 1 then
            #ifdef __FB_WIN32__
                sendmessage(hw , WM_COMMAND , makelparam(2,1) , cast( lparam , gadgetid(1) ) )
            #else
                pGlobalTypeWindow9->DIMSTOREEVENT(pGlobalTypeWindow9->indexEvent).w = gadgetid(2)
                pGlobalTypeWindow9->DIMSTOREEVENT(pGlobalTypeWindow9->indexEvent).Eventnumber = 2
                pGlobalTypeWindow9->DIMSTOREEVENT(pGlobalTypeWindow9->indexEvent).event_ = Eventgadget
                If pGlobalTypeWindow9->indexEvent < 1000 Then
                    pGlobalTypeWindow9->indexEvent+=1
                Endif
                Sendnullevent()
            #EndIf
        elseif eventnumber = 2 then
            messbox("" , "get custom message for button 2")
        EndIf
    EndIf
Loop

Как видишь , для винды используется стандартный способ с отправкой сообщения в оконную процедуру главного окна. Нажатие кнопки интерпретируется из сообщения WM_COMMAND.
Пояснять для Linux думаю не имеет смысла , но если очень интересно как это делается с этим или другими событиями , смотри файл callback.bas в исходниках linux библиотеки.
Посылать eventgadget , eventmenu и пр. бесполезно , поскольку это внутренние определения библиотеки.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
electrikДата: Пятница, 28.01.2022, 21:41 | Сообщение # 3
Полковник
Группа: Друзья
Сообщений: 180
Репутация: 3
Статус: Offline
Огромное спасибо!
В принципе, я бы мог сделать функцию и её вызывать дважды. Идея такова, в основном окне у меня есть кнопки, а также в меню есть дубликаты. Так вот когда юзер вызывает пункт меню, мне надо чтобы нажималась кнопка, под которой уже написано действие.
Эту методику с посылом события я подсмотрел у кого-то давно. Можно было бы убрать дубликаты из меню, но это я делаю чисто так, чтобы меню не состояло из двух пунктов, настройки и выход. Кидать кнопку настройки в главное окно не хочу, чтобы случайно не лазили.
Да и для общего развития не помешает. В чистом API я знаю как такое сделать, интересно было в Window9.
 
zamabuvaraeuДата: Пятница, 28.01.2022, 22:20 | Сообщение # 4
Подполковник
Группа: Друзья
Сообщений: 147
Репутация: 4
Статус: Offline
Налицо антипаттерн программирования «Магическая кнопка».

В обработчиках событий контролов (окна, меню, панель инструментов) не должно происходить обработки бизнес‐логики. Обработчики событий должны вызывать функции бизнес‐логики или специализированного класса.
 
haavДата: Пятница, 28.01.2022, 22:21 | Сообщение # 5
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Че-то не понял. Почему просто не сделать так:


Код
Do
    Var ev=WaitEvent
    If ev=EventClose Then
        exit do
    elseif ev = eventMenu then
        if eventnumber = idMenu1 then
            proc()
        EndIf
    elseif ev = eventgadget then
        if eventnumber = idButton1 then
            proc()
        EndIf        
    EndIf
Loop

Процедура "proc" будет вызываться и при нажатии кнопки и при нажатии меню.

Но если тебе нравится гонять события по кругу , то кто же тебе запретит?

Кстати , я забыл. Реализация устроена так , что перед тем как посылать сообщение на кнопку с помощью SendMessage , нужно установить фокус на то окно, которое указано в 4 параметре SendMessage.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
zamabuvaraeuДата: Пятница, 28.01.2022, 22:28 | Сообщение # 6
Подполковник
Группа: Друзья
Сообщений: 147
Репутация: 4
Статус: Offline
Даже для такой простой программы уровня восьмого класса третьей четверти «Вычисление корней квадратного уравнения» с тремя текстовыми полями для ввода и одной кнопкой «Вычислить», все вычисления и проверки на корректность ввода необходимо выносить в отдельные функции и классы.
GitHub - zamabuvaraeu/QuadraticEquation: Решение квадратного уравнения
 
electrikДата: Суббота, 29.01.2022, 00:03 | Сообщение # 7
Полковник
Группа: Друзья
Сообщений: 180
Репутация: 3
Статус: Offline
Естественно события гонять никто не запретит. идея с функцией мне тоже больше нравиться, оно будет быстрее работать. я сделаю функцию, но повторюсь, было интересно как при использовании window9 посылать события кнопкам. К тому же возиться с фокусами я тоже не хочу, это усложнит код, ну его нафиг!
А поповоду выноса рассчетов в отдельные функции, ну для удобочитабельности и безопасности - это правильно, а вот если ты пишешь серьёзный софт, ну скажем аналоговый синтез звука, я бы не стал каждое сложение заворачивать в функцию. Эти идеи ООП, завернуть каждый оператор, каждую переменную в отдельную проперти, круто, но ведь оно работает не быстрее, если мы будем рассуждать на тему экономии тактов процессора. Я всегда удивляюсь над тем, когда народ балуется со здвигами битов, чтобы быстрее работало, при этом юзают класс на классе, и классом погоняет.
Я не против ООП, но его уж так раскрутили, как что-то божественное и правильное. Раньше писали на чистом C, и софт маленький был, и много умел. Бизнес зло, ибо из-за него придумывают всякие инструменты которые ускоряют разработку, но только уже всем пофиг на размер, на такты процессора и т.п. Так что гонять события не самое страшное, а вот байт код на байт коде который трижды друг другом погоняет - вот зло!
Ну совсем охренели!, какой-то скайп, тащит за собой кусок хрома! DISCORD - тащит за собой кусок хрома, и это две программы которые у меня на компьютере занимают больше пол гигабайта! Да установленная Windows98 меньше весила!
Я собрал мощный комп в 2016 году, проц CORE i7-6700, 4 ггц, память DDR4 16 гб, 2166 мгц(
не очень быстрая), а теперь Microsoft мне говорит: а купи для Windows 11 новый комп! Да, они не препятствуют установке новой системы, но не гарантируют что она на моём железе будет нормально работать! Охренели, я чё, нефтяной магнат, чтобы каждые 5 лет компы менять! Вот вам и бизнес - зло! зло! зло!

Добавлено (29.01.2022, 00:16)
---------------------------------------------
Меня тут мужычёк обещал поучить кодить на каскадных таблицах, вот это круть! Дядька уже не молодой, имел старые машины, вот где действительно было искусство!
Я представляю как оно работает, но ведь интересны его идеи. В компиляторах оператор switch ну и select case, как раз работают по таблицам переходов.
Ну такое программирование не для бизнеса, е..ть его, тут творение, долгое. Бизнес не любит творцов, там должно уже вчера быть сделано.
Бомбануло, бывает.

Добавлено (29.01.2022, 00:24)
---------------------------------------------
zamabuvaraeu - вы понимаете в математике? По хорошему надо для этого новую тему создать, но всё же спрошу.
Приходилось ли когда-нибудь рассчитывать коэффициенты каскадных биквадратных фильтров?
Там формулы не сложные, но всё что касается серьёзной математики, я дуб дубом, а функция такая нужна. Я конечно нашёл на Java скрипте, попробую переписать.

 
haavДата: Суббота, 29.01.2022, 11:03 | Сообщение # 8
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Серега , я согласен с тобой по поводу маниакальной идеи все и везде заворачивать в функции и там где надо и не надо использовать ООП , интерфейсы и пр. механизмы . Мне не раз приходилось выискивать сторонние решения для каких-то задач , и в большинстве случаев это были большие по объему кода решения. Когда начинаешь вникать в код и наконец добираешься до "иголки кощея" , на деле оказывается , что сам принцип (реализация алгоритма) умещается на одной или двух страницах редактора , а все остальное - "вода" для придания значимости. К сожалению (лично для меня), люди в большинстве своем любят наводить тень на плетень.

Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
zamabuvaraeuДата: Понедельник, 31.01.2022, 18:45 | Сообщение # 9
Подполковник
Группа: Друзья
Сообщений: 147
Репутация: 4
Статус: Offline
Математику понимаю немножно, коэффициенты каскадный биквадратных фильтров не рассчитывал.
 
Форум » Библиотеки для FreeBasic » Библиотека Window9 для Freebasic » Как послать событие гаджету?
  • Страница 1 из 1
  • 1
Поиск: