dumper
asked on
Add my property to TForm
i would like to add my property to TForm properties page, can i and how ? Please give an example code here..
I dont think that is what he meant, I think he wants the property to be published in the object inspector. Here is some code samples
The following unit would be your custom form with your new properties:
unit MyNewForm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, DSGNIntf;
//^this unit is what allows registering with Delphi as custom form
type
TMyNewForm = class (TForm)
private
fValue: Integer;
fOnChangeValue: TNotifyEvent;
procedure SetValue (Value: Integer);
published
property Value: Integer
read fValue write SetValue;
property OnChangeValue: TNotifyEvent
read fOnChangeValue write fOnChangeValue;
//Adding new property and event here
end;
procedure Register;
implementation
procedure TMyNewForm.SetValue (Value: Integer);
begin
if Value <> fValue then
begin
fValue := Value;
if Assigned (fOnChangeValue) then
fOnChangeValue (self);
end;
end; //just property implementation method
procedure Register;
begin
RegisterCustomModule (TMyNewForm, TCustomModule);
//This is what does the magic - it installs the form as a system module so it can be seen by the ToolsApi - getting to that part
end;
end.
Now for the other piece of the puzzle:
unit FormWizard;
interface
uses
ExptIntf, EditIntf, Windows;
type
TMyNewFormExpert = 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;
procedure Register;
implementation
uses
Dialogs, ToolIntf, SysUtils;
function TMyNewFormExpert.GetStyle: TExpertStyle;
begin
// show up in the Help menu
Result := esStandard;
end;
function TMyNewFormExpert.GetName: String;
begin
// official name
Result := 'Form Wizard'
end;
function TMyNewFormExpert.GetAuthor : string;
begin
//You!
Result := 'Me';
end;
function TMyNewFormExpert.GetCommen t: String;
begin
//Whatever you want
Result := 'Installs custom form';
end;
function TMyNewFormExpert.GetPage: string;
begin
//Leave like this
Result := '';
end;
function TMyNewFormExpert.GetGlyph: HICON;
begin
//Leave like this
Result := 0;
end;
function TMyNewFormExpert.GetState: TExpertState;
begin
// always enabled
Result := [esEnabled];
end;
function TMyNewFormExpert.GetIDStri ng: String;
begin
// must be unique
Result := 'FormWizForMyNewForm'
end;
function TMyNewFormExpert.GetMenuTe xt: String;
begin
// the text of the menu item
Result := '&Create a MyNewForm'
end;
procedure TMyNewFormExpert.Execute;
//This is what actually installs the form into the IDE. It queries the system for the module (you must install Form first!) and adds a menu item to the help menu which allows you to install it
var
ModuleName, FormName, FileName: string;
ModIntf: TIModuleInterface;
begin
ToolServices.GetNewModuleA ndClassNam e ('MyNewForm', ModuleName, FormName, FileName);
ModIntf := ToolServices.CreateModuleE x (FileName, FormName, 'MyNewForm', '',
nil, nil, [cmNewForm, cmAddToProject, cmUnNamed]);
ModIntf.ShowSource;
ModIntf.ShowForm;
ModIntf.Release;
end;
procedure Register;
begin
RegisterLibraryExpert(TMyN ewFormExpe rt.Create) ;
end;
end.
Whew! Now that that is done, lets move on. You must follow the following steps carefully to get this right:
1. Save both of the above units somewhere in your search path after making whatever modifications you want to them.
2. Open the MyNewForm Unit in Delphi and click Component>Install Component. Go ahead and compile. If you have bug in your code you can address it here.
3. Once that is done let the package library rebuild, close the MyNewForm unit and open the FormWizard unit. Repeat step 2 on it.
4. Now close all files and goto the help menu - you should see an entry that says "Create a MyNewForm" (or whatever you changed it to). Click it and your form should pop up in the IDE, new properties and all! But you arent finished yet
5. You must now a "MyNewForm" to the end of the uses clause of the form code that just popped up. Go ahead and save this form now somewhere (it will be a template)
6. Right click on the forms client area and select "Add to repository". Fill in the blanks. If you ALWAYS want to use this form you can check the mainform box.
7. Now to use the form all you have to do is click file>new form and select it from the list. If you want it to be the MainForm the easiest thing to do is just create a new project, add your form to it, and remove the original TForm.
I hope this was all clear enough for you to understand. It is very difficult to explain clearly. Hope this helps
The following unit would be your custom form with your new properties:
unit MyNewForm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, DSGNIntf;
//^this unit is what allows registering with Delphi as custom form
type
TMyNewForm = class (TForm)
private
fValue: Integer;
fOnChangeValue: TNotifyEvent;
procedure SetValue (Value: Integer);
published
property Value: Integer
read fValue write SetValue;
property OnChangeValue: TNotifyEvent
read fOnChangeValue write fOnChangeValue;
//Adding new property and event here
end;
procedure Register;
implementation
procedure TMyNewForm.SetValue (Value: Integer);
begin
if Value <> fValue then
begin
fValue := Value;
if Assigned (fOnChangeValue) then
fOnChangeValue (self);
end;
end; //just property implementation method
procedure Register;
begin
RegisterCustomModule (TMyNewForm, TCustomModule);
//This is what does the magic - it installs the form as a system module so it can be seen by the ToolsApi - getting to that part
end;
end.
Now for the other piece of the puzzle:
unit FormWizard;
interface
uses
ExptIntf, EditIntf, Windows;
type
TMyNewFormExpert = 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;
procedure Register;
implementation
uses
Dialogs, ToolIntf, SysUtils;
function TMyNewFormExpert.GetStyle:
begin
// show up in the Help menu
Result := esStandard;
end;
function TMyNewFormExpert.GetName: String;
begin
// official name
Result := 'Form Wizard'
end;
function TMyNewFormExpert.GetAuthor
begin
//You!
Result := 'Me';
end;
function TMyNewFormExpert.GetCommen
begin
//Whatever you want
Result := 'Installs custom form';
end;
function TMyNewFormExpert.GetPage: string;
begin
//Leave like this
Result := '';
end;
function TMyNewFormExpert.GetGlyph:
begin
//Leave like this
Result := 0;
end;
function TMyNewFormExpert.GetState:
begin
// always enabled
Result := [esEnabled];
end;
function TMyNewFormExpert.GetIDStri
begin
// must be unique
Result := 'FormWizForMyNewForm'
end;
function TMyNewFormExpert.GetMenuTe
begin
// the text of the menu item
Result := '&Create a MyNewForm'
end;
procedure TMyNewFormExpert.Execute;
//This is what actually installs the form into the IDE. It queries the system for the module (you must install Form first!) and adds a menu item to the help menu which allows you to install it
var
ModuleName, FormName, FileName: string;
ModIntf: TIModuleInterface;
begin
ToolServices.GetNewModuleA
ModIntf := ToolServices.CreateModuleE
nil, nil, [cmNewForm, cmAddToProject, cmUnNamed]);
ModIntf.ShowSource;
ModIntf.ShowForm;
ModIntf.Release;
end;
procedure Register;
begin
RegisterLibraryExpert(TMyN
end;
end.
Whew! Now that that is done, lets move on. You must follow the following steps carefully to get this right:
1. Save both of the above units somewhere in your search path after making whatever modifications you want to them.
2. Open the MyNewForm Unit in Delphi and click Component>Install Component. Go ahead and compile. If you have bug in your code you can address it here.
3. Once that is done let the package library rebuild, close the MyNewForm unit and open the FormWizard unit. Repeat step 2 on it.
4. Now close all files and goto the help menu - you should see an entry that says "Create a MyNewForm" (or whatever you changed it to). Click it and your form should pop up in the IDE, new properties and all! But you arent finished yet
5. You must now a "MyNewForm" to the end of the uses clause of the form code that just popped up. Go ahead and save this form now somewhere (it will be a template)
6. Right click on the forms client area and select "Add to repository". Fill in the blanks. If you ALWAYS want to use this form you can check the mainform box.
7. Now to use the form all you have to do is click file>new form and select it from the list. If you want it to be the MainForm the easiest thing to do is just create a new project, add your form to it, and remove the original TForm.
I hope this was all clear enough for you to understand. It is very difficult to explain clearly. Hope this helps
Ha, yes now I understand the q'n too. Zif.
BTW - you didnt clarify and I didnt think about this earlier. Are you running Delphi 3? If not then the above code will not work. I am not sure how to do this in Delphi 2 or even if it can be done at all. I dont think it can.
ASKER
heathprovost, you are right...please paste as answer...
ASKER
heathprovost answer is most correct
Heathprovost: I am impressed!
Cheers,
Raymond.
Cheers,
Raymond.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
A very stupid example and I hope that I understood your question correctly :
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
FTest : String;
public
{ Public declarations }
property test:string read FTest write FTest;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
FTest := 'This is a test';
end;
procedure TForm1.FormActivate(Sender
begin
Caption := Test;
end;
end.
Regards, Zif.