控制uniFrame显示的一个管理类

利用uniGUI Frame的机制来搭建项目,是非常好的实现方式,uniGUI的主要Demo就是用这种方式来实现的。
对此,我实现了一个类,来管理Frame的显示。

unit FrameMgn;

interface

uses
  System.Classes, System.Contnrs, System.SysUtils, Vcl.Controls, uniGUIFrame, uniGUIClasses;

type

TFrameManager = class(TComponent)
  private
    FFrameList: TObjectList;
    FActiveFrame: TUniFrame;
    FContainerPanel: TUniCustomContainerPanel;
    procedure SetActiveFrame(const Value: TUniFrame);
    procedure SetContainerPanel(const Value: TUniCustomContainerPanel);
    function GetEditFrameClassName(aClassName: String): string; // 根据给定的参数,返回对应的编辑Frame的类名.
    function GetFrameInstance(aFrameClassName: string): TUniFrame;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure ShowFrame(aClassName: String);
    procedure HideFrame;

property ActiveFrame: TUniFrame read FActiveFrame write SetActiveFrame;
    property ContainerPanel: TUniCustomContainerPanel read FContainerPanel write SetContainerPanel;
  end;

implementation

{ TFrameManager }

uses MainModule;

constructor TFrameManager.Create(AOwner: TComponent);
begin
  inherited;
  FFrameList := TObjectList.Create;
  FFrameList.OwnsObjects := False;
end;

destructor TFrameManager.Destroy;
begin
  FFrameList.Free;
  inherited;
end;

function TFrameManager.GetEditFrameClassName(aClassName: String): string;
var
  cn: String;
begin

Result := aClassName;
  if UniMainModule.UserLoginCode <> ‘‘ then // 如果登录状态
  begin
    cn := aClassName + ‘Edit‘;

if (GetClass(cn) <> nil) and (UniMainModule.FuncList.Locate(‘FAndroid_ClassName‘, cn, [])) then
      Result := cn;
  end;

end;

function TFrameManager.GetFrameInstance(aFrameClassName: string): TUniFrame;
var
  fr: TUniFrame;
  frc: TuniFrameClass;
  I: Integer;
begin

for I := 0 to FFrameList.Count - 1 do
  begin
    if CompareText(FFrameList.Items[I].ClassName, aFrameClassName) = 0 then
    begin
      Result := TUniFrame(FFrameList.Items[I]);
      exit;
    end;
  end;

frc := TuniFrameClass(GetClass(aFrameClassName)); // findClass找不到类会产生异常,所以换用GetClass。
  if frc <> nil then
  begin
    fr := frc.Create(Self.Owner); // frc的Owner必须是TuniForm或TUniFrame
    fr.Name := aFrameClassName.Substring(1);
    FFrameList.Add(fr);
    Result := fr;
  end
end;

procedure TFrameManager.HideFrame;
var
  I: Integer;
  obj: TUniFrame;
begin

if Assigned(ActiveFrame) then
  begin
    ActiveFrame.Parent := nil; // 可以,但urlFrame不显示内容:利用UniURLFrame.URL属性取代HTML属性解决.
    for I := 0 to FFrameList.Count - 1 do
    begin
      // 如果一个Frame需要重建才能正常显示,则利用Frame.Tag=1来标记要重建.
      obj := FFrameList.Items[I] as TUniFrame;
      if obj.Tag = 1 then
      // if FFrameList.Items[I].ClassName = ‘TYangZhiFuWuFrameEdit‘ then
      begin
        FreeAndNil(obj);
        FFrameList.Delete(I);
        exit;
      end;
    end;
  end;

end;

procedure TFrameManager.SetActiveFrame(const Value: TUniFrame);
begin
  FActiveFrame := Value;
end;

procedure TFrameManager.SetContainerPanel(const Value: TUniCustomContainerPanel);
begin
  FContainerPanel := Value;
end;

procedure TFrameManager.ShowFrame(aClassName: String);
var
  fr: TUniFrame;
  frc: TuniFrameClass;
  cn: string;
begin

// 如果当前显示的Frame正是选择要显示的直接退出.
  if Assigned(ActiveFrame) then
    if CompareText(aClassName, ActiveFrame.ClassName) = 0 then
      exit;

HideFrame;

cn := GetEditFrameClassName(aClassName);

fr := GetFrameInstance(cn);
  if fr <> nil then
  begin
    fr.Align := alClient;
    fr.Parent := FContainerPanel;
    ActiveFrame := fr;
  end;

end;

end.

有了这个类,再显示一个Frame就方便多了。

时间: 2024-10-08 11:13:04

控制uniFrame显示的一个管理类的相关文章

XMPP得知--建立一个管理类

参考其他demo之后,设立一个管理类的发现看起来更舒服,理-- 但在建立与server连接其中.发现 Connect Error: {     NSLocalizedDescription = "You must set myJID before calling connect."; } 这种一个问题.知道是jid没有设置好,可是jid怎么设置呢?今天仍然没有弄清.假设有清楚的能够交流一下. 1.将管理类写成单例 static XmppManager *shareManager = N

5、管理类概念

管理类详细信息 管理类是客户机文件和策略之间的关键连接.各客户机节点会分配到一个策略域,并且客户机节点仅对包含在活动策略集中的管理类具有访问权. 管理类指定客户机文件是否迁移到存储池(分层存储管理).这些管理类中的副本组指定保留在服务器存储器中的备份版本的数目,以及保留备份版本和归档副本的时间长度. 管理类的内容 管理类包含备份.归档和空间管理操作的策略(按客户机划分).可通过管理类中的参数来指定TSM FOR space management客户机是否可以将文件迁移到服务器存储器以及迁移的方式

设计一个Bank类,银行某账号的资金往来账管理

设计一个Bank类,实现银行某账号的资金往来账管理,包括建账号.存入.取出等.Bank类包括私有数据成员top(当前指针).date(日期).money(金额).rest(余额)和sum(累计余额).另有一个构造函数和3个成员函数bankinO(处理存入账).bankout()(处理取出账)和disp( )(出明细账). [知识点]:2.2  2.3 [参考分]:25分 [难易度]:B 实现案例: /* 2017年8月19日23:03:58 */ #include<iostream> clas

jQuery 二级菜单,一次显示一个小类 鼠标点击显示小类

jQuery 二级菜单,一次显示一个小类 鼠标点击显示小类 本例有另外2个关联案例,演示地址分别为2.php,3.php 演示 XML/HTML Code <div class="arrowlistmenu"> <h3 class="menuheader expandable">表单</h3> <ul class="categoryitems"> <li><a href="

综合运用类、继承、多态,完成一个公司人员管理类层次结构(未完待续)

1.Target /*综合运用类.继承.多态等技术,完成一个公司人员管理类层次结构,用来描述人员信息等, 重载各种运算符,完成数据库内容的赋值.添加.工资增长等.*/ 2.Code #include <iostream> #include <cstring> #include <string> #include <cstdio> #include<cstdlib> #define TECH const string name, const int

创建一个圆类Circle的对象,分别设置圆的半径计算并分别显示圆半径、圆面积、圆周长。

编写一个圆类Circle,该类拥有: ①一个成员变量 Radius(私有,浮点型): // 存放圆的半径: ②两个构造方法 Circle( ) // 将半径设为0 Circle(double r ) //创建Circle对象时将半径初始化为r ③ 三个成员方法 double getArea( ) //计算圆的面积 double getPerimeter( ) //计算圆的周长 void show( ) //将圆的半径.周长.面积输出到屏幕 编写应用程序,创建类的对象,分别设置圆的半径计算并分别显

Android 显示空页面工具类

做项目肯定会遇到这样的需求,数据加载为空或者数据加载异常时候显示一个空页面给用户: 这篇blog就来实现这样一个简单的封装 1.首先定义一个线性布局 2.然后通过一个工具类来管理这样一个View 先来看自定义的线性布局 public class EmptyLayout extends LinearLayout{ /** * 空页面图片 */ private ImageView emptyImg; /** * 空页面文本 */ private TextView emptyTv; /** * 空文字

Egret场景切换管理类切换和单例使用方法

场景切换是很多开发者在开发过程中必不可少的一个环节,当项目中有两个或两个以上的游戏场景时,怎样管理这些场景,能够使它们之间的切换更加方便呢?今天就为大家介绍场景切换管理类的切换方法和单例的使用方法. 案例源码:https://github.com/hkjlx/qhcj 首先创建一个所有场景的父类Scene Scene类主要是为了方便管理场景,此类是一个抽象类,子类必须继承此类并实现onComplete()抽象方法才能进行场景的切换. abstract class Scene extends eu

DownloadManager 下载管理类

演示 简介 从Android 2.3开始新增了一个下载管理类,在SDK的文档中我们查找android.app.DownloadManager可以看到.下载管理类可以长期处理多个HTTP下载任务,客户端只需要给出请求的Uri和存放目标文件的位置即可,下载管理使用了一个AIDL服务器,所以可以放心的在后台执行,同时实例化的方法需要使用getSystemService(Context.DOWNLOAD_SERVICE) ,我们可以轻松的通过新增的这个API实现Android平台上的文件下载操作. Do