Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 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 изучил бы это окно, и поставил бы свои настройки в соответсвии.




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.18;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.028 c
3-57614           Daiz13                2002-03-26 15:58  2002.04.18  
Передача параметров для Select в хранимую процедуру


6-57832           Song                  2002-01-28 14:11  2002.04.18  
Я никогда не программировал сокеты, объясните мне одну простейшую вещь...


1-57785           Sergey_R              2002-04-05 18:36  2002.04.18  
Нетрадиционный вопрос!


1-57786           snoup                 2002-04-06 12:20  2002.04.18  
Как сделать чтобы на форме через какой-нибудь компанент был виден


3-57623           XanderMan             2002-03-27 20:24  2002.04.18  
Помогите с UDF