控制uniFrame显示的一个管理类

(2016-03-29 06:41:17)

标签:

delphi

分类: uniGUI
利用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就方便多了。

分享:

 

0

喜欢

0

赠金笔

 
阅读(679)┊ 评论 (0)┊ 收藏(0) ┊转载(2) ┊ 喜欢 ┊打印举报
已投稿到:
 

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

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

    参考其他demo之后,设立一个管理类的发现看起来更舒服,理-- 但在建立与server连接其中.发现 Connect Error: {     NSLocalizedDescription = &qu ...

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

    jQuery 二级菜单,一次显示一个小类 鼠标点击显示小类 本例有另外2个关联案例,演示地址分别为2.php,3.php 演示 XML/HTML Code <div class="ar ...

  3. /.nav-tabs :是普通标签页 .nav-pills:胶囊式标签页 action ;默认的激活项,给<li>加默认显示的是哪个标签页内容 .nav是标签页的一个基类,给ul加 .nav-stacked: 垂直排列BootStrap

    <meta name="viewport" content="with=device-width, initial-scale=1, user-scalabe=no ...

  4. Android 性能优化(16)线程优化:Creating a Manager for Multiple Threads 如何创建一个线程池管理类

    Creating a Manager for Multiple Threads 1.You should also read Processes and Threads The previous le ...

  5. 定义一个Person类,其中包括:1.定义属性:姓名、年龄、民族作为成员变量。定义静态成员变量:人数2.定义构造方法:对成员变量进行初始化。3.定义多个方法:分别显示相应的属性值,例如getName(){System.out.print("名称="+name+";"); }4.定义一个方法“成长”:实现年龄的增加,每执行一次年龄增加1

    题目显示不全,完整题目描述: (1)定义一个Person类,其中包括:1.定义属性:姓名:年龄:民族作为成员变量.定义静态成员变量:人数2.定义构造方法:对成员变量进行初始化.3.定义多个方法:分别显 ...

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

    编写一个圆类Circle,该类拥有: ①一个成员变量 Radius(私有,浮点型): // 存放圆的半径: ②两个构造方法 Circle( ) // 将半径设为0 Circle(double r ) ...

  7. C++ 封装类 2 设计一个学生类 属性有姓名学号 可以给姓名 和学号赋值 可以显示学生的姓名和学号

    1 //设计一个学生类 属性有姓名学号 可以给姓名 和学号赋值 可以显示学生的姓名和学号 2 #include <iostream> 3 #include<string> 4 ...

  8. 【Unity3D游戏开发】之全局管理类的几种方式 (十六)

    如何在Unity中实现全局管理类?由于Unity脚本的运行机制和面向组件编程(COP)的思想,实现起来和普通的方式略有差别. 第一种方式是使用静态类.适合存储一些全局的变量,如游戏当前关卡.玩家得分等 ...

  9. 【转】【Unity】实现全局管理类的几种方式

    本文原作者未知,转载自:http://blog.csdn.net/ycl295644/article/details/42458477 如何在Unity中实现全局管理类?由于Unity脚本的运行机制和 ...

随机推荐

  1. BZOJ 2733 [HNOI2012]永无乡 - 启发式合并主席树

    Description 1: 查询一个集合内的K大值 2: 合并两个集合 Solution 启发式合并主席树板子 Code #include<cstdio> #include<cst ...

  2. TCHAR函数查询

    https://blog.csdn.net/is2120/article/details/27542927

  3. Python之路(第二篇):Python基本数据类型字符串(一)

    一.基础 1.编码 UTF-8:中文占3个字节 GBK:中文占2个字节 Unicode.UTF-8.GBK三者关系 ascii码是只能表示英文字符,用8个字节表示英文,unicode是统一码,世界通用 ...

  4. 爬虫初窥day3:BeautifulSoup

    信息提取 1.通过Tag对象的属性和方法 #!/usr/bin/python # -*- coding: utf- -*- from urllib.request import urlopen fro ...

  5. m序列

    产生m序列移位寄存器是一种逻辑电路,1阶,2阶...的电路图各不相同. 一般使用本原多项式计算出各阶数电路图. 一般的多项式为 f(x) = c0 * x^0 + c1 * x^1 + c2 * x^ ...

  6. 转录组表达量计RPKM、FPKM、TPM说明

    在转录组测序(RNA-Seq)中,基因的表达量是我们关注的重点.基因表达量的衡量指标有:RPKM.FPKM.TPM. RPKM:Reads Per Kilobase Million:说实话,这个英文说 ...

  7. 【搜索】 Prime Path

    #include<cstdio> #include<cstring> #include<cmath> #include<queue> #include& ...

  8. 859. Buddy Strings

    class Solution { public: bool buddyStrings(string A, string B) { int lenA=A.length(); int lenB=B.len ...

  9. ios 数组和字典

    一.数组.  数组只能存放对象类型的数据  2.数组中的对象是有序的 (index)     (一)可变数组   NSArray:NSObject  不可变数组 作用:容器类 存放的是对象类型的数据, ...

  10. 2018.12.23 bzoj4516: [Sdoi2016]生成魔咒(后缀自动机)

    传送门 samsamsam入门题. 题意简述:给出一个串让你依次插入字符,求每次插入字符之后不同子串的数量. 显然每次的变化量只跟新出现的nnn个后缀有关系,那么显然就是maxlenp−maxlenl ...