Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как Variant привести к TComponent или TWinControl [D7, WinXP]


Davinchi ©   (2005-03-06 00:41:00) 

В переменной типа Variant храниться объект (компонент - TButton), надо эту переменную привести к типу TComponent или TWinControl для того, чтобы можно было на этом объекте создать свой объект, КАК ЭТО СДЕЛАТЬ???


Romkin   (2005-03-09 13:01:00) [1]

Davinchi ©  (06.03.05 22:58) [11] :)))
А = СоздатьОбъект("MyApp.MyClass") - что сложного?
Не надо извращаться, сделай себе Automation Object и пользуй его. И, кстати, просто к DLL ты из 1С обращаться не можешь, насколько мне память не изменяет. Нет у нее LoadLibrary явно :)


Набережных С.   (2005-03-07 08:00:00) [2]


> Davinchi ©   (06.03.05 22:58) [11]

А ты сам сказал - забудь про 1С:) К тому же смотри [13]. Пойми, у тебя только 2 пути: либо интерфейсы, либо использовать окно одного в качестве родителя других, про оба сказано уже неоднократно. Первый путь продуктивней. Ну дак чего?


sniknik   (2005-03-07 01:43:00) [3]

> дык как я в 1С обращусь к интерфеийсеу в ДЛЛ???
купи книжку "создание внешних компонент для 1С"
( ~ 2 года назад она 16$ стоила)
там все есть, как и что, внедрение формы прям в примерах есть. делается через COM обьект, только для 7-ки он "немного" ;о)) извращен, для восьмерки изврашения убрали (говорят) и возможности тоже порезали (тоже говорят ;о)).


jack128   (2005-03-07 00:06:00) [4]

Davinchi ©   (06.03.05 16:30) [9]
представь что речь идет о создании своего элемента управления на форме другого приложения, при этом другое приложение вызывает это создание методом из ДЛЛ...


так чего 1С получить то должно от твоей DLL? handle окна? Ну и отдай ей хедл баттона, в чем проблема??


Davinchi   (2005-03-06 22:58:00) [5]

дык как я в 1С обращусь к интерфеийсеу в ДЛЛ???


Набережных С.   (2005-03-06 16:40:00) [6]


> Davinchi ©   (06.03.05 16:30) [9]

Интерфейсы - однозначно, все остальное - от лукавого.


Davinchi   (2005-03-06 16:30:00) [7]

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


Набережных С.   (2005-03-06 15:47:00) [8]


> Davinchi ©   (06.03.05 15:31) [7]

Забудь, про дельфийские компоненты 1С ничего не знает. Возможно подойдет передача HWND батона, а из 1С создавать элементы управления, используя этот HWND как владельца их окон. Но я даже приблизительного представления не имею об 1С, так что вполне возможно, что все написанное мной - бред сивокобыльный


Davinchi   (2005-03-06 15:31:00) [9]

Уже купил, легче не стало, после праздников работать должно...

С интерфейсами идея путняя, тока я из 1С работаю с ДЛЛ а не из ДЕлфинячего приложения... Из 1С мона цеплять тока методы и свойства объекта в ДЛЛ...

Но это как-то реально, т.к. есть компоненты, которые создают как-то свои элементы управления на форма диалогов в 1С, а за радителя используют любой компонент на форме...

Еще сть мвсь воспользоваться FindWindow и попробовать на окне найти нужный элемент...


Davinchi   (2005-03-06 15:21:00) [10]

Error: Invalid typecast


Набережных С.   (2005-03-06 15:20:00) [11]

Тебе повезло, что у Delphi рук-ног нету, а то бы она ругаться не стала.
Можно сделать так:

Присвоение:
 TVarData(v).VType:= vtPointer;
 TVarData(v).VPointer:=MyButton;

Получение:
 if TVarData(V).VType = vtPointer then
   TButton(TVarData(V).VPointer).Click;

Но делать так конечно не надо, потому как это хрень полная. Можно сделать так:
type
 IDelphiControl = interface
 [здесь GUID]
   function GetDelphiControl: TControl; stdcall;
 end;

 TMyButton = class(TButton, IDelphiControl)
 private
   function GetDelphiControl: TControl; stdcall;
 end;

И создаешь не стандартный батон, а свой, TMyButton.
Тогда передаешь так:

var
 I: IUnknown;
 MyButton: TMyButton;
begin
 MyButton:=TMyButton.Create(Self);
 I:=MyButton;
 V:=I;

а принимать можно так:

var
 I: IUnknown;
 MyButton: TMyButton;
begin
 I:=V;
 TControl(MyButton):=(I as IDelphiControl).GetDelphiControl;

Но и так делать не надо, потому что эта хрень недалеко ушла от предыдущей. Лучше выкинуть к лешему из IDelphiControl метод GetDelphiControl, обозвать этот интерфейс IDelphiButton и определить в нем все необходимые методы батона.
А еще лучше забей на ето дело и пойди купи пивка. Как я:)


Eraser   (2005-03-06 13:53:00) [12]

Davinchi ©

Почему ругается? Что за ошибку выдаёт?


Davinchi   (2005-03-06 13:45:00) [13]

может для кого важно будет: речь идет о внешней компоненте для 1С Предприятия 7.7 Во ВК я передаю кнопку, а в ДЛЛ на этой кнопке хочу свое творить. По технологии создания ВК все property в ДЛЛ имеют тип Variant, хотя попробую и с TObject...

а как поместил так обратно не получится, делфи ругается на конструкцию:
MyPanel:=TPanel.Create(TComponent(f1C_Button));


Eraser   (2005-03-06 12:25:00) [14]

Для "понятливости" используй для этих целей вместо Variant, класс TObject.


Набережных С.   (2005-03-06 06:08:00) [15]


> Davinchi ©   (06.03.05 00:41)

Практически так же, как и поместил TComponent в Variant.


Наверх

Титульная страница Поиск, карта сайта Написать письмо