Конференция "Компоненты" » Компонент в DLL [D7]
 
  • 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 пакетами.
 
Конференция "Компоненты" » Компонент в DLL [D7]
Есть новые Нет новых   [134427   +38][b:0][p:0.001]