更具体地说,我遇到了访问冲突错误(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 – 在运行时删除和替换可视组件所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)