Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-64459
XanderMan
2002-04-24 20:02
2002.05.20
Как узнать в программе значения полей для вставленной записи


7-64857
gluka
2002-02-16 02:47
2002.05.20
Как можно в вынь2к, ХР закрыть доступ к дисководу??? Есть ли что то для етого в АПИ??


14-64776
IronHawk
2002-03-19 11:14
2002.05.20
Перевод одной цифры в буквы !


4-64885
Gayrus
2002-03-17 14:06
2002.05.20
Папки


1-64629
kserg@ukr.net
2002-05-08 11:12
2002.05.20
TStringGrid - как раскрасить строки/ячейки ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский