Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.20;
Скачать: CL | DM;

Вниз

Наследник 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.01 c
3-64532
ProfiUgl
2002-04-23 15:23
2002.05.20
ADOQuery1 ->> ADOQuery2


3-64475
Aleksandr
2002-04-22 11:45
2002.05.20
Как установить таблице хитрый язык?


3-64483
cranium
2002-04-22 03:17
2002.05.20
Ошибка при создании процедуры


1-64586
Elka
2002-05-06 17:15
2002.05.20
Сохранение свойств визуальных компонентов


3-64499
CrazzyWizzard
2002-04-23 08:23
2002.05.20
Проблема с быстрой (!) Модификацией MDB-базы