Форум: "Основная";
Текущий архив: 2002.04.18;
Скачать: [xml.tar.bz2];
ВнизActiveX и использование функций из DLL ............ Найти похожие ветки
← →
Yaro (2002-03-30 17:09) [0]..... для "извращения" над формой ActiveX"а...
В частности для добавления Компонента на АктивИкс-форму...
Пробовал ичпользовать SetParent - не помогает... Говорит, что то, на что я хочу поместить "ребенка" не может быть "родителем"... Что делать?
← →
Yaro (2002-03-31 10:05) [1]ПОМОГИТЕ!!!!!!
У меня функция, которую вызывает ActiveX из DLL должна создать кнопку, например, на форме ActiveX"a... Функция вызывается, кнопка создается, но при установке SetParent(Button1.Handle, AxFH);, Где AxFH - Handle ActiveX-формы, который передается в функцию в виде параметра.
Почему пишет ошибку?
← →
JibSkeart (2002-03-31 16:09) [2]Вопервых вы бы хотя бы ошибку написали
и как енто делаете ...
я думаю так вам ни кто ни не ответит
сдеся телепатов нет ....
← →
Yaro (2002-03-31 16:29) [3]Участок кода 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;
← →
Yaro (2002-04-04 17:47) [4]Напишите хоть что-нибуть по этому поводу! Очень прошу.
← →
Fantasist (2002-04-04 20:27) [5]Проверь, валидный ли у тебя Handle буттона.
← →
Yaro (2002-04-05 01:08) [6]Не понял..... по русски мона?
← →
Fantasist (2002-04-05 02:55) [7]:)
Ну я имел ввиду, что если ты сделаешь так:
var
b:TButton;
begin
b:=TButton.Create(nil);
Windows.SetParent(b.Handle,Form1.Handle);
end;
То будет exception, так как b.Handle - не существует.
← →
Yaro (2002-04-05 04:27) [8]Fantasist -> Стоп... Вот в этом-то скорее всего и проблема... Вопрос: "почему ее не существует?". И следом еще один: "как мне реализовать то, что написано в содержании вопроса?"
← →
Fantasist (2002-04-05 07:16) [9]Не существует, потому что не существует. :)
Свойство 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 15:28) [10]CreateParented - расскижите подробнее. У меня счас делфи нету. Я в другом городе и хотел бы на пальцах решить эту проблему
← →
Yaro (2002-04-05 15:31) [11]Да и почему такой прикол не страбатывает?
Участок кода 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;
← →
Fantasist (2002-04-05 19:35) [12]
> Да и почему такой прикол не страбатывает?
А что теперь не срабатывает?
> CreateParented - расскижите подробнее. У меня счас делфи
> нету. Я в другом городе и хотел бы на пальцах решить эту
> проблему
А что там по подробнее...
constructor TWinControl.CreateParented(ParentWindow: HWnd);
begin
FParentWindow := ParentWindow;
Create(nil);
end;
Но почему-то это ингода к глюкам приводит. Почему? Лень разбираться.
← →
Сергей Чурсин (2002-04-07 09:47) [13]А возможно ли обратную операцию провернуть? Что бы взять чужой HWND и как-то его всобачить в форму (ну как Form2.Parent:=Form1) ?
То есть что-то типа : TWincontrol(HWND).Parent:=Form1, хотя так,
конечно, это работать не будет...
← →
Fantasist (2002-04-08 02:15) [14]Ага. Отобразить окно на TForm. :) Нет, конечно же так нельзя. Хотя можно написать класс, который бы это сделал, в каком-то виде. То есть взял бы этот HWND, через WinAPI изучил бы это окно, и поставил бы свои настройки в соответсвии.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.04.18;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c