Delphi ShowModal模态窗体中拖放组件无法获取控件最新值问题
问题根因
你代码的核心问题是TmyPanel.Drop方法中硬编码引用了Unit2的全局变量Form2,但你实际弹出的模态窗体是Unit1.Button1Click中创建的局部变量aForm实例,两个变量指向的不是同一个对象,自然无法读取到当前模态窗体的最新控件值。
Delphi 会给每个窗体单元默认生成一个同名全局变量,仅当你在项目选项中将对应窗体设置为「自动创建」时,这个全局变量才会自动指向实例化的窗体对象。你手动调用TForm2.Create(Nil)创建的模态窗体,不会自动赋值给全局Form2变量,此时全局变量要么为空,要么指向历史创建的旧实例,所以你读取到的都是旧值。
主窗体场景下逻辑正常,就是因为主窗体默认是自动创建的,全局变量和实际运行的实例完全一致。
修复方案
推荐使用第二种方案,避免全局变量依赖,稳定性更高:
方案1:创建模态窗体时同步赋值全局变量
修改Unit1中按钮点击的逻辑,创建窗体时给全局Form2赋值,窗体销毁前清空变量避免野指针:
procedure TForm1.Button1Click(Sender: TObject); Var aForm: TForm2; Begin aForm := TForm2.Create(Nil); Try Form2 := aForm; aForm.ShowModal; Finally Form2 := nil; aForm.Free; End; End;
方案2:从控件层级获取所属窗体实例(更安全)
修改TmyPanel.Drop方法,不要硬编码引用全局变量,通过控件的父层级获取所属的窗体实例:
procedure TmyPanel.Drop(const FileNames: array of string); Var i: Integer; OwnerForm: TForm2; begin OwnerForm := GetParentForm(Self) as TForm2; if not Assigned(OwnerForm) then Exit; for i := 0 to Length(FileNames)-1 do ShowMessage(OwnerForm.Label1.Caption + ': ' + FileNames[i]); end;
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

