Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.48 MB
Время: 0.006 c
4-57923
UnDISCOvery
2002-02-14 20:12
2002.04.18
Как запретить пользователю из программы применять Alt - Tab ?


1-57776
Smok_er
2002-04-02 21:59
2002.04.18
Save file dialog


14-57866
copyr25
2002-03-09 23:27
2002.04.18
UPS и модем


4-57921
skywalker
2002-02-14 15:54
2002.04.18
CeateToolHelp32SnapShot на NT работает?


14-57847
Dima-k17
2002-03-05 16:19
2002.04.18
Лицей при МИФИ(1511)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский