Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.18;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.017 c
3-57628
skiph
2002-03-28 12:33
2002.04.18
Логическое поле в таблице


3-57622
Malder
2002-03-27 20:09
2002.04.18
тип Date


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


1-57685
dr_neo_rostov
2002-04-07 17:43
2002.04.18
Update for Delphi 6


3-57641
Kuzmich
2002-03-28 15:17
2002.04.18
ADO и WebServices - вещи несовместимые?