On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение
постоянный участник


Пост N: 1504
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 04.06.17 14:42. Заголовок: APPEVENT в MiniGUI


Предлагаю к включению в MiniGUI "нового" механизма обработки сообщений APPEVENT

APPEVENT использует для работы сообщения из диапазона WM_APP..0xBFFF (WM_APP)
Пример, м.б. не самый удачный
Скрытый текст


Работа над реализацией механизма APPEVENT в основном закончена
Удачи в тестировании.
Если кто-то сочтет APPEVENT небесполезной игрушкой - просите Григория о включении в состав MiniGUI, если нет, то нет

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 23 , стр: 1 2 All [только новые]


постоянный участник


Пост N: 1505
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 04.06.17 14:47. Заголовок: Для работы APPEVENT ..


Для работы APPEVENT нужно внести изменения в исходники библиотеки ( в основном c_windowc.c)

Архив с примером и библиотекой версии 17.05. с внесенными изменениями можно скачать отсюда

В прилагаемую библиотеку внесены и другие изменения:
В MDI окнах переименованы свойства

PROP_CFILE => HMG_CFILE
PROP_FORMNAME => HMG_FORMNAME
PROP_MODIFIED => HMG_MODIFIED

Все свойства окна (в т.ч. MDI) с именами начинающимися с "HMG_" при удалении окна удаляются автоматически.

Вернул обратно
PROP_CFILE
PROP_FORMNAME
PROP_MODIFIED




Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5404
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 04.06.17 16:58. Заголовок: Петр пишет: Предлаг..


Петр пишет:

 цитата:
Предлагаю к включению в MiniGUI "нового" механизма обработки сообщений APPEVENT


Для чего нужно это ?
Чуток подробней объясните....

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1494
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 04.06.17 17:07. Заголовок: Петр 1. Как сделат..


Петр
1.
Как сделать вариант как в примере http://my-files.ru/mauqt9 на hmg2.07
Работа кнопок правых 1,2,3 и кнопки в середине тоолбар с #
Выборка по примеру Скрытый текст

Как такое проделать с APPEVENT
2.
Кроме SendMessage, наверно нужно и PostMessage
3.
О Set\GetProp пожелание
1. Включить во внутрь сериализацию\десереализацию, т.е положили массив\хеш\блок получили назад, как было
2. Events WM_DESTROY сделать на базе EnumProps автоматическое удаление уст. SetProp на окне и с mdi тоже.


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1495
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 04.06.17 18:31. Заголовок: PS. 3. Надо спрятать..


PS.
3. Надо спрятать на окне, наверное
#define WM_APP 0x8000
#define EV_FIRE (WM_APP + 1)
вроде это свойство окна, т.е. при создании окна куда то положить. К примеру, есть 99 видов начислений\удержаний
и надо создать на окне расчета
For i := 1 To len(aVop)
APPEVENT ( WM_APP + i ) ACTION aAction[ i ] OF ThisWindow.Handle // лучше просто i, без WM_APP
Next
4. Возможно надо передать какие то параметры постоянные, может так
APPEVENT ( WM_APP + i ) ACTION aAction[ i ] OF ThisWindow.Handle PARAM aParam[ i ]
5. На окно (другое) с градусником (и др. данными процесса расчета), также ставим APPEVENT ...
(окно знает, как правильно отображать).
6. В цикле расчета, начинаем с какого то кода\Id
nKey := nIdStart
If nKey > 0
nKey := SendMessage(ThisWindow.Handle, nKey, 0, 0)
PostMessage(Grad.Handle, WM_APP+1, 0, 0) // для градусника
EndIf
...
Если я правильно понял с APPEVENT

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1506
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 04.06.17 18:42. Заголовок: SergKis пишет: 1. ..


SergKis пишет:

 цитата:
1. Как сделать вариант как в примере


Не сразу уловил, в чем проблема. В рабочем варианте будет возможность добавления множественных событий ON для одного окна,
а также добавлена поддержка ONCE (однократно исполняемое событие)
SergKis пишет:

 цитата:
Кроме SendMessage, наверно нужно и PostMessage


Нужно, как и SendMessageTimeout, я думаю упаковать все EmitAppEvent с соотв. параметрами.
SergKis пишет:

 цитата:
1. Включить во внутрь сериализацию\десереализацию, т.е положили массив\хеш\блок получили назад, как было


В Harbour не поддерживается сериализация блоков кода. Все остальное в руках программиста. Не хотелось бы ограничивать никого своими предпочтениями, иными словами пока я склоняюсь к тому, что каждый, используя пример, может написать свои пользовательские функции, так как это ему нужно. И еще - некоторые манипуляции лучше проделывать на PRG, т.е. более высоком уровне.
SergKis пишет:

 цитата:
2. Events WM_DESTROY сделать на базе EnumProps автоматическое удаление уст. SetProp на окне и с mdi тоже.



Я так понял идет речь о PRG функции Events?
Вы можете использовать EnumPropsEx, предварительно заменив #if 0 на #if 1 (или т.п.) и перекомпилировав библиотеку

bCodeBlock := {|hWnd,cPropName,hHandle| HB_SYMBOL_UNUSED( hHandle ), RemoveProp( hWnd, cPropName ) }
nRetVal := EnumPropsEx( nHandle, bCodeBlock )


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1496
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 04.06.17 19:01. Заголовок: Петр пишет Вы можете..


Петр пишет
 цитата:
Вы можете использовать EnumPropsEx


Я имею ввиду тех, кто ставит SetProp и забывает убрать их, разве не будет происходить утечка памяти ?

 цитата:
В Harbour не поддерживается сериализация блоков кода.


пусть будут array и hash, например в лето удобно параметр array передал на сервер, в функции получил и обратно так же.
Это же на уровне _Set\GetWindowProp, записать их все равно нельзя.
Почему сразу не сделать вариант, введя тип, к примеру <A>, <H> :
STATIC aPropTypes := {'<A>', '<H>' }
FUNC SetPropType(nNr, cType)
и менять, если надо.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1497
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 04.06.17 19:11. Заголовок: PS Можно все типы вв..


PS
Можно все типы ввести, которые могут проходить и проверять при GetProp

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1507
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 04.06.17 19:15. Заголовок: SergKis пишет: Я им..


SergKis пишет:

 цитата:
Я имею ввиду тех, кто ставит SetProp и забывает убрать их, разве не будет происходить утечка памяти ?



Будет, в т.ч и у вас если забудете

Поэтому в h_windowsMDI.prg
лучше заменить
_RemoveProperty( hWnd, "PROP_CFILE" )
_RemoveProperty( hWnd, "PROP_FORMNAME" )
_RemoveProperty( hWnd, "PROP_MODIFIED" )
на
EnumPropsEx( hWnd, {|hWnd,cPropName,hHandle| HB_SYMBOL_UNUSED( hHandle ), RemoveProp( hWnd, cPropName ) } )

SergKis пишет:

 цитата:
Почему сразу не сделать вариант


Я в свое время, уже и не помню почему, не захотел
Вы попробуйте..

UPD. Забыл про совместимость - эти функции написаны Andy Wos еще в 2005 году (а тогда и сериализация, вроде бы, еще не была написана). Я правил функции, а не писал их с нуля - это накладывает некоторые ограничения.


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1498
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 04.06.17 19:24. Заголовок: Петр пишет Вы попроб..


Петр пишет
 цитата:
Вы попробуйте..


Посмотрел уже, С код не проходит, сильно разный с hmg 2.07

 цитата:
Будет, в т.ч и у вас если забудете


Потому и не использую, т.к. надо или списки городить того, что ставишь, или C коды адаптировать.
Причем держать в голове ситуацию подвиса, о которой писал ранее. Потому спасибо, конечно, но
пока Set\GetProp это мимо.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1508
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 04.06.17 22:24. Заголовок: Andrey пишет: Для ч..


Andrey пишет:

 цитата:
Для чего нужно это ?
Чуток подробней объясните....


Andrey это трудно обьяснить. Наверное, просто так, в рамках добавления в MiniGUI элементов поддержки событийно-ориентированного программирования (см.)
Наряду с включением поддержки акселераторов, должно облегчить нелегкую жизнь программиста MiniGUI

Теперь ищите, куда это пристроить, (вот SergKis уже присматривается )


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1499
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 05.06.17 07:47. Заголовок: Петр пишет Наряду с ..


Петр пишет
 цитата:
Наряду с включением поддержки акселераторов, должно облегчить нелегкую жизнь программиста MiniGUI



А я к своим "баранам", только не говорите, что есть set evens (нет его, религия у меня такая ).
Причина в том, что этого set evens мало, т.к. в первую очередь не выделены места во внутренностях МиниГуи для
блоков кода-исполнителей. Их надо засунуть в _HMG_aControlMiscData1 [k], а там разная длина массива, а где то =0.
Т.е. Надо что бы везде был массив и устанавливать в последний элемент, забирать по ATail.
Чем будет последний элемент, это технка (массив\hash\object) не столь важно. По содержимому (это блоки кода):
a.
1. bGet - аналог bData из tsb колонки, для заполнения Value
2. bPut - для записи данных Value куда либо
3. bRefresh - перепоказ
4. bRestore - прочитать\уст. данные свойств контрола с вн. источников
5. bSave - сохранить данные свойств контрола на вн. источнике
6. bOther - ? возможно будет не нужен, но наличие его, в общей схеме, не помешает
b.
1. Зарезервировать сообщения WM_USER+... для команд пункта a.
2. Добавить в Events() выполнение блоков кода по сообщениям
с.
1. Добавить такое же (пункты a.) на окно (с теми же сообщениями WM_USER+...)
Тогда работа с Post\SendMessage по сообщениям WM_USER+... будет простым
d.
Решение с клавишами должно укладываться в существ. схему
SET HOTKEY ON - это default работа как сечас
SET HOTKEY OFF - по акселератом
SET KEY ... TO ACTION ... как сечас и для акселераторов
SET GLOBAL ... для акселераторов не нужна, по мне (всегда заменит уст. на окно с массива\hash)
может упустил что, но это главное.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1500
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 05.06.17 08:09. Заголовок: Петр пишет вот SergK..


Петр пишет
 цитата:
вот SergKis уже присматривается


Просто хотел понять, правильно ли я понимаю APPEVENT.
На сегодня мне вполне хватает для расчетов :UserKeys и сообщения на WM_HMG_NOTIFY_LBL
 
ElseIf nMsg == WM_HMG_NOTIFY_LBL // BAA
IF ValType( _HMG_aControlMiscData1 [ i ] [4] )=='B' // это введенный bOther на Label
_DoControlEventProcedure( _HMG_aControlMiscData1[ i ][4], i )
ELSE

Делается фиктивный\ненужный Label для Cargo и выполнения блока по сообщению WM_USER+... -> WM_HMG_NOTIFY_LBL
Сопля, конечно, но что делать "родного" механизма нет


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1509
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 05.06.17 10:37. Заголовок: SergKis пишет: А я..


SergKis пишет:

 цитата:
А я к своим "баранам"


Вы могли бы открыть новую тему.

 цитата:
, только не говорите, что есть set evens (нет его, религия у меня такая )


Есть, это MiniGUI и стандартная функция Events - часть этого механизма.
SergKis пишет:

 цитата:
Причина в том, что этого set evens мало, т.к. в первую очередь не выделены места во внутренностях МиниГуи для
блоков кода-исполнителей.


Вся "прелесть" ситации в том, что эти "блоки кода - исполнители" часть прикладной программы и засовывать их внутрь библиотеки неправильно.
Вы можете написать для своей программы какой-нибудь условный MyAppEvents(), установить его обработчиком с помощью set func events to.
А в этом локальном обработчике уже делать, что-то типа

       ElseIf nMsg == WM_HMG_NOTIFY_LBL    // BAA  
IF ValType( _MY_aControlMiscData1 [ i ] [4] )=='B' // это введенный bOther на Label
_DoControlEventProcedure( _MY_aControlMiscData1[ i ][4], i )
ELSE


_MY_aControlMiscData1 (нужной вам структуры)вы можете инициализировать в 'условной' MyAppInit.

Каждый инструмент предполагает его правильное использование и MiniGUI не исключение


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1510
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 05.06.17 10:41. Заголовок: SergKis пишет: Реше..


SergKis пишет:

 цитата:
Решение с клавишами должно укладываться в существ. схему
SET HOTKEY ON - это default работа как сечас
SET HOTKEY OFF - по акселератом


hotkeys и accelerators - два разных механизма со своей сферой применения, что конечно не может помешать вам использовать их не по назначению

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1501
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 05.06.17 12:37. Заголовок: Петр пишет Вы могли ..


Петр пишет
 цитата:
Вы могли бы открыть новую тему


А смысл, все равно останемся при своих.
Вы - делай сам.
Я - а как же религия МиниГуи, _HMG_... переменные наше все. Есть много возможностей,
но нет (хотя бы) НИ ОДНОГО сообщения для управления через очередь этим всем,
хотя это религия windows.

 цитата:
Вся "прелесть" ситации в том, что эти "блоки кода - исполнители" часть прикладной программы и засовывать их внутрь библиотеки неправильно.


В данном случае мы говорим только о внутренностях МиниГуи - ее контролах, событиях и окнах.
До прикладнухи еще далеко.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1502
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 05.06.17 12:51. Заголовок: PS Если бы было, хот..


PS
Если бы было, хотя бы одно сообщение, в МиниГуи WM_USER+... с bOther в
_HMG_aFormMisc1[k] и _HMG_aControlMisc1[k] (зарезервировано место) - все вопросы бы отпали.
Сейчас в МиниГуи задействованы несколько WM_USER+, мы задействовали несколько дополнительно,
Где гарантия, что мы не пересечемся по ним в новых версиях ?
Основное, что волнует, логическая организация _HMG_aFormMisc1[k] и _HMG_aControlMisc1[k] - это код прогр.
Даже WM_USER+... не сильно беспокоит, это define.
Но нет, так нет.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1511
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 05.06.17 13:15. Заголовок: SergKis пишет: Вы ..


SergKis пишет:

 цитата:

Вы могли бы открыть новую тему


А смысл, все равно останемся при своих.



Смысл в том, что не надо флудить: в этой теме обсуждался механизм использования сообщений из диапазона WM_APP, в случае успеха, этот механизм можна было бы расширить на WM_USER.
Но нет, так нет.

 цитата:
Вы - делай сам.
Я - а как же религия МиниГуи, _HMG_... переменные наше все.


В этом смысле я не религиозный человек.
К тому же я не автор библиотеки, не мантейнер. Я такой же, время от времени, контрибутор, как и вы. Создайте, что нибудь годящее и направьте Григорию, пусть у него голова болит


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1503
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 05.06.17 14:37. Заголовок: Петр пишет Смысл в т..


Петр пишет
 цитата:
Смысл в том, что не надо флудить: в этой теме обсуждался механизм использования сообщений из диапазона WM_APP, в случае успеха, этот механизм можна было бы расширить на WM_USER.


Что будет работать, не сомневаюсь, суть ясна, детали нет, но это потом прояснится.
Флуда нет (WM_USER, APPEVENT суть одна, содержимое разное), все, что писал, связано с APPEVENT, хотя бы тем, что прописанные блоки кода, надо вызывать через процедуры
_DoControlEventProcedure ( bBlock, i, cEventType, nParam ) если APPEVENT свяжется с контролом
_DoWindowEventProcedure ( bBlock, i, cEventType ) для окна, связка уже есть

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1512
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 06.06.17 16:22. Заголовок: SergKis пишет: (WM_..


SergKis пишет:

 цитата:
(WM_USER, APPEVENT суть одна, содержимое разное), все, что писал, связано с APPEVENT, хотя бы тем, что прописанные блоки кода, надо вызывать через процедуры
_DoControlEventProcedure ( bBlock, i, cEventType, nParam ) если APPEVENT свяжется с контролом
_DoWindowEventProcedure ( bBlock, i, cEventType ) для окна, связка уже есть


Функционал реализован, возможно это не то и не так, как представляли его вы - не знаю.
Пожалуйста тестируйте. Рад буду услышать ваше мнение.

В споре рождается истина



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1553
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.06.17 22:26. Заголовок: Петр пишет Функциона..


Петр пишет
 цитата:
Функционал реализован,


Я тут, бегом все, мельком глянул. Вопрос появился.
#define MAX_EVENTS 64
т.е. если у меня 64 окна, я их спокойненько пронумеровал +1...+64 и чудненько имею по 1 APPEVENT у каждого.
Если у меня 65 или 150-300, то я, немного потрахавшись, типа save\restore, save\restore,...
в итоге получаю удовольствие ... Или я мимо, не попал на бегу ?


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 23 , стр: 1 2 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 6
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет