-
alexnmsk (30.10.07 14:27) [0]Здравствуйте. Подскажите как поместить имеющийся компонент на основе TEdit в DLL, и как потом на разместить его на форме?
-
Reindeer Moss Eater © (30.10.07 14:32) [1]Имеющийся где?
-
alexnmsk (30.10.07 14:41) [2]В смыле уже написанный.
Использовался на форме. Теперь нужно этот компонент запихнуть в dll и помещать на форму в runtime -
Reindeer Moss Eater © (30.10.07 15:02) [3]Ну и помещай в рантайм. При чем здесь вообще dll?
-
alexnmsk (30.10.07 15:11) [4]Компонент ДОЛЖЕН быть сделан в виде DLL.
в dll пишу
function AECreate(Parent: TWinControl): Pointer; export;
var
f1: TAlphaEdit;
begin
f1:=TEdit.Create(nil);
f1.Parent:=Parent;
f1.Visible:=True;
end;
exports AECreate;
При вызове
procedure TForm1.FormCreate(Sender: TObject);
var
AE: ^TEdit;
begin
AECreate(Self);
end;
получаю Cannot access a TFont to a TFont, хотя корявый компонент рисуется. Определил, что ошибка вываливается на f1.Parent:=Parent; -
Reindeer Moss Eater © (30.10.07 15:19) [5]Ну и причем здесь DLL?
-
Reindeer Moss Eater © (30.10.07 15:35) [6]передвай в dll функцию хендл главного окна
из длл посылай сообщение окну на создание контрола.
в основном приложении получив сообщение, создавай контрол.
и все.
Хотя зачем для всего этого потребовалась библиотека - неясно. -
Reindeer Moss Eater © (30.10.07 15:39) [7]А вообще интересно, что бы будешь делать со значением, введенным в контрол, помещенный на форму вызовом dll?
Будешь делать FindComponent чтобы найти его?
:) -
Юрий Зотов © (30.10.07 16:30) [8]> alexnmsk (30.10.07 14:27)
EXE и DLL компилируются, как два совершенно отдельных проекта. Поэтому каждый из них содержит свою собственную VMT для одного и того же класса и получается, что TFont в EXE и TFont в DLL - это два разных класса. Отсюда и сообщение об ошибке (при назначении Parent устанавливается ParentFont, вызывается метод TFont.Assign И выясняется, что параметром в него пришел не TFont, а неизвестно что).
Та же самая несовместимость будет не только для TFont, но и для всех остальных классов тоже. Короче говоря, с идеей помещения компонентов в DLL придется помучиться изрядно. И вряд ли получится что-то путное.
Выходов из ситуации три:
1. Бросить эту идею и поискать архитектурное решение получше.
2. Вместо DLL использовать BPL.
3. Компилировать EXE и DLL с включенными run-time пакетами.