怎么关闭用字符串传递名称的窗体

大风吹过脸颊 2022-06-22 01:10:15

我需要用字符串传递窗体名称,并且关闭它(这些窗体是由系统已经自动创建好了的,无需再次手动创建)

以下代码可以用字符串方式打开form2的,但是我的form2已经无需再次创建了,并且我需要的是关闭,请问要怎么写呢?

var
    aform:TForm;
begin
    aform:=TFormClass(FindClass(formClassName)).Create(Application);
    aform.ShowModal;
end;

我改过的写法,会报错。

var
    aform:TForm;
begin
    aform:=TForm(TFormClass(FindClass('TForm2')));
    aform.close;
end;

 

...全文
137 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

找组件,不要找类。
Application.FindComponent
如果没找到
递归向下搜索
Application.Components[i].FindComponent
Application.Components[i].Components[x].FindComponent
...
知道找到或者递归完毕(如果某一级的ComponentCount = 0则返回上一级)

hj8090 2022-06-22
  • 打赏
  • 举报
回复

简单点就把
var aform:TForm;
作为作为全局变量,释放时先判断
if Assigned(aform) then
FreeAndNil(aform);
要不就遍历。

tanqth 2022-06-22
  • 打赏
  • 举报
回复

FMX的窗体处理与VCL的是不同的。

天行归来 2022-06-22
  • 打赏
  • 举报
回复


procedure TForm1.btnCreaeClick(Sender: TObject);
var
  aform:TForm;
begin
  aform:=TFormClass(FindClass('TForm2')).Create(Application);
  aform.Show;
end;

procedure TForm1.btnCloseClick(Sender: TObject);
var
  i: integer;
  formCls: TFormClass;
begin
  i := 0;
  while i<Application.ComponentCount do
  begin
    if (Application.Components[i].ClassName='TForm2') then
    begin
      Application.Components[i].Free;
    end
    else Inc(i);
  end;
end;

hj8090 2022-06-22
  • 打赏
  • 举报
回复

var
aform:TForm;
begin
aform:=TFormClass(FindClass(formClassName)).Create(Application);
aform.ShowModal;
freeandnil(aform);
end;

大风吹过脸颊 2022-06-22
  • 举报
回复
@hj8090 二楼,没看题。不需要创建,系统已经创建过了,我只需要查找并关闭。
tanqth 2022-06-22
  • 举报
回复
@大风吹过脸颊 他也没说错的,你如果使用ShowModal,当这个窗体显示的时候,你不会打开其他窗体的。所以,ShowModal后面就可以是直接释放。

5,927

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧