繁体   English   中英

(Delphi FMX)如何在TabControl.TabItem内部刷新框架对象而又不失去对窗口的控制?

[英](Delphi FMX) How can I refresh my Frame Object inside a TabControl.TabItem without losing control of the window?

此应用程序最初旨在Windows环境。

虽然仅在下面提到的链接上使用了初始代码,但是我不得不替换掉代码以接受TabControls / TabItems(FMX),而没有使用下面链接中的PageControls / TabSheet(VCL)。 旨在创建具有在TabItem内部重建内容的框架(释放自身,然后在过程内部使用Construct / Create对象方法)。

embarcadero.com(用框架替换TabSheets-Dan Miser)

自从从Delphi Seattle 10开始使用Frames时,每次使用tiframe1时,我就习惯了动态使用它们的能力。 这是方法之一。 (问题发生在frame.Free处;)这种方法导致应用程序不响应移动Window或Exit / Close或与Window层(包括菜单栏)有关的任何事情。

这与TFrames最初是为VCL制作的事实有关吗?

项目1.dpr

program Project1;

uses
  System.StartUpCopy,
  FMX.Forms,
  Unit1 in 'Unit1.pas' {Form1},
  frame1 in 'frame1.pas' {tiframe1: TFrame};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

单位1

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.TreeView,
  FMX.Layouts, FMX.Controls.Presentation, FMX.StdCtrls, FMX.TabControl, FMX.Edit;

type
  TForm1 = class(TForm)
    TabControl1: TTabControl;
    TabItem1: TTabItem;
    TabItem2: TTabItem;
    procedure FormCreate(Sender: TObject);
    procedure RefreshFrame();

  private
    { Private declarations }
    procedure CreateFrame(ATabitem: TTabItem);

    function GetFrame(ATabitem: TTabItem): TFrame;
  public
    { Public declarations }

  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

uses frame1;

type
  TFrameClass = class of TFrame;

procedure TForm1.FormCreate(Sender: TObject);
begin
  TabItem1.Tag := Integer(Ttiframe1);
  CreateFrame(TabItem1);
end;

function TForm1.GetFrame(ATabitem: TTabItem): TFrame;
begin
  if not Assigned(ATabitem) then
    ATabitem := TabControl1.ActiveTab;
  Result := nil;
  if Assigned(ATabitem) and (ATabitem.ControlsCount > 0) and (ATabitem.Controls[0] is TFrame) then
    Result := TFrame(ATabitem.Controls[0]);
end;

procedure TForm1.CreateFrame(ATabitem: TTabItem);
var
  frame: TFrame;
begin
  if GetFrame(ATabitem) = nil then
    if ATabitem.Tag <> 0 then
    begin
      frame := TFrameClass(ATabitem.Tag).Create(Self);
      frame.Parent := ATabitem;
    end;
end;

procedure TForm1.RefreshFrame();
var
  frame: TFrame;
begin
  if Assigned(FindComponent('tiframe1')) then // 
  begin
    frame := FindComponent('tiframe1') as TFrame;
    frame.Free;  //This is the cause of all the problems
    frame := Ttiframe1.Create(Self);
    frame.Parent := TabControl1;
  end;
end;

end.

并且不要忘记创建一个Frame并使用Construct / Create以及在底部(在“ end。”之前)创建一个RegisterClass。

unit frame1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.TabControl, FMX.Forms, FMX.Layouts, FMX.Dialogs,
  FMX.StdCtrls, FMX.Graphics, FMX.Controls.Presentation, FMX.Memo, FMX.Edit;

type
  Ttiframe1 = class(TFrame)
    Button1: TButton;

    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }

  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
  end;

implementation

{$R *.fmx}

uses Unit1;

procedure Ttiframe1.Button1Click(Sender: TObject);
begin
  Form1.RefreshFrame();
end;

constructor Ttiframe1.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
end;

initialization
  RegisterClass(Ttiframe1);

end.

现在,我还希望查看是否可以重新渲染TabItem来显示任何新的或更新的内容(以Refresh或Application.ProcessMessages方法显示),其方式类似于Frame中的Constructor,从而影响诸如TLabel的元素.Text甚至TEdit.Text。 在构造内部,我可以从数据库动态获取数据。

替换的原因是,当在我应该使用RefreshFrame的框架内,Frame内,TabItem内或其他地方使用(TTreeView)时,会引起类似的情况,而没有已知的原因使注意力/焦点从MainForm窗口移开。

我知道这只是一些演示问题的代码,因此我不会在代码中出现其他怪异之处,而是将重点放在您描述的问题上。

问题在于按钮的OnClick处理程序释放了框架,因此按钮和处理程序返回到不存在的按钮。

为避免这种情况,您可以执行以下任一操作

  • 重新设计,以便OnClick处理程序不会释放框架(因此不会释放按钮)
  • 使用您自己定义的Windows消息(因为平台是Windows),按钮将消息发布到表单,并在表单收到该消息时调用RefreshFrame
  • 使用按钮启用的1 ms TTimer ,并从其OnTimer事件中调用RefreshFrame ,该事件中的计时器也被禁用

想法是按钮OnClick处理程序可以在框架和按钮销毁之前完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM