Link to home
Start Free TrialLog in
Avatar of dumper
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..
Avatar of ZifNab
ZifNab

Hi dumper,

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: TObject);
begin
 Caption := Test;
end;

end.

Regards, Zif.
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.GetComment: 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.GetIDString: String;
begin
  // must be unique
  Result := 'FormWizForMyNewForm'
end;

function TMyNewFormExpert.GetMenuText: 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.GetNewModuleAndClassName ('MyNewForm', ModuleName, FormName, FileName);
  ModIntf := ToolServices.CreateModuleEx (FileName, FormName, 'MyNewForm', '',
  nil, nil,    [cmNewForm, cmAddToProject, cmUnNamed]);
  ModIntf.ShowSource;
  ModIntf.ShowForm;
  ModIntf.Release;
end;

procedure Register;
begin
  RegisterLibraryExpert(TMyNewFormExpert.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
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.
Avatar of dumper

ASKER

heathprovost, you are right...please paste as answer...
Avatar of dumper

ASKER

heathprovost answer is most correct
Heathprovost: I am impressed!

Cheers,

Raymond.
ASKER CERTIFIED SOLUTION
Avatar of heathprovost
heathprovost
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial