Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 196
  • Last Modified:

Simple question

Hi there,

How can I create objects (say buttons) at runtime? Normally, we create buttons by this syntax:
NEWBTN:=TButton.Create(Self);

But now I want the buttons to be created only when the user requests, and the names of the buttons are specified by the user, say through Edit1.Text

Two problems:
1. How can I create a button with the name given by the user?
2. Later, the user will give another name in Edit2.Text, how can I search whether there is a button with the name matched with Edit2.Text? If that button exists, how can I delete it?
0
nyt
Asked:
nyt
  • 3
  • 3
  • 3
  • +3
1 Solution
 
DrDelphiCommented:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    BtnArray:array of Tbutton;
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetLength(btnarray,length(btnArray)+1);
  btnarray[length(btnarray)-1]:=Tbutton.create(self);
  with btnarray[length(btnarray)-1]do
  begin
    Top:=10;
    Caption:='DrDelphi';
    OnClick:=ClickHandler; //event handler
    Parent:=self;///very important to see the button!!
    name:='Button3';
  end;


  end;

procedure TForm1.Button2Click(Sender: TObject);
var But:Tcomponent;
begin
   but:=FindComponent('Button3');
   if but<>nil then FreeandNil(but);
end;

end.




Good luck!!
0
 
robert_marquardtCommented:
You will have to set the Parent of the button or it will not show up.
You can simply assign the Name property of the button like any other property.
Form.Components and Form.ComponentCount allows to iterate all components on the Form.
0
 
lightblueCommented:
about the second problem:

...
var
  I: Integer;
  Temp: TComponent;
begin
  for I := Form1.ComponentCount - 1 downto 0 do
  begin
    Temp := Form1.Components[I];
    if Temp is TButton then
    if Temp.Name = Edit2.Text then
    begin
      TButton(temp).Free;
    end;
  end;
end;
...
0
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
DrDelphiCommented:
I addressed both the parent issue and the freeing of the button in my code. Plerase try it out and see if it is not what you're looking to do.


0
 
ginsonicCommented:
var UserChoice:string;
......
NEWBTN:=TButton.Create(Self);
NEWBTN.Caption:=UserChoice;
.....


procedure TForm1.Button1Click(Sender: TObject);
var
 i:integer;
 Component : TComponent;
 z:string;
begin
i:=0;
while i<ComponentCount do
  begin
    Component := Components[i];
    if (Component is TButton) then begin
     if ((Component as TButton).Caption='Button2') then
      begin
        (Component as TButton).Free;
        i:=ComponentCount;
        end
       else
         inc(i);
      end
     else
       inc(i);
  end;
end;
0
 
nytAuthor Commented:
DrDelphi,
Do you write your code in D5 or D6? My D4 can't compile them.
Undeclared identifier: 'ClickHandler'
Undeclared identifier: 'FreeandNil'
0
 
nytAuthor Commented:
DrDelphi,
Do you write your code in D5 or D6? My D4 can't compile them.
Undeclared identifier: 'ClickHandler'
Undeclared identifier: 'FreeandNil'
0
 
nytAuthor Commented:
Well...after seeing all the comments, I finally solved the problem.

Here is a new problem: how can I add something to the onClick event (and other events) of those newly created buttons?  Say, I want ShowMessage('testing') when the buttons are clicked.

More points will be added according to the complexity of the answers.
0
 
slaviknCommented:
That's what DrDelphi wrote:

with btnarray[length(btnarray)-1]do
 begin
   Top:=10;
   Caption:='DrDelphi';
   OnClick:=ClickHandler; //event handler
   Parent:=self;///very important to see the button!!
   name:='Button3';
 end;

You should write this code:

with btnarray[length(btnarray)-1]do
 begin
   Top:=10;
   Caption:='DrDelphi';
   OnClick:=ClickHandler; //event handler
   Parent:=self;///very important to see the button!!
   name:='Button3';
   OnClick:=MyBtnClick;   { !!!!!! }
 end;

procedure MyBtnClick(Sender As TButton);
begin
 showmessage('this is a test');
end;
0
 
slaviknCommented:
Sorry,

procedure MyBtnClick(Sender As TButton);
  should be
procedure MyBtnClick(Sender: TButton);
0
 
slaviknCommented:
I mean that
   OnClick:=MyBtnClick;
      comes instead of
   OnClick:=ClickHandler;

So the final answer is:

with btnarray[length(btnarray)-1]do
begin
  Top:=10;
  Caption:='DrDelphi';
  Parent:=self;
  name:='Button3';
  OnClick:=MyBtnClick;
end;

procedure MyBtnClick(Sender As TButton);
begin
  showmessage('this is a test');
end;
0
 
DrDelphiCommented:
The assumption was that ClickHandler is a procedure to handle the OnClick event of the button. As for FreeAndNil, that came into being in Delphi 5... for D4, use Free and then Obj:=nil (whre obj is a pointer to the button).

Good luck!!
0

Featured Post

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

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