![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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-формы, который передается в функцию в виде параметра.
Почему пишет ошибку?