Когда мы создавали процесс сборки из последней компании, в которой я работал, мы хотели сделать то же самое.Мы использовали subversion, и у нас был проект для наших общих компонентов, который содержал проект (Finalbuilder) для создания всех наших общих пакетов.
Затем я собирался использовать технику, аналогичную переменной Marjan (MyLib).И запустите Delphi из пакетного файла с последним набором компонентов.
В итоге мы обнаружили, что в этом нет необходимости.Опубликованные свойства наших основных фреймов изменялись настолько редко, что мы просто использовали один установленный набор пакетов, скажем, в
c: \ BDS \ Components \ D12 \ Bpl (это может отличаться от разработчика к разработчику)
Но код, который находился в
c: \ BDS \ MyProject \ Shared, всегда был связан при компиляции, потому что он находился в относительном пути поиска при создании проекта
c: \ BDS \ MyProjectExperimental также будет использовать правильно разветвленный код при сборке.
Мы фактически обошли проблему хранилища, используя CodeSmith (генератор кода) для генерации фреймов, с дополнительным бонусом, что они будутпоместите в нужную папку с правильными соглашениями об именах (и любые изменения, относящиеся к отрасли).Мы сделали это для экономии времени, но (случайно) все вместе избежали этой проблемы.
Для шаблонов CodeSmith потребовалось немного времени для настройки первого кадра, но затем мы легко адаптировали егосоздавать другие подклассы без слишком большого количества циклов мозга (для таких вещей, как dataModules).
cfEditFrame.dfm.cst
<%@ CodeTemplate Language="C#" TargetLanguage="Delphi" Src="" Inherits="" Debug="False" Description="cfEditFrames.dfm Template" ResponseEncoding="ASCII" %>
<%@ Property Name="TypeName" Type="System.String" Default="TypeName" Optional="False" Category="Strings" Description="Name of Type. eg Account; AgeMonths" %>
inherited cf<%=TypeName%>EditFrame: Tcf<%=TypeName%>EditFrame
Width = 425
Height = 63
end
cfEditFrame.cst - один сценарий, который нам нужно было вызвать для генерацииновый подклассный фрейм
<%@ CodeTemplate Language="C#" TargetLanguage="Delphi" Src="" Inherits="" Debug="False" Description="cfSDMEditComp Template." ResponseEncoding="ASCII" %>
<%@ Property Name="OutputFolder" Type="System.String" Default="..\\SharedNonInstalled" Optional="False" Category="Strings" Description="" %>
<%@ Property Name="TypeName" Type="System.String" Default="TypeName" Optional="False" Category="Strings" Description="Name of Type. eg Account; AgeMonths." %>
<%@ Register Name="EditFramesPasTemplate" Template="cfEditFrames.pas.cst" %>
<%@ Register Name="EditFramesDfmTemplate" Template="cfEditFrames.dfm.cst" %>
<%@ Import NameSpace="System.IO" %>
<script runat="template">
public override void Render(TextWriter writer)
{
EditFramesPasTemplate cfEditFramesPasTemplate = new EditFramesPasTemplate();
this.CopyPropertiesTo(cfEditFramesPasTemplate);
cfEditFramesPasTemplate.RenderToFile(String.Format("{0}\\Edit\\cf{1}EditFrames.pas", OutputFolder, TypeName), true);
EditFramesDfmTemplate cfEditFramesDfmTemplate = new EditFramesDfmTemplate();
this.CopyPropertiesTo(cfEditFramesDfmTemplate);
cfEditFramesDfmTemplate.RenderToFile(String.Format("{0}\\Edit\\cf{1}EditFrames.dfm", OutputFolder, TypeName), true);
}
</script>
Могут быть и другие генераторы исходного кода, которые делают это точно так же, если не лучше.У нас был CodeSmith, и поэтому мы его использовали.Надеюсь, вышеупомянутые файлы отформатированы ОК.Я НАСТОЛЬКО новичок и надеюсь, что рендеринг HTML-подобного кода правильный.
Поскольку в этих кадрах есть свойства и компоненты, которые вы хотите наследовать, вам нужно сделать одну странную вещь.Вам нужно сделать это в два этапа.Сначала вам нужно добавить свойства фрейма в первый класс, а затем добавить компоненты в его подкласс.
Например, мы добавляем пользовательские свойства в cfBaseEditFrames.TcfBaseEditFrame.
Затем подкласс этого класса в cfEditFrames.TcfEditFrame = class (TcfBaseEditFrame).Здесь мы добавляем наши компоненты (в нашем примере это TActionList и TImageList)
При регистрации их в пакете мы добавили
RegisterCustomModule (TcfBaseEditFrame, TWinControlCustomModule);
Мызатем убедитесь, что этот пакет находится в нашей проектной группе и нет проблем с открытием новых подклассов фреймов.
Последнее замечание: по памяти было важно, чтобы добавочный компонент был добавлен к кадру-потомку (TcfEditFrame).Невозможно добавить компоненты в TcfBaseEditFrame и свойства в TcfEditFrame.
BaseEditFrames.pas
unit BaseEditFrames;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TBaseEditFrame = class(TFrame)
private
{ Private declarations }
FNewFormProperty: string;
published
{ Published declarations }
property NewFormProperty: string read FNewFormProperty write FNewFormProperty;
end;
implementation
{$R *.dfm}
end.
BaseEditFrames.dfm
object BaseEditFrame: TBaseEditFrame
Left = 0
Top = 0
Width = 320
Height = 240
TabOrder = 0
end
EditFrames.pas
unit EditFrames;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ActnList, BaseEditFrames;
type
TEditFrame = class(TBaseEditFrame)
ActionList: TActionList;
private
{ Private declarations }
public
{ Public declarations }
end;
implementation
{$R *.dfm}
end.
EditFrames.dfm
object EditFrame: TEditFrame
Left = 0
Top = 0
Width = 320
Height = 240
TabOrder = 0
object ActionList: TActionList
Left = 72
Top = 16
end
end
FramePackage.dpk
package FramePackage;
{$R *.res}
{$ALIGN 8}
{$ASSERTIONS ON}
{$BOOLEVAL OFF}
{$DEBUGINFO ON}
{$EXTENDEDSYNTAX ON}
{$IMPORTEDDATA ON}
{$IOCHECKS ON}
{$LOCALSYMBOLS ON}
{$LONGSTRINGS ON}
{$OPENSTRINGS ON}
{$OPTIMIZATION ON}
{$OVERFLOWCHECKS OFF}
{$RANGECHECKS OFF}
{$REFERENCEINFO OFF}
{$SAFEDIVIDE OFF}
{$STACKFRAMES OFF}
{$TYPEDADDRESS OFF}
{$VARSTRINGCHECKS ON}
{$WRITEABLECONST OFF}
{$MINENUMSIZE 1}
{$IMAGEBASE $400000}
{$DESCRIPTION 'Inheritable Frames'}
{$IMPLICITBUILD ON}
requires
rtl,
vcl,
designide;
contains
RegisterFramePackage in 'RegisterFramePackage.pas',
BaseEditFrames in 'BaseEditFrames.pas' {BaseEditFrame: TFrame},
EditFrames in 'EditFrames.pas' {EditFrame: TFrame};
end.
unit RegisterFramePackage;
interface
procedure Register;
implementation
uses Classes, DesignIntf, WCtlForm, BaseEditFrames;
procedure Register;
begin
RegisterCustomModule(TBaseEditFrame, TWinControlCustomModule);
end;
end.
Вам необходимо установить этот пакет времени разработки.Затем вы можете создать рамку в другом проекте, например:
EditFrameDescendants.pas
unit EditFrameDescendants;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, EditFrames, ActnList;
type
TEditFrameDescendant = class(TEditFrame)
Action1: TAction;
private
{ Private declarations }
public
{ Public declarations }
end;
implementation
{$R *.dfm}
end.
EditFrameDescendants.dfm
inherited EditFrameDescendant: TEditFrameDescendant
ParentFont = False
inherited ActionList: TActionList
object Action1: TAction
Caption = 'Action1'
end
end
end
Вы сможете открыть EditFrameDescendantотредактируйте его удивительный «NewFormProperty» и добавьте действия в его список действий.У меня работает .... Удачи