delphi – 在运行时删除和替换可视组件

delphi – 在运行时删除和替换可视组件,第1张

概述例如,是否可以在运行时使用实例化(有条件地)的子类组件替换和释放TEdit?如果是这样,应该如何以及何时完成?我试图将父设置为nil并在表单构造函数和AfterConstruction方法中调用free(),但在这两种情况下我都遇到了运行时错误. 更具体地说,我遇到了访问冲突错误(EAccessViolation).看起来弗朗索瓦是正确的,因为他说在框架构造中释放组件会使用Form来控制内务管理. 例如,是否可以在运行时使用实例化(有条件地)的子类组件替换和释放TEdit?如果是这样,应该如何以及何时完成?我试图将父设置为nil并在表单构造函数和AfterConstruction方法中调用free(),但在这两种情况下我都遇到了运行时错误.

更具体地说,我遇到了访问冲突错误(EAccessViolation).看起来弗朗索瓦是正确的,因为他说在框架构造中释放组件会使用Form来控制内务管理.

@H_403_5@解决方法 这个更通用的例程可以使用Form或Frame(更新为使用新控件的子类):
function ReplaceControlEx(AControl: TControl; const AControlClass: TControlClass; const ANewname: string; const IsFreed : Boolean = True): TControl;begin  if AControl = nil then  begin    Result := nil;    Exit;  end;  Result := AControlClass.Create(AControl.Owner);  ClonePropertIEs(AControl,Result);// copy all propertIEs to new control  // Result.left := AControl.left;   // or copy some propertIEs manually...  // Result.top := AControl.top;  Result.name := ANewname;  Result.Parent := AControl.Parent; // needed for the InsertControl & RemoveControl magic  if IsFreed then    FreeAndNil(AControl);end;function ReplaceControl(AControl: TControl; const ANewname: string; const IsFreed : Boolean = True): TControl;begin  if AControl = nil then    Result := nil  else    Result := ReplaceControlEx(AControl,TControlClass(AControl.Classtype),ANewname,IsFreed);end;

使用此例程将属性传递给新控件

procedure ClonePropertIEs(const Source: TControl; const Dest: TControl);var  ms: TMemoryStream;  oldname: string;begin  oldname := Source.name;  Source.name := ''; // needed to avoID name collision  try    ms := TMemoryStream.Create;    try      ms.WriteComponent(Source);      ms.position := 0;      ms.ReadComponent(Dest);    finally      ms.Free;    end;  finally    Source.name := oldname;  end;end;

使用它像:

procedure TFrame1.AfterConstruction;var  I: Integer;  NewEdit: TMyEdit;begin  inherited;  NewEdit := ReplaceControlEx(Edit1,TMyEdit,'Edit2') as TMyEdit;  if Assigned(NewEdit) then  begin    NewEdit.Text := 'My Brand New Edit';    NewEdit.Author := 'Myself';  end;  for I:=0 to ControlCount-1 do  begin    ShowMessage(Controls[I].name);  end;end;

注意:如果您在框架的AfterConstruction中执行此 *** 作,请注意托管表单构造尚未完成.释放控件可能会导致很多问题,因为你搞乱了Form控件的内务管理.如果您尝试阅读ShowMessage中显示的新编辑标题,请查看您获得的内容…在那种情况下,你会想要使用… ReplaceControl(Edit1,’Edit2′,False)然后做一个… FreeAndNil(EDIT1)后来.

总结

以上是内存溢出为你收集整理的delphi – 在运行时删除和替换可视组件全部内容,希望文章能够帮你解决delphi – 在运行时删除和替换可视组件所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1279725.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存