![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как получить доступ к контроллу из dll?? [D6, Win2k]
bloodman © (2004-08-22 17:06:00)Есть программа на форме listbox . программу загружает dll и мне нужно из dll получить доступ к этому listbox . Как это можно осуществить.? Пробовал так:
Передавал Handle листбокса,а в dll писал так:
TListBox(FindControl(Handle)).items.add('dfs');
Но появлялся AV :(
Mim1 (2004-08-23 05:08:00) [1]- Рядовой, из чего сделан корпус пистолета Макарова?
- Из стали, товарищ майор
Майор достает из под стола книгу - Правильно из стали
- А из чего сделан ствол пистолета Макарова?
- Из стали, товарищ майор
Достает книгу, смотрит - Неправильно, из того же материала
Юрий Зотов (2004-08-22 22:22:00) [2]> bloodman © (22.08.04 20:34) [7]
> пишет invalid class typecast на строчке
> Lis:=PCallBack(cr,fb) as TListBox;
Вот это и есть последствия использования DLL. С BPL такого не было бы.
> bloodman © (22.08.04 21:04) [13]
> А почему с as не хочет?
EXE и DLL компилируются независимо друг от друга. Поэтому класс в EXE и тот же самый класс в DLL - это, с формальной точки зрения, два РАЗНЫХ класса. Вот AS и не работает.
bloodman (2004-08-22 21:04:00) [3]Спасибо. А почему с as не хочет?
Mim1 (2004-08-22 20:57:00) [4]
> Это можно исправить ведь если указывать TListBox то все
> работает.
Самоцетируюсь.
> избежать можно явным приведением (без проверки), что нерекомендуется
bloodman (2004-08-22 20:52:00) [5]Как вариант можно отказаться от всего что присуще DElphi в интерфейсах между модулями
Этого я и хотел изначально , но что - то не получилось.
Скажите а вы компилируете c BPL или всетаки пошли другим путем?
Нет не bpl . Пока dll.
Это можно исправить ведь если указывать TListBox то все работает.
Mim1 (2004-08-22 20:47:00) [6]Как вариант можно отказаться от всего что присуще DElphi в интерфейсах между модулями. Использования обьектов переменных типа string и т.п. Тогда вы не только не будете зависить от версии Delphi но и вообще от языка програмирования.
Mim1 (2004-08-22 20:45:00) [7]Может получится что в разных модулях программы (exe и dll) разные экземпляры класса TListBox. Тогда и будет проявлятся такая ошибка, избежать можно явным приведением (без проверки), что нерекомендуется. Или использованием одного экземпляра указанного обьекта. (То есть размещением этого класса в BPL).
Mim1 (2004-08-22 20:42:00) [8]Какой ужас :)
Скажите а вы компилируете c BPL или всетаки пошли другим путем?
bloodman (2004-08-22 20:34:00) [9]:( пишет invalid class typecast
на строчке
Lis:=PCallBack(cr,fb) as TListBox;
bloodman (2004-08-22 20:20:00) [10]это я понимаю. Спасибо. Щас попробую.
Mim1 (2004-08-22 20:18:00) [11]Передавайте tobject. Потом приводите.
var rz:TListBox;
rz := callback(...) as TListBox;
На самом деле будет передан только указатель, какой тип, важно только на этапе разработки.
bloodman (2004-08-22 20:09:00) [12]Все Заработало но не совсем как хотелось бы.
У меня функция должна передовать разные типы контроллов в зависимости от ситуации (ListBox, Memo и т.д.).Когда я пишу так:
function CallBack( Create : TCreate ;Func:TCbFuncs):TListBox;
то все работает, но так можно передать только listbox.Как надо написать чтобы можно было передавать все тыпы контролов? Пробовал так:
function CallBack( Create : TCreate ;Func:TCbFuncs):TWinControl.
Говорит Incopatable types .
Mim1 (2004-08-22 20:06:00) [13]
> [2] bloodman © (22.08.04 19:49)
От версий вы все равно будете зависеть, нельзя обращаться к свойствам обьектов в созданых в другой версии Delphi. Результатом будет все тот же AV. Проверено практикой.
bloodman (2004-08-22 19:49:00) [14]понимаю что лучше bpl,но хочется хоть какой-нибуть универсальности.(всмысле не зависеть от версий Delphi)
Юрий Зотов (2004-08-22 19:00:00) [15]А что мешает просто передать прямую ссылку на ListBox, без всяких FindControl'ов?
P.S.
Все же для таких вещей лучше использовать BPL, а не DLL. Гораздо проще и надежнее будет. И без дублирования кода.