• 控制uniFrame显示的一个管理类


    控制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) ┊ 喜欢 打印举报
    已投稿到:
     
  • 相关阅读:
    kettle入门(四) 之kettle取昨天时间&设置任意时间变量案例
    用法
    Win10任务计划调度执行kettle作业
    Kettle 合并记录和Merge Join组件实现数据增量迁移(数据同步比插入更新快)
    鼠标右键新建没有excel
    python的to_sql
    leetcode1105 Filling Bookcase Shelves
    leetcode96 Unique Binary Search Trees
    leetcode111 Minimum Depth of Binary Tree
    leetcode128 Longest Consecutive Sequence
  • 原文地址:https://www.cnblogs.com/westsoft/p/9250327.html
Copyright © 2020-2023  润新知