Форум » GUI » Как передать данные из одной программы в другую ? » Ответить

Как передать данные из одной программы в другую ?

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

Ответов - 59, стр: 1 2 3 All

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

Петр: 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

SergKis: Петр пишет Я не писал, что это возможность hb 3.2. Я писал, что есть такая возможность (средствами winapi, например, SetWindowLongPtr Жаль, что в hb нет "нормального" подкл. своего обработчика, а winapi установит новый, я понимаю все из старого надо повторять. Или можно старый вызывать тоже, хотя не важно, пока не потребутся и ... Спасибо за разъяснения Ну эта возможность не на пустом месте возникла. Когда-то мне надоело по "бескрайним просторам" стандартного обработчика MiniGUI ездить и появилась SET EVENTS FUNCTION TO MYEVENTS В Events(...) давно была фишка своего обработчика [pre2] #ifdef _USERINIT_ FOR EACH cProc IN _HMG_aCustomEventProcedure r := &cProc ( hWnd , nMsg , wParam , lParam ) IF ValType ( r ) <> 'U' RETURN r ENDIF NEXT #endif [/pre2] не так цивилизованно, как сейчас, но ...

Петр: 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, и то, что интересно вам или мне, может быть не интересно другому

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

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

SergKis: Петр пишет Сейчас я бы делал уже как-то так SET GLOBAL LISTENER TO MYEVENTS SET LISTENER TO Form_1_Listener() OF Form_1 EVENTS WM_CREATE, WM_COPYDATA, WM_DESTROY Может в таком виде "ширее" будет[pre2] 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) } ... [/pre2] EVENTS могут быть разными. И эта штука может не пересекаться с SET EVENTS FUNCTION TO MYEVENTS т.е. может присутсвовать и то и то

Петр: Andrey пишет: Тем более, что кода мало. Кода мало - ошибок много.

Петр: 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 это реализуется примерно вот так [pre2]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 )[/pre2] Я правильно понял? Андрей, обратите внимание на мою реализацию и на обработку событий в вашем примере, кое-что там совешенно лишнее.

SergKis: Петр пишет в моем понимании эта команда отключает глобальный обработчик Тут мы немного разошлись в понимании, я считал, что даем команду "будем исп. глобальный список обработчиков", т.е. создаем массив\hash для списков. ADD ... добавляет в список окна , обозначенные события и свой обработчик этих событий. Причем самих окон еще может не быть. т.е., к примеру (чисто условно) [pre2] 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 ) [/pre2]

Петр: Понятно, значит у вас "ужее" Если у нас, будет вот так 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: событие перед событием - само событие - событие после события :) ).

SergKis: Петр пишет Если у нас, будет вот так 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: событие перед событием - само событие - событие после события :) ) НО ПРИМЕРОВ НЕТ ! ГДЕ СМОТРЕТЬ ?

Петр: SergKis пишет: НО ПРИМЕРОВ НЕТ ! ГДЕ СМОТРЕТЬ ? Вопрос не ко мне. Хотя примеров в MiniGUI много, что иногда раздражает, не сразу и понятно, что автор хотел показать, много дубляжей ради одной какой-то функции в середине примера, в том же HMG off. лучшая структуированость примеров. SergKis пишет: Будет последний в hash hb_HSet(a_Listener, "Form_1", {{WM_CREATE}, bAction}) Понятно, например в nodejs, если я не ошибаюсь там, идет поочередный вызов всех обработчиков. Где-то, забыл где , обработчик в случае дублирования не устанавливается. Нужна установка с доп. параметром: типа так и так, все понимаю, все равно хочу Остался один вопрос - кому это нужно, реализация несложная (если не формировать внутреннюю очередь событий конечно).

SergKis: Петр пишет Остался один вопрос - кому это нужно, реализация несложная Мы начали Сейчас я бы делал уже как-то так 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 достаточно для всех хотелок

Andrey: Петр пишет: Андрей, обратите внимание на мою реализацию и на обработку событий в вашем примере, кое-что там совешенно лишнее. Не, для меня это пока слишком сложно, да и другим новичкам тоже. Хотя я уже года 3 как активно перевожу программу. Именно перевожу, разбираться как это работает очень сложно. Как всегда недостаток времени. Петр пишет: Я надеюсь, что Андрей организовал хоть какую-то проверку целосности данных. Как это сделать ? К вам большая просьба (я думаю и другие новички присоединятся) подправить правильно, то что я наваял ! Заранее спасибо за помощь ! Пример потом отправьте Григорию для включения в библиотеку. Пусть все пользуются.

Петр: Andrey пишет: Не, для меня это пока слишком сложно Это проще паренной репы - если вы обработали сообщение в пользовательсом обработчике - верните значение отличное от 0 (например - 1), если нет, но подозреваете, что это сообщение нужно все таки отработать - вызовите стандартный HMG обработчик Events (припоминаете, что без этого у вас Labels перестали правильно отображаться?). У вас же обработка фактически состоялась и вы просто теряете время вызывая опять Events (Events о WM_COPYDATA ничего не знает). Andrey пишет: К вам большая просьба (я думаю и другие новички присоединятся) подправить правильно, то что я наваял ! Да не вопрос. ссылка на архив Проверка, конечно элементарная, но есть. Если Григорий захочет - пусть пример публикует, в принципе он же ваш. Только не нужно его COMM - называть (у меня, почему-то ассоциация с COM портом, хотя понимаю, что это communication), лучше IPC (Inter-process communication).

Петр: SergKis пишет: SET EVENTS FUNCTION TO MYEVENTS достаточно для всех хотелок Может быть, "но не все умеют их готовить"

SergKis: Петр пишет "но не все умеют их готовить" Добавка команд в hmg, вряд ли научит "готовить", а код в hmg (не много) но добавиться.

Петр: SergKis пишет: а код в hmg (не много) но добавиться. Это хорошо или плохо?

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



полная версия страницы