Форум: "Основная";
Текущий архив: 2002.05.20;
Скачать: [xml.tar.bz2];
ВнизНаследник TForm Найти похожие ветки
← →
robbit (2002-05-03 10:05) [0]Может быть вопос и дурацкий, но я никак не могу догнать, как зарегитрировать компонент наследник TForm?
Делаю в лоб, вот так:
type
TMyForm = class(TForm)
private
FInt: Integer;
public
constructor Create(AOwner: TComponent); override;
published
property IntProp: Integer read FInt write FInt default 1;
end;
procedure Register;
implementation
procedure Register;
begin RegisterNoIcon([TMyForm]); end;
constructor TMyForm.Create(AOwner: TComponent);
begin inherited Create(AOwner); FInt := 1; end;
end.
Хочу, чтобы при создании новой формы наследника TMyForm в Object Inspector появилось новое свойство IntProp. И ни фига.
← →
Song (2002-05-03 10:29) [1]Чего-то я не понял... А при чём тут ИО? Вы создаёте форму в run-time так сказать... У Вас это свойство появится TMyForm.FInt
Инспектор объектов может показывать свойства компонентов, которые уже на форме в design-time.
← →
robbit (2002-05-03 11:04) [2]To Song
У меня есть желание создать компонент наследник TForm и добавить ему несколько новых published свойств которые можно было бы потом править в design-time. Я содаю пакет и инсталю его как полагается. В run-time все впорядке новое свойство у наследников TMyForm имеется, а вот в design-time нет.
← →
MBo (2002-05-03 11:12) [3]поищи в Инете по словам Сергей Орлик CFPack
← →
troits (2002-05-04 14:34) [4]Заставить Delphi поместить published - свойства наследника TForm
в инспектор объектов можно, хотя это сопряжено с некоторыми трудностями.
Несколько решений приведено в книге Марко Канту и Тима Гуча
Delphi. Руководство разработчика.
Собственно, достаточно просто добавить в процедуру Register
RegisterCustomModule(TForm1, TCustomModule);
Этим мы зарегистрируем еще один конструктор объектов
и также создать эксперт, который по Execute создает новый модуль
и добавляет его в проект.
RegisterLibraryExpert(TForm1Expert.Create);
После инсталляции пакета с этим модулем жмем Help->Form1 Wizard и
создастся новая форма TForm11 c редактируемым свойством.
Вот интересно, может как-то можно создавать форму не через Expert, а
,например, из репозитория?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, DsgnIntf, ExptIntf, ToolIntf;
{$M+}
type
TForm1 = class(TForm)
Button1: TButton;
private
{ Private declarations }
public
FMyProp: Integer;
{ Public declarations }
constructor Create(AOwner: TComponent); override;
published
property MyProp: Integer read FMyProp write FMyProp default 0;
end;
TForm1Expert = class (TIExpert)
public
function GetStyle: TExpertStyle; override;
function GetName: string; override;
function GetAuthor: string; override;
function GetComment: string; override;
function GetPage: string; override;
function GetGlyph: HICON; override;
function GetState: TExpertState; override;
function GetIDString: string; override;
function GetMenuText: string; override;
procedure Execute; override;
end;
var
Form1: TForm1;
procedure Register;
implementation
uses
EditIntf;
{$R *.DFM}
{ TForm1 }
constructor TForm1.Create(AOwner: TComponent);
begin
inherited;
InitInheritedComponent(Self, TCustomForm);
end;
// "standard" project expert
function TForm1Expert.GetStyle: TExpertStyle;
begin
// show up in the Help menu
Result := esStandard;
end;
function TForm1Expert.GetName: String;
begin
// official name
Result := "Form1 Wizard"
end;
function TForm1Expert.GetAuthor: string;
begin
Result := "Marco and Tim";
end;
function TForm1Expert.GetComment: String;
begin
Result := "TForm1Expert Wizard";
end;
function TForm1Expert.GetPage: string;
begin
Result := "";
end;
function TForm1Expert.GetGlyph: HICON;
begin
Result := 0;
end;
function TForm1Expert.GetState: TExpertState;
begin
Result := [esEnabled];
end;
function TForm1Expert.GetIDString: String;
begin
// must be unique
Result := "Form1Wizard"
end;
function TForm1Expert.GetMenuText: String;
begin
// the text of the menu item
Result := "&Form1 Wizard"
end;
procedure TForm1Expert.Execute;
var
ModuleName, FormName, FileName: string;
ModIntf: TIModuleInterface;
begin
ToolServices.GetNewModuleAndClassName (
"Form1", ModuleName, FormName, FileName);
ModIntf := ToolServices.CreateModuleEx (FileName, FormName,
"Form1", "", nil, nil,
[cmNewForm, cmAddToProject, cmUnNamed]);
ModIntf.ShowSource;
ModIntf.ShowForm;
ModIntf.Release;
end;
procedure Register;
begin
RegisterCustomModule(TForm1, TCustomModule);
RegisterLibraryExpert(TForm1Expert.Create);
end;
end.
← →
robbit (2002-05-06 13:36) [5]To troits
Создать эксперт в репозитории оказывается очень просто. В Вашем примере достаточно переписать три метода, и пожалуйста.
function TForm1Expert.GetStyle: TExpertStyle;
begin
Result := esForm;
end;
function TForm1Expert.GetPage: string;
begin
Result := "Form1";
end;
function TForm1Expert.GetMenuText: String;
begin
Result := ""
end;
Но при таком подходе я нашел две проблемы
При открытии формы из Progect Manager или если перейти в режим просмотра As Text, а потом обратно в As Form выскакивает сообщение об ошибке:
A component named Button1 already exists. Ignore the error and continue? NOTE: Ignoring the error may cause component to be deleted or property values to be lost.
А при запуске программы на выполнение выскакивает следующее:
Exception EReadError in module PROJECT1.EXE at 0001CB97.
Error reading Form12.MyProp: Property MyProp does not exist.
Спасибо всем, кто откликнулся. В результате меня очень увлек процесс написания экспертов. Буду очень благодарен за любые ссылки на материалы по этой теме.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.05.20;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c