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

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

ActiveX и использование функций из DLL ............ [D5, Win2k]


Yaro ©   (2002-03-30 17:09:00) 

..... для "извращения" над формой ActiveX"а...

В частности для добавления Компонента на АктивИкс-форму...

Пробовал ичпользовать SetParent - не помогает... Говорит, что то, на что я хочу поместить "ребенка" не может быть "родителем"... Что делать?


Fantasist   (2002-04-08 02:15:00) [1]

Ага. Отобразить окно на TForm. :) Нет, конечно же так нельзя. Хотя можно написать класс, который бы это сделал, в каком-то виде. То есть взял бы этот HWND, через WinAPI изучил бы это окно, и поставил бы свои настройки в соответсвии.


Сергей Чурсин   (2002-04-07 09:47:00) [2]

А возможно ли обратную операцию провернуть? Что бы взять чужой HWND и как-то его всобачить в форму (ну как Form2.Parent:=Form1) ?
То есть что-то типа : TWincontrol(HWND).Parent:=Form1, хотя так,
конечно, это работать не будет...


Fantasist   (2002-04-05 19:35:00) [3]


> Да и почему такой прикол не страбатывает?


А что теперь не срабатывает?


> CreateParented - расскижите подробнее. У меня счас делфи
> нету. Я в другом городе и хотел бы на пальцах решить эту
> проблему


А что там по подробнее...

constructor TWinControl.CreateParented(ParentWindow: HWnd);
begin
FParentWindow := ParentWindow;
Create(nil);
end;


Но почему-то это ингода к глюкам приводит. Почему? Лень разбираться.


Yaro   (2002-04-05 15:31:00) [4]

Да и почему такой прикол не страбатывает?

Участок кода ActiveX"a:

var p: TWinControl;

...

p := ActiveXForm;

asm
push p
call MyFunc {Эта функция находится в DLL-бибилиотеке}
end;


Участок кода DLL:

var b: TButton;

Procedure MyFunc(_p: TWinControl); stdcall;
begin
b := TButton.Create(_p);
b.Left := 100;
b.Top := 100;
p.Parent := _p;

...

// SetParent(b.Handle, _p); {Вот здесь-то и ошибка}

// Showmessage(IntToStr(_p)); {Работает, отображает Хэндл того, что я передал}
end;


Yaro   (2002-04-05 15:28:00) [5]

CreateParented - расскижите подробнее. У меня счас делфи нету. Я в другом городе и хотел бы на пальцах решить эту проблему


Fantasist   (2002-04-05 07:16:00) [6]

Не существует, потому что не существует. :)
Свойство Handle читается методом, который приводит к вызовову CreateHandle, так как FHandle=0, и в свою очередь приводит к вызову CreateWnd, а там есть такой фрагмент:


if (Owner <> nil) and (csReading in Owner.ComponentState) and
(Owner is TWinControl) then
WndParent := TWinControl(Owner).Handle
else
raise EInvalidOperation.CreateFmt(SParentRequired, [Name]);


Который как легко догадаться вызывает exception. А вот как с этим бороться? Я бы сказал так(ох, хотелось бы мне ошибиться): если у тебя нету VCL родителя, а только Handle окна, то по видемому придется забить VCL и писать на API. Можно еще достать библиотеки, на API, помимо VCL.
Есть там правда метод CreateParented, но он у меня в Delphi6 как-то странно работает, глюковато.


Yaro   (2002-04-05 04:27:00) [7]

Fantasist -> Стоп... Вот в этом-то скорее всего и проблема... Вопрос: "почему ее не существует?". И следом еще один: "как мне реализовать то, что написано в содержании вопроса?"


Fantasist   (2002-04-05 02:55:00) [8]

:)
Ну я имел ввиду, что если ты сделаешь так:

var
b:TButton;
begin
b:=TButton.Create(nil);
Windows.SetParent(b.Handle,Form1.Handle);
end;

То будет exception, так как b.Handle - не существует.


Yaro   (2002-04-05 01:08:00) [9]

Не понял..... по русски мона?


Fantasist   (2002-04-04 20:27:00) [10]

Проверь, валидный ли у тебя Handle буттона.


Yaro   (2002-04-04 17:47:00) [11]

Напишите хоть что-нибуть по этому поводу! Очень прошу.


Yaro   (2002-03-31 16:29:00) [12]

Участок кода ActiveX"a:

var p: HWND;

...

p := ActiveXForm.Handle;

asm
push p
call MyFunc {Эта функция находится в DLL-бибилиотеке}
end;


Участок кода DLL:

var b: TButton;

Procedure MyFunc(_p: HWND); stdcall;
begin
b := TButton.Create(nil);
b.Left := 100;
b.Top := 100;

...

SetParent(b.Handle, _p); {Вот здесь-то и ошибка}

Showmessage(IntToStr(_p)); {Работает, отображает Хэндл того, что я передал}
end;


JibSkeart   (2002-03-31 16:09:00) [13]

Вопервых вы бы хотя бы ошибку написали
и как енто делаете ...
я думаю так вам ни кто ни не ответит
сдеся телепатов нет ....


Yaro   (2002-03-31 10:05:00) [14]

ПОМОГИТЕ!!!!!!

У меня функция, которую вызывает ActiveX из DLL должна создать кнопку, например, на форме ActiveX"a... Функция вызывается, кнопка создается, но при установке SetParent(Button1.Handle, AxFH);, Где AxFH - Handle ActiveX-формы, который передается в функцию в виде параметра.

Почему пишет ошибку?


Наверх

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