• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 259
  • Last Modified:

Dynamic Creation of Objects

I need to create DYNAMICALLY some objects within other objects. The pseudocode I want goes something like this:

// on click of a button

For iLoop := 1 to iNoOfPanelsToDo do
begin
  // Create a panel
  // give it a cyclic name ('panel001')
  // set its size and location on the form by Top := iLoop*20 etc.
  // Create a child panel on the above panel
  // give it a cyclic name ('innerpanel001')
  // set its size and location on the form
  // Create a button on the innerpanel
  // Attach procedure 'InnerButtonPressed' to the button's OnClick event
end;

I've stumbled through the Delphi Help but I cant seem to find anything like this in terms I've guessed to put in the search, yet I suspect it is something the more experienced Delphi people will know like the back of their hand. I did it before ages ago; all I can remember is the bit about accessing the dynamically-created components by name with FindComponent.

Sample code is best; I learn well from plagiarism; oops, I mean example.

Martin C  

0
MartinC
Asked:
MartinC
  • 4
  • 3
2 Solutions
 
kretzschmarCommented:
var
  pi, po : TPanel;
  bt : TButton;
  i : integer;
begin
  for i := 1 to howmanyyouneed do
  begin
    po := TPanel.Create(self);
    with po do
    begin
       top := SomeOffset * i;
       left := whatUNeedHere;
       name := YourPrefix+inttostr(i); //usually name is not needed
       parent := self;
       //maybe more
       show; //maybe not needed
   end;
    pi := TPanel.Create(self);
    with pi do
    begin
       top := whatUNeedHere;
       left := whatUNeedHere;
       parent := po;
       //maybe more
       show; //maybe not needed
   end;
    bt := TButton.Create(self);
    with bt do
    begin
       top := whatUNeedHere;
       left := whatUNeedHere;
       parent := pi;
       onClick := YourPredefinedClickProc;
       //maybe more
       show; //maybe not needed
   end;
  end;
end;

just from head

meikl ;-)

0
 
MartinCAuthor Commented:
Meikl:

I got all that to work - thx! - except the line:

 onClick := YourPredefinedClickProc;

which says "[Error] uAssetFacet.pas(67): Incompatible types: 'method pointer and regular procedure'" ... I presume there is some way I am not defining the procedure ... I wrote it as:

procedure YourPredefinedClickProc;
begin
  beep;
  beep;
  beep;
end;

... and I have no idea where I am supposed to store its top line:

procedure YourPredefinedClickProc;

... which I cuurently have above the form's type declaration:

type
  TfrmAssetFacet = class(TForm)

... any idea where it should go?

 
0
 
kretzschmarCommented:
well, glad to hear

about the error you get

redefine your proc to

procedure TFormClassName.YourPredefinedClickProc(Sender : TObject);
begin
  beep;
  beep;
  beep;
end;

you may notice TFormClassName
this means you should declare this procedure within your formtype like

type
  TfrmAssetFacet = class(TForm)
     .....
   private //could also public
     procedure YourPredefinedClickProc(Sender : TObject);
     ......
   end;

so that your proc becomes

procedure TfrmAssetFacet.YourPredefinedClickProc(Sender : TObject);
begin
  beep;
  beep;
  beep;
end;

hope you get it work

meikl ;-)
0
Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
MartinCAuthor Commented:
I tried that before ... I have the declaration like this:

type
  TfrmAssetFacet = class(TForm)
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure YourPredefinedClickProc;
  end;

... then in the code I have:

       onClick := YourPredefinedClickProc;

... and later I have:

procedure TfrmAssetFacet.YourPredefinedClickProc;
begin
  beep;
  beep;
  beep;
end;

... but the compiler says:

[Error] uAssetFacet.pas(68): Incompatible types: 'Parameter lists differ'

... any clues?
0
 
kretzschmarCommented:
an easy one (you just not read my comment carfully ;-)

replace this
procedure TfrmAssetFacet.YourPredefinedClickProc;
begin
  beep;
  beep;
  beep;
end;

with
procedure TfrmAssetFacet.YourPredefinedClickProc(Sender : TObject);  //just add the sender
begin
  beep;
  beep;
  beep;
end;

hope now you get it work

meikl ;-)
0
 
ZhaawZSoftware DeveloperCommented:
don't forget to add sender also in public declaration of procedure ;)

  public
    { Public declarations }
    procedure YourPredefinedClickProc(Sender : TObject);
0
 
kretzschmarCommented:
good point, ZhaawZ, overlooked this
0
 
MartinCAuthor Commented:
Sorry, normally I am a good copier but I missed that one. I've increased the points a bit (60 to 100) and chucked a tidbit to ZhaawZ for his correction, which no doubt would have tripped me up too.

Martin
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Cloud Class® Course: Amazon Web Services - Basic

Are you thinking about creating an Amazon Web Services account for your business? Not sure where to start? In this course you’ll get an overview of the history of AWS and take a tour of their user interface.

  • 4
  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now