选择在运行时创建的组件

时间:2017-12-12 14:07:13

标签: delphi

我想做什么:

我在跑步时创建了一个面板,2个编辑区,一个radiobox。 当我点击RadioButton Edit1时,我希望Edit1字段可见,Edit2字段已显示 单击RadioButton Edit2后反转。

但它不起作用我可能误解了一些东西。 你有什么想法吗?

procedure CreationPanel(L,T,H,W:integer;Nom,Titre:string
                    {MyPanel:TPanel});                     
begin

MyPanel:=TPanel.Create(Form1);
with MyPanel do
begin
Height:=H;
Left:=L;
Width:=W;
Top:=T;
BorderStyle:=bsSingle;
BevelWidth:=3;
BevelOuter:=bvRaised;
Parent:=Form1;
Visible:=True;
TabOrder:=-1;
TabStop:=False;
Tag:=100;
Name:=Nom;
Caption:=Nom;
end;
end;

procedure Creation_Edit(L,T,FontSize:integer;
                      NomComp,NomPanel:String;
                      Bool:Boolean
                      {MyPanel:Tpanel});
begin  
MyEdit:=TEdit.Create(MyPanel);
with MyEdit do
begin
Parent:=MyPanel;
  {Relation Table Dossier avec Table Bezeichnung}
Height :=21 ;
Left :=L ;
Top :=T ;
Width :=100;
Name:=NomComp;
Font.Name:='MS Sans Serif';
Font.Size:=FontSize;
Visible:=Bool;
end;
end;

procedure Creation_RadioGroup(L,T,H,W,FontSize:integer;
                                    RGName,NomPanel:string
                                    {MyPanelRG:TPanel});
begin  
MyRadioGroup:=TRadioGroup.Create(MyPanel);
with MyRadioGroup do
begin
Parent:=MyPanel;           
Height :=H ;
Left :=L ;
Top :=T ;
Width :=W;
Font.Name:='MS Sans Serif';
Name:=RGName;
Font.Size:=FontSize;
Items.Add('Edit1);
Items.Add('Edit2');
ItemIndex:=0;
OnClick:=Form1.RadioGroupClick;
end;
end;

procedure TForm1.RadioGroupClick(Sender: TObject);
var
E1,E2:TEdit;

begin {1}
E1:=TEdit(FindComponent('Edit1'));
E2:=TEdit(FindComponent('Edit2'));
E1:=TEdit.Create(MyPanel);
E2:=TEdit.Create(MyPanel);

if E1=nil then showmessage('E1=Nil');
if E2=nil then showmessage('E2=Nil');
If MyRadioGroup.Name='RD1' then {with TEDIT}
begin {If}
If Assigned(E1) and Assigned(E2)  then
begin {2}
 Case MyRadioGroup.ItemIndex of
     0: begin
          E1.Visible:=true;
          E2.Visible:=False;
        end;
     1:begin
          E1.Visible:=False;
          E2.Visible:=true;
       end;
  end;{Case}
end;{2}
end;{If}
end;{1}

procedure TForm1.FormCreate(Sender: TObject);
begin

 {Pannel Left,Top,Hieght,Width}
 CreationPanel(80,100,300,180,'Panel1','Panel 1');
 Creation_Edit(30,184,10,'Edit1','Panel1',true);
 Creation_Edit(30,234,10,'Edit2','Panel1',false);
  {RadioGroup Left,Top,Height,Width,FontSize,Tab}
 Creation_RadioGroup(30,12,90,120,12,'RD1','Panel1');

end;
end.     

1 个答案:

答案 0 :(得分:2)

确定您的代码完全混乱,但我可以告诉您底层问题是什么(即导致您提出问题的问题。)

首先,Nasreddine是正确的删除

E1:=TEdit.Create(MyPanel);
E2:=TEdit.Create(MyPanel);

这是一个完全挣扎(尝试任何事情)的尝试,因为E1和E2返回nil。

你不应该试图阻止他们为零。相反,你应该问问自己为什么他们是零。

答案是,Edit1和Edit2不归Form1所有。它们归MyPanel所有。

MyEdit:=TEdit.Create(MyPanel);

所以你的代码应该是

procedure TForm1.RadioGroupClick(Sender: TObject);
var
  E1,E2:TEdit;

begin {1}
  E1:=TEdit( MyPanel.FindComponent('Edit1'));
  E2:=TEdit(MyPanel.FindComponent('Edit2'));

  if E1=nil then showmessage('E1=Nil');  
  if E2=nil then showmessage('E2=Nil');
  //etc...
end;{1}