Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Как передать объект "Форма" во внешнее приложение? (число прочтений - 8945 )
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Как передать объект "Форма" во внешнее приложение?
03. Ноября 2006 :: 10:24
Печать  
При попытке передать форму или ее атрибут во внешнее приложение  на VB6 натолкнулся на жесткое сопротивление: "Плохой тип переменной". Каким образом можно это сделать?
Отмечу, что нужно передать именно форму или ее атрибут, как объект, а не его дескриптор и т.п.
  

Константин
Наверх
 
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Как передать объект "Форма" во внешнее приложе
Ответ #1 - 11. Ноября 2006 :: 11:19
Печать  
Тишина...
Может кто-нибудь из разработчиков откликнется, почему еапример VB принимает от 1С переменные только простых типов: строка,число, дата, а на все остальное ругается, причем по-русски: "Плохой тип переменной". Или это 1С не хочет отдавать свое добро?
  

Константин
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как передать объект "Форма" во внешнее приложе
Ответ #2 - 11. Ноября 2006 :: 12:11
Печать  
Цитата:
Или это 1С не хочет отдавать свое добро?

Так и есть.
Можно добавить метод, который будет заворачивать переданный объект (CValue) в VARIANT.
Только в какой объект всунуть этот метод?
Цитата:
Тишина...

А что ты хотел? суббота Улыбка
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Как передать объект "Форма" во внешнее приложе
Ответ #3 - 11. Ноября 2006 :: 12:32
Печать  
Да уж неделю тишина.
А как в Variant переделать? WSH например тоже плюется, вернее 1С-ка  не отдается. Я проверил и в Delphi  и на Net и на WSH - все одно: Пример на WSH
Код
Выбрать все
	СкриптКонтрол = СоздатьОбъект("MSScriptControl.ScriptControl");
	СкриптКонтрол.Language = "vbscript";
	СкриптКонтрол.AddCode("
	|Function GetHwnd(Body)
	|	GetHwnd = Body.hwnd
	|End Function
	|");
	Сообщить(СкриптКонтрол.Run("GetHwnd",Форма));
 

  

Константин
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как передать объект "Форма" во внешнее приложе
Ответ #4 - 11. Ноября 2006 :: 12:41
Печать  
Допустим метод обозвать Экспорт и добавить его в объект Сервис
Код
Выбрать все
Сервис=СоздатьОбъект("Сервис");
ВнешнееПриложениеНаVB6.КакойТоМетод(Сервис.Экспорт(Форма)); 


Правда можно получить граблями в случае обращения к эспортному объекту после закрытия формы.
Если внутри 1С можно обеспечить контроль ссылок, то при отдаче ссылок во внешние приложения никак.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как передать объект "Форма" во внешнее приложе
Ответ #5 - 11. Ноября 2006 :: 12:43
Печать  
Опиши что за задача.
Может удастся обойтись без передачи контекстов во внешние приложения.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как передать объект "Форма" во внешнее приложе
Ответ #6 - 11. Ноября 2006 :: 12:52
Печать  
Хе....
Вот решение:
Код
Выбрать все
ЗагрузитьВнешнююКомпоненту("EventProxy.dll");
П=СоздатьОбъект("Addin.EventProxy");
ВнешнееПриложениеНаVB6.SomeMethod(П.Сериализовать(Форма)); 


в приложении на VB
Код
Выбрать все
sub SomeMethod(Form)
f=GetObject(Form)
MsgBox(f.Caption())
.......
end sub 


Только все еще возможен вылет внешнего приложения в космос при попытке обращения к переданной форме после её закрытия.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Как передать объект "Форма" во внешнее приложе
Ответ #7 - 11. Ноября 2006 :: 12:56
Печать  
Цитата:
Сервис=СоздатьОбъект("Сервис");
ВнешнееПриложениеНаVB6.КакойТоМетод(Сервис.Экспорт(Форма));
Аааа...
С помощью 1С++ и Формекс, да других ВК - без проблем. А задачка у меня такая: научить свою ВК работать с 1С самостоятельно, не всем нравится, когда используется много примочек. А в этой задаче пункт № 1 - получить дескриптор формы. Куда не плюнь - везде hwnd давай (кстати в 1С++ и Формексе что-то нет функции типа "ПолучитьДескрипторФормы(Форма)"). Метод API GetForeGroundWindow работает спокойно, но соврет - не дорого возьмет, не всегда форма Fore. EnumWindow тоже хромает, там привязка к заголовку формы, а форм с одинаковым Caption может быть куча и с ProcessId можно проколоться. Я уже промусолил все это. Выход один: передать форму 1С как объект а там - Obj.hwnd.
  

Константин
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как передать объект "Форма" во внешнее приложе
Ответ #8 - 11. Ноября 2006 :: 13:05
Печать  
Забей на VB и пиши свою ВК на С++ по технологии Rainbow.
тогда сможешь получить честный CFormAllCtrlsContext.
Из него получишь CDocument, а из CDocument получишь CView Улыбка
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Как передать объект "Форма" во внешнее приложе
Ответ #9 - 11. Ноября 2006 :: 13:14
Печать  
Цитата:
Забей на VB
Да еще в юности. Просто клиент чокнутый. В принципе он сам рожает, а я должен эти роды принимать и облегчать потуги.
  

Константин
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как передать объект "Форма" во внешнее приложе
Ответ #10 - 11. Ноября 2006 :: 13:18
Печать  
Кстати в метод объекта ВК объект Форма должен передаваться без проблем.
Ты же вначале писал про "внешнее приложение на VB6" и приводил пример с VBScript.
В таких случаях 1С действительно будет тебя посылать на "Плохой тип переменной".

И с разделом форума ты промахнулся - твой вопрос вряд-ли относится к ООП.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Как передать объект "Форма" во внешнее приложе
Ответ #11 - 11. Ноября 2006 :: 13:31
Печать  
С разделом может и промахнулся. А 2внешнее приложение" - контрол на VB ( или Dll - не важно). Пример на wsh - просто был под рукой. Я этот код пробовал на том, что сейчас под рукой: только VB6 и 2005, Delphi, да вот нашел дстрибутив C++  Borland. Все на работе. А уж WSH - "всегда в кармане", я на нем из 1С много что быстро проверяю.
  

Константин
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как передать объект "Форма" во внешнее приложе
Ответ #12 - 11. Ноября 2006 :: 13:45
Печать  
1С может передать свой объект только в метод ВК.
При попытке передачи объекта в другой COM-объект ты будешь получать сообщение "Плохой тип переменной".
Преодолеть это ограничение можно при помощи ULE или метода Сериализовать ВК EventProxy.
Но даже если ты напишешь ВК по "Технологии создания внешних компонент" от 1С или сможешь пропихнуть объект Форма в свой объект при помощи ULE, ты не получишь больше возможностей по работе с этим объектом чем есть во встроенном языке 1С.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: Как передать объект "Форма" во внешнее приложе
Ответ #13 - 11. Ноября 2006 :: 15:39
Печать  
Цитата:
ты не получишь больше возможностей по работе с этим объектом чем есть во встроенном языке 1
В принципе я и не собираюсь с ним особо ничего делать, так, получить напрямую кое-что, а именно некоторые параметры: hwnd, hdc, caption, name, а обратно вроде винда спокойно передает. Почему я уперся в "напрямую" - так это от лени наверное. Много писанины. Я уже писал, чтоб получить хендл, пришлось перебирать окна через всякие Enum-ы с целой кучей условий, а уверенности в точности нет до сих пор. 1С в отличие от др. странно себя преподносит. Например попробуй в 1С програмно получить заголовок окна - если насильно не ввел через Форма.Заголовок, то получишь пусто. При попытке получить имя класса окна или атрибута - вообще полный бред - какие-то Afx ипроч., на кнопку не нажмешь - вообще ее как бы нет, нажмешь - # в ответ ( я про методы API). Да и то тольео после открытия, которого у чистой 1С и нет. ВИ т.д. и т.п.
А с FormEx/1C++ моя ВК работает прекрасно. Но здесь АльФ может меня не понять: примочки к Формексу делаю. Хотя я и беру от него только ПослеОткрытия и дескриптор атр.формы. Вот и хотел сам.
  

Константин
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как передать объект "Форма" во внешнее приложе
Ответ #14 - 11. Ноября 2006 :: 15:46
Печать  
Цитата:
Цитата:
ты не получишь больше возможностей по работе с этим объектом чем есть во встроенном языке 1
В принципе я и не собираюсь с ним особо ничего делать, так, получить напрямую кое-что, а именно некоторые параметры: hwnd, hdc, caption, name

Нихрена ты не получишь, кроме того, что тебе позволит получить 1С.
Передав в ВК объект Форма ты сможешь получить доступ к свойствам и методам объекта Форма и больше ничего.
у объекта Форма в 1С есть атрибут hwnd?
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать