控制uniFrame显示的一个管理类
对此,我实现了一个类,来管理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
赠金笔
控制uniFrame显示的一个管理类的更多相关文章
- XMPP得知--建立一个管理类
参考其他demo之后,设立一个管理类的发现看起来更舒服,理-- 但在建立与server连接其中.发现 Connect Error: { NSLocalizedDescription = &qu ...
- jQuery 二级菜单,一次显示一个小类 鼠标点击显示小类
jQuery 二级菜单,一次显示一个小类 鼠标点击显示小类 本例有另外2个关联案例,演示地址分别为2.php,3.php 演示 XML/HTML Code <div class="ar ...
- /.nav-tabs :是普通标签页 .nav-pills:胶囊式标签页 action ;默认的激活项,给<li>加默认显示的是哪个标签页内容 .nav是标签页的一个基类,给ul加 .nav-stacked: 垂直排列BootStrap
<meta name="viewport" content="with=device-width, initial-scale=1, user-scalabe=no ...
- 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 ...
- 定义一个Person类,其中包括:1.定义属性:姓名、年龄、民族作为成员变量。定义静态成员变量:人数2.定义构造方法:对成员变量进行初始化。3.定义多个方法:分别显示相应的属性值,例如getName(){System.out.print("名称="+name+";"); }4.定义一个方法“成长”:实现年龄的增加,每执行一次年龄增加1
题目显示不全,完整题目描述: (1)定义一个Person类,其中包括:1.定义属性:姓名:年龄:民族作为成员变量.定义静态成员变量:人数2.定义构造方法:对成员变量进行初始化.3.定义多个方法:分别显 ...
- 创建一个圆类Circle的对象,分别设置圆的半径计算并分别显示圆半径、圆面积、圆周长。
编写一个圆类Circle,该类拥有: ①一个成员变量 Radius(私有,浮点型): // 存放圆的半径: ②两个构造方法 Circle( ) // 将半径设为0 Circle(double r ) ...
- C++ 封装类 2 设计一个学生类 属性有姓名学号 可以给姓名 和学号赋值 可以显示学生的姓名和学号
1 //设计一个学生类 属性有姓名学号 可以给姓名 和学号赋值 可以显示学生的姓名和学号 2 #include <iostream> 3 #include<string> 4 ...
- 【Unity3D游戏开发】之全局管理类的几种方式 (十六)
如何在Unity中实现全局管理类?由于Unity脚本的运行机制和面向组件编程(COP)的思想,实现起来和普通的方式略有差别. 第一种方式是使用静态类.适合存储一些全局的变量,如游戏当前关卡.玩家得分等 ...
- 【转】【Unity】实现全局管理类的几种方式
本文原作者未知,转载自:http://blog.csdn.net/ycl295644/article/details/42458477 如何在Unity中实现全局管理类?由于Unity脚本的运行机制和 ...
随机推荐
- 离线在MVC4中的使用
最近在项目中用到了离线功能,自己感觉挺高端的,但是遇到了一些问题. 现在工作告一小段落,就把这次离线工作中遇到的关键技术点和难题记录下来. 什么是离线,什么时候需要离线 离线:Offline,不联网也 ...
- Vuebnb 一个用 vue.js + Laravel 构建的全栈应用
今年我一直在写一本新书叫全栈Vue网站开发:Vue.js,Vuex和Laravel.它会在Packt出版社在2018年初出版. 这本书是围绕着一个案例研究项目,Vuebnb,简单克隆Airbnb.在这 ...
- activiti 清库脚本(转)
在使用activiti 的时候会经常遇到需要清空数据库中的数据,因此本文重点讲解如何解决该问题. 再删除数据的时候,需要注意有主外键约束的问题?下面罗列的DDL可以结合自身的业务需求进行灵活改造. D ...
- 解决textarea 输出有空格问题
我们在使用textarea标签输出的时候,经常会出现前后都有空格.使用trim()处理也不行. 这个原因是因为 我们在编写textarea标签对的时候使用了换行. 解决方法:就是<textare ...
- “matplotlib display text must have all code points < 128 or use Unicode strings”解决方法
import sys reload(sys) sys.setdefaultencoding('utf-8') 插入以上代码,便可解决.
- Mybatis简介、环境搭建和详解
简介: 1.Mybatis 开源免费框架,原名叫iBatis,2010在google code,2013年迁移到github 2.作用: 数据访问层框架 2.1 底层是对JDBC的封装 3.myb ...
- 【RabbitMQ】三种类型交换器 Fanout,Direct,Topic(转)
出处:https://blog.csdn.net/fxq8866/article/details/62049393 RabbitMQ服务器会根据路由键将消息从交换器路由到队列中,如何处理投递到多个队列 ...
- ES6通过使用babel兼容到ie9
1.打开这个地址: https://unpkg.com/babel-standalone@6/babel.min.js 新建babel.min.js,把代码复制进去,然后在jq项目里引用. 2.在下面 ...
- 常用.bat
休眠.bat rundll32 powrprof.dll,SetSuspendState 常用.bat start /d "d:\Program Files (x86)\Tencent\T ...
- java常用设计模式九:桥接模式
一.概述 将抽象部分与它的实现部分分离,使它们都可以独立地变化.它是一种对象结构型模式.比如存在2个维度,第一个维度有一个抽象类A和对应的子类A1和A2:第二个维度有另一个接口B和对应的子类B1和B2 ...