Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Компонент на основе TFrame и bpl


Автор: JSinx 29.9.2008, 22:14
Есть 2 библиотеки (допустим first.bpl и second.bpl). Вторая библиотека использует первую (всякие общие файлы и т.п.)

В first.bpl у меня сделан компонент (TTestFrame) на основе TFrame (сделал все правильно, через File -> New -> Frame).
Если в этой же библиотеке создавать фрейм на основе TTestFrame, все нормально работает и ничто не ругается.

Чтобы создать во второй библиотеке фрейм на основе TTestFrame, приходиться включать файл с компонентом в библиотеку и создавать фрейм.  После этого он перестает компилироваться, т.к. говорит, что этот файл уже есть в другой библиотеке. 
Если убрать файл из библиотеки, то при переходе на дизайн фрейма, ругается :(
"Error creating form: Ancestor for TTestFrame not found".

Как быть то?

Автор: Bose 30.9.2008, 14:46
надо в исходник второй библиотеки в секцию requires добавить название первой библиотеки.
а файл содержащий TTestFrame, НЕ ВКЛЮЧАТЬ во вторую библиотеку, а прописать в секции uses нужного юнита.

Автор: JSinx 30.9.2008, 15:49
Цитата(Bose @ 30.9.2008,  14:46)
надо в исходник второй библиотеки в секцию requires добавить название первой библиотеки.
а файл содержащий TTestFrame, НЕ ВКЛЮЧАТЬ во вторую библиотеку, а прописать в секции uses нужного юнита.

Цитата(JSinx)

Вторая библиотека использует первую (всякие общие файлы и т.п.)



Естественно в секцию uses прописано, тогда бы была другая ошибка.

Автор: Bose 30.9.2008, 17:07
Цитата(JSinx @  29.9.2008,  22:14 Найти цитируемый пост)
Чтобы создать во второй библиотеке фрейм на основе TTestFrame, приходиться включать файл с компонентом в библиотеку и создавать фрейм.  После этого он перестает компилироваться, т.к. говорит, что этот файл уже есть в другой библиотеке. 


вот пример того как должно быть:

Первая библиотека.dpk:
Код

package PACKAGE1;

requires
  ...
  ;

contains
  CommonUnit1 in 'CommonUnit1.pas',
  CommonUnit2 in 'CommonUnit2.pas',
  Package1Unit1 in 'Package1Unit1.pas',
  Package1Unit2 in 'Package1Unit2.pas',
  ...;
end.


Вторая библиотека.dpk:
Код

package PACKAGE2;

requires
  PACKAGE1,
  ;

contains
  Package2Unit1 in 'Package2Unit1.pas',
  Package2Unit2 in 'Package2Unit2.pas',
  ...;
end.


а CommonUnit1 и CommonUnit2 должны быть прописаны только в секции uses нужных юнитов.


Но я не проверял как в этом случае работает визуальное наследование(создание фрейма на основе другого). 

Автор: JSinx 30.9.2008, 17:32
У меня так:
файл первого проекта (где находиться базовая форма) general.bpl
Код

contains
  FrameBase in 'FrameBase.pas' {BaseFrame: TFrame};


Файл FrameBase.pas

Код

  TBaseFrame = class(TFrame)
  private
    { Private declarations }
    function funct1(): integer;
    procedure proc1 ( index : integer);

  public
    { Public declarations }
    constructor Create( AOwner : TComponent ); override;
  end;


Вторая библиотека:
Код

requires
  general;

contains
  frameSecond in 'frameSecond.pas' {SecondFrame: TFrame};


Файл  frameSecond.pas
Код

uses
  FrameBase ;

type
  TSecondFrame = class(TBaseFrame)
  private
    { Private declarations }
  public
    { Public declarations }
  end;


Добавлено через 14 минут и 55 секунд
Если запихнуть первую и вторую библиотеку в одну группу проектов, то работает :(. Мне же нужно, чтобы работало без добавления исходников первой библиотеки.

Автор: Bose 30.9.2008, 18:16
Цитата(JSinx @  30.9.2008,  17:32 Найти цитируемый пост)
Если запихнуть первую и вторую библиотеку в одну группу проектов, то работает :(. Мне же нужно, чтобы работало без добавления исходников первой библиотеки. 


Не работает это -
Цитата(JSinx @  29.9.2008,  22:14 Найти цитируемый пост)
при переходе на дизайн фрейма, ругается :(
"Error creating form: Ancestor for TTestFrame not found".

?????

Второй фрейм, использует визуальное наследование? 

А что вообще значит работает, не работает? 


Попробуй убрать исходники(.pas), но оставить dfm-файл. 


Автор: JSinx 30.9.2008, 18:52
Цитата(Bose @ 30.9.2008,  18:16)
Не работает это -
Цитата(JSinx @  29.9.2008,  22:14 Найти цитируемый пост)
при переходе на дизайн фрейма, ругается :(
"Error creating form: Ancestor for TTestFrame not found".

?????
А что вообще значит работает, не работает? 


Выводит ошибку на экран и дизайнить форму нельзя.

Цитата(Bose @ 30.9.2008,  18:16)

Второй фрейм, использует визуальное наследование? 

Да, второй фрейм использует визуальное наследование. Его можно создать двумя путями:
  • создать в первой библиотеке и затем скопировать во вторую;
  • либо к второй библиотеке подключить файл и базовым фреймом, создать фрейм-наследник, затем убрать из библиотеки файл с базовым фреймом.

Автор: Bose 30.9.2008, 19:42

Цитата(JSinx @  30.9.2008,  18:52 Найти цитируемый пост)
Да, второй фрейм использует визуальное наследование. Его можно создать двумя путями:

    * создать в первой библиотеке и затем скопировать во вторую;
    * либо к второй библиотеке подключить файл и базовым фреймом, создать фрейм-наследник, затем убрать из библиотеки файл с базовым фреймом.

Мне кажется, что проблемы из-за визуального наследования. Лучше всего было бы совсем отказаться от него, оставив упоминания о TTestFrame только в .pas файле. 

Попробуй ещё такой вариант:
Цитата(Bose @  30.9.2008,  18:16 Найти цитируемый пост)
Попробуй убрать исходники(.pas), но оставить dfm-файл от TTestFrame. 


Автор: JSinx 30.9.2008, 21:38
Решил изменить структуру, чето гемороиться не охота.

Лучше сделаю класс, который будет содержать нужные мне методы + простой фрейм, чем так мучаться.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)