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




Пост N: 2200
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 05.05.12 10:52. Заголовок: Как передать данные из одной программы в другую ?


Всем привет...

Есть ли механизм передачи данных между программами ?
Допустим прога на МиниГуи запустила терминалку.
Как узнать что терминалка нормально запустилась ?

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


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




Пост N: 1289
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 11.11.16 21:59. Заголовок: Петр пишет Нужно зам..


Петр пишет
 цитата:
Нужно заменить стандартный обработчик окна. Это можно делать и что назывется "на лету"


Не видел такую возможность в hb 3.2.
Это как можно сделать ?
С idle и прочим все понятно (если можно на уровне prg подсунуть свой обработчик для WM_COYDATA)

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


Пост N: 1324
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 11.11.16 22:25. Заголовок: SergKis пишет: Не в..


SergKis пишет:

 цитата:
Не видел такую возможность в hb 3.2.
Это как можно сделать ?
С idle и прочим все понятно (если можно на уровне prg подсунуть свой обработчик для WM_COYDATA)


Я не писал, что это возможность hb 3.2. Я писал, что есть такая возможность (средствами winapi, например, SetWindowLongPtr).

SergKis пишет:

 цитата:
если можно на уровне prg подсунуть свой обработчик для WM_COYDATA



Ну эта возможность не на пустом месте возникла. Когда-то мне надоело по "бескрайним просторам" стандартного обработчика MiniGUI ездить и появилась
SET EVENTS FUNCTION TO MYEVENTS

Сейчас я бы делал уже как-то так

SET GLOBAL LISTENER TO MYEVENTS
SET LISTENER TO Form_1_Listener() OF Form_1 EVENTS WM_CREATE, WM_COPYDATA, WM_DESTROY


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




Пост N: 1290
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 11.11.16 23:32. Заголовок: Петр пишет Я не писа..


Петр пишет
 цитата:
Я не писал, что это возможность hb 3.2. Я писал, что есть такая возможность (средствами winapi, например, SetWindowLongPtr


Жаль, что в hb нет "нормального" подкл. своего обработчика, а winapi установит новый, я понимаю все из старого надо повторять. Или можно старый вызывать тоже, хотя не важно, пока не потребутся и ... Спасибо за разъяснения

 цитата:
Ну эта возможность не на пустом месте возникла. Когда-то мне надоело по "бескрайним просторам" стандартного обработчика MiniGUI ездить и появилась
SET EVENTS FUNCTION TO MYEVENTS


В Events(...) давно была фишка своего обработчика
 
#ifdef _USERINIT_
FOR EACH cProc IN _HMG_aCustomEventProcedure

r := &cProc ( hWnd , nMsg , wParam , lParam )

IF ValType ( r ) <> 'U'
RETURN r
ENDIF

NEXT
#endif

не так цивилизованно, как сейчас, но ...


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


Пост N: 1325
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 12.11.16 01:32. Заголовок: SergKis пишет: В Ev..


SergKis пишет:

 цитата:
В Events(...) давно была фишка своего обработчика


Это немного другое.

 цитата:

2008/02/01: Build 48 (HMG 1.4 Extended Edition) Published.
..
* Updated: Synchronized an Extended HMG with an Official HMG 2.0.010:
- New: HMG User Components Support.

I've created a standard interface to allow HMG users to create
its own components (ie: new controls) without need to modify
HMG library itself.

HMG User Components Reference:

- InstallEventHandler ( <cEventHandlerFunctionName> )




 цитата:

2007/02/15: Build 31 (HMG 1.3 Extended) Published.
* New: SET EVENTS FUNCTION TO <funcname> command.
Contributed by Petr Chornyj <myorg63@mail.ru>
(see demo in folder \samples\Advanced\RunCmd)



Сама функция Events и есть обработчик. Если ваш собственный не отработал сообщение то может вызвать Events, иначе рискуете получить глюки, как Андрей. Но есть нюансы.

Harbour мультиплатформенный и это нужно помнить. К тому же он open source, и то, что интересно вам или мне, может быть не интересно другому




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




Пост N: 1291
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.11.16 02:06. Заголовок: Петр пишет Это немно..


Петр пишет
 цитата:
Это немного другое


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

 цитата:
Harbour мультиплатформенный и это нужно помнить. К тому же он open source, и то, что интересно вам или мне, может быть не интересно другому


Как правило (я про себя) заканчивается своей версией либы.

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




Пост N: 5169
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 12.11.16 03:07. Заголовок: Петр пишет: Я надею..


Петр пишет:

 цитата:
Я надеюсь, что Андрей организовал хоть какую-то проверку целосности данных.


Нет. Не знаю как....
Вот пример, посмотри - https://cloud.mail.ru/public/7gRW/zW5JDS68H
Я думаю, что Передача сообщений между приложениями/процессами будет многим интересна.
Тем более, что кода мало.

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




Пост N: 1292
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.11.16 08:48. Заголовок: Петр пишет Сейчас я ..


Петр пишет
 цитата:
Сейчас я бы делал уже как-то так
SET GLOBAL LISTENER TO MYEVENTS
SET LISTENER TO Form_1_Listener() OF Form_1 EVENTS WM_CREATE, WM_COPYDATA, WM_DESTROY


Может в таком виде "ширее" будет
 
SET GLOBAL LISTENER
ADD LISTENER TO Form_1 EVENTS WM_CREATE, WM_COPYDATA, WM_DESTROY ACTION {|hW,nM,wP,lP| MY1(hW,nM,wP,lP) }
ADD LISTENER TO Form_5 EVENTS WM_CREATE, WM_COPYDATA, WM_DESTROY ACTION {|hW,nM,wP,lP| MY2(hW,nM,wP,lP) }
ADD LISTENER TO Form_7 EVENTS WM_CREATE, WM_COPYDATA, WM_DESTROY ACTION {|hW,nM,wP,lP| MY3(hW,nM,wP,lP) }
...

EVENTS могут быть разными. И эта штука может не пересекаться с SET EVENTS FUNCTION TO MYEVENTS
т.е. может присутсвовать и то и то

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


Пост N: 1326
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 12.11.16 15:21. Заголовок: Andrey пишет: Тем б..


Andrey пишет:

 цитата:
Тем более, что кода мало.



Кода мало - ошибок много.

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


Пост N: 1327
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 12.11.16 16:36. Заголовок: SergKis пишет: SET..


SergKis пишет:

 цитата:
SET GLOBAL LISTENER

в моем понимании эта команда отключает глобальный обработчик

ADD LISTENER TO Form_1 EVENTS WM_CREATE, WM_COPYDATA, WM_DESTROY ACTION {|hW,nM,wP,lP| MY1(hW,nM,wP,lP) }
-
эта команда создает обработчик для окна Form_1, в случае если приходят события WM_CREATE, WM_COPYDATA, WM_DESTROY их обработка передается блоку

в существующей модели HMG это реализуется примерно вот так


 цитата:
SET EVENTS FUNCTION TO my_EventsHandler  

FUNCTION my_EventsHandler ( hWnd, nMsg, wParam, lParam )

LOCAL nResult

IF hWnd == GetFormHandle( "Form_1" )
IF nMsg == WM_CREATE .OR. nMsg == WM_COPYDATA .OR. nMsg == WM_DESTROY

nResult := Eval( {|hW,nM,wP,lP| MY1(hW,nM,wP,lP), hWnd, nMsg, wParam, lParam )

IF nResult != 0
RETURN nResult
ELSE
RETURN Events( hWnd, nMsg, wParam, lParam )
ENDIF
ENDIF
ENDIF

RETURN Events( hWnd, nMsg, wParam, lParam )



Я правильно понял?

Андрей, обратите внимание на мою реализацию и на обработку событий в вашем примере, кое-что там совешенно лишнее.


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




Пост N: 1296
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.11.16 17:18. Заголовок: Петр пишет в моем по..


Петр пишет
 цитата:
в моем понимании эта команда отключает глобальный обработчик


Тут мы немного разошлись в понимании, я считал, что даем команду "будем исп. глобальный список обработчиков", т.е.
создаем массив\hash для списков. ADD ... добавляет в список окна , обозначенные события и свой обработчик этих событий.
Причем самих окон еще может не быть.
т.е., к примеру (чисто условно)
 
a_Listener := hb_Hash()
hb_HSet(a_Listener, "Form_1", {{WM_CREATE, WM_COPYDATA, WM_DESTROY}, bAction})
hb_HSet(a_Listener, "Form_5", {{WM_CREATE, WM_COPYDATA, WM_DESTROY}, bAction})
...
в обработчике примерно так
cForm := _HMG_aFormNames[ ascan(_HMG_aFormHandles, hWnd) ]
aEvnt := hb_HGetDef(a_Listener, cForm, {})
If empty(aEvnt)
RETURN Events( hWnd, nMsg, wParam, lParam )
EndIf

a := aEvnt[1]
If ( i := ascan(a, {|msg| msg == nMsg }) ) > 0
If hb_IsBlock(aEvnt[2])
nResult := Eval(aEvnt[2], hWnd, nMsg, wParam, lParam)
IF nResult != 0
RETURN nResult
ENDIF
EndIf
EndIf

RETURN Events( hWnd, nMsg, wParam, lParam )





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


Пост N: 1328
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 12.11.16 18:42. Заголовок: Понятно, значит у ва..


Понятно, значит у вас "ужее"

Если у нас, будет вот так
hb_HSet(a_Listener, "Form_1", {{WM_CREATE, WM_COPYDATA, WM_DESTROY}, bAction})
hb_HSet(a_Listener, "Form_1", {{WM_PAINT}, bAction})
hb_HSet(a_Listener, "Form_1", {{WM_CREATE}, bAction})

что нужно будет выполнять и что возвращать (а возвращать придется ).

К сведению, в существующей реализации (не знаю кто-то пользуется или нет - примеров нет ) легко можно делать такие вещи как, например, OnBeforeInit, OnAfterInit (что-то подобное было в FoxPro: событие перед событием - само событие - событие после события :) ).


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




Пост N: 1297
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.11.16 19:37. Заголовок: Петр пишет Если у на..


Петр пишет
 цитата:
Если у нас, будет вот так
hb_HSet(a_Listener, "Form_1", {{WM_CREATE, WM_COPYDATA, WM_DESTROY}, bAction})
hb_HSet(a_Listener, "Form_1", {{WM_PAINT}, bAction})
hb_HSet(a_Listener, "Form_1", {{WM_CREATE}, bAction})


Будет последний в hash hb_HSet(a_Listener, "Form_1", {{WM_CREATE}, bAction})
Потому и писал hash, чтобы один обработчик на форму, а вернет
aEvnt := hb_HGetDef(a_Listener, "Form_1", {}) или {{WM_CREATE}, bAction}, если найдет, или {}, если нет

 цитата:
К сведению, в существующей реализации (не знаю кто-то пользуется или нет - примеров нет ) легко можно делать такие вещи как, например, OnBeforeInit, OnAfterInit (что-то подобное было в FoxPro: событие перед событием - само событие - событие после события :) )


НО ПРИМЕРОВ НЕТ !
ГДЕ СМОТРЕТЬ ?


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


Пост N: 1329
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 12.11.16 20:51. Заголовок: SergKis пишет: НО П..


SergKis пишет:

 цитата:
НО ПРИМЕРОВ НЕТ !
ГДЕ СМОТРЕТЬ ?


Вопрос не ко мне. Хотя примеров в MiniGUI много, что иногда раздражает, не сразу и понятно, что автор хотел показать, много дубляжей ради одной какой-то функции в середине примера, в том же HMG off. лучшая структуированость примеров.

SergKis пишет:

 цитата:
Будет последний в hash hb_HSet(a_Listener, "Form_1", {{WM_CREATE}, bAction})


Понятно, например в nodejs, если я не ошибаюсь там, идет поочередный вызов всех обработчиков.
Где-то, забыл где , обработчик в случае дублирования не устанавливается. Нужна установка с доп. параметром: типа так и так, все понимаю, все равно хочу

Остался один вопрос - кому это нужно, реализация несложная (если не формировать внутреннюю очередь событий конечно).


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




Пост N: 1298
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.11.16 21:12. Заголовок: Петр пишет Остался о..


Петр пишет
 цитата:
Остался один вопрос - кому это нужно, реализация несложная


Мы начали
 цитата:
Сейчас я бы делал уже как-то так

SET GLOBAL LISTENER TO MYEVENTS
SET LISTENER TO Form_1_Listener() OF Form_1 EVENTS WM_CREATE, WM_COPYDATA, WM_DESTROY


т.е. с централизованных команд в hmg, подискутировали на эту тему и пришли к выводу, что
SET EVENTS FUNCTION TO MYEVENTS
достаточно для всех хотелок

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




Пост N: 5171
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 12.11.16 22:16. Заголовок: Петр пишет: Андрей,..


Петр пишет:

 цитата:
Андрей, обратите внимание на мою реализацию и на обработку событий в вашем примере, кое-что там совешенно лишнее.


Не, для меня это пока слишком сложно, да и другим новичкам тоже.
Хотя я уже года 3 как активно перевожу программу. Именно перевожу, разбираться как это работает очень сложно.
Как всегда недостаток времени.

Петр пишет:

 цитата:
Я надеюсь, что Андрей организовал хоть какую-то проверку целосности данных.


Как это сделать ?
К вам большая просьба (я думаю и другие новички присоединятся) подправить правильно, то что я наваял !
Заранее спасибо за помощь !
Пример потом отправьте Григорию для включения в библиотеку. Пусть все пользуются.


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


Пост N: 1330
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 12.11.16 22:39. Заголовок: Andrey пишет: Не, д..


Andrey пишет:

 цитата:
Не, для меня это пока слишком сложно


Это проще паренной репы - если вы обработали сообщение в пользовательсом обработчике - верните значение отличное от 0 (например - 1), если нет, но подозреваете, что это сообщение нужно все таки отработать - вызовите стандартный HMG обработчик Events (припоминаете, что без этого у вас Labels перестали правильно отображаться?). У вас же обработка фактически состоялась и вы просто теряете время вызывая опять Events (Events о WM_COPYDATA ничего не знает).

Andrey пишет:

 цитата:
К вам большая просьба (я думаю и другие новички присоединятся) подправить правильно, то что я наваял !



Да не вопрос.
ссылка на архив

Проверка, конечно элементарная, но есть.

Если Григорий захочет - пусть пример публикует, в принципе он же ваш.
Только не нужно его COMM - называть (у меня, почему-то ассоциация с COM портом, хотя понимаю, что это communication), лучше IPC (Inter-process communication).


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


Пост N: 1331
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 12.11.16 22:52. Заголовок: SergKis пишет: SET ..


SergKis пишет:

 цитата:
SET EVENTS FUNCTION TO MYEVENTS
достаточно для всех хотелок


Может быть, "но не все умеют их готовить"

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




Пост N: 1299
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.11.16 23:29. Заголовок: Петр пишет "но ..


Петр пишет
 цитата:
"но не все умеют их готовить"


Добавка команд в hmg, вряд ли научит "готовить", а код в hmg (не много) но добавиться.


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


Пост N: 1332
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 12.11.16 23:36. Заголовок: SergKis пишет: а ко..


SergKis пишет:

 цитата:
а код в hmg (не много) но добавиться.


Это хорошо или плохо?

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




Пост N: 1300
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.11.16 00:01. Заголовок: Петр пишет Это хорош..


Петр пишет
 цитата:
Это хорошо или плохо?


Это (как всегда) с какой стороны смотреть ? Все относительно.
Григорий постоянно оптимизирует либу, борется с лишними включениями. Замусорить легко, вычищать сложно.
По нашей теме, на сегодня, новые команды\код, скорее излишества, как завтра будет ... посмотрим.
Но это мое мнение.

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

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