DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: liy187
今日帖子: 13
在线用户: 9
导航: 论坛 -> 文档资料 斑竹:liumazi,ruralboy  
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2014/12/1 19:48:07
标题:
Delphi/FireMonkey移动开发弹出式窗口编程 浏览:10796
加入我的收藏
楼主: 一、引言
    由于移动开发时多Form的开销较大、且新开Form界面上往往是全屏覆盖主窗口,所以一般移动开发时使用Frame、Panel等控件来模拟新窗口,是很多设计者所采用的方法。
    但是,由于Frame、Panel等控件离一个标准的Form还是有一些距离,要模拟得到位还是有一定的技巧性和工作量,而且,当需要模拟的Form很多时,会给设计者带来主窗体所在单元界面设计与代码编写上的复杂性,内容多不容易组织好。
    在此,给出本人最近所设计的一个弹出窗口管理控件TPopupManager控件的源码,以及相关演示程序的源码,欢迎评议与指正。

二、TPopupManager控件
    此控件主要功能是基于App的主界面Form对所有弹出式窗口模块进行统一的模拟、管理、切换、撤销等,使用此控件后,应用程序员可以很方便地将设计好的Frame对象以弹出窗口的形式进行展现、运行。下面是控件的属性、事件、方法说明:

事件说明:
   //
   // 当首个弹出窗口显示、主窗体失去控制权时激发的事件(可以在此屏蔽主窗口控件)...
   TDisableMainFormEvent=procedure(Sender: TObject) of Object;
   //
   // 当所有的弹出窗体关闭、主窗体恢复控制权时所激发事件(可在此取消屏蔽主窗口控件)...
   TRestoreMainFormEvent=procedure(Sender: TObject) of Object;
   //
   // 当一个弹出窗口显示时激发的事件...
   TShowPopupEvent=procedure(Sender: TObject; aPopup: TFrame) of Object;
   //
   // 当一个弹出窗口因硬回退试图关闭时激发的事件(可以控制是否允许关闭)...
   TClosePopupQueryEvent=procedure(Sender: TObject; aPopup: TFrame; var AllowClose: boolean) of Object;
   //
   // 当隐藏弹出式窗口时激发的事件...
   THidePopupEvent=procedure(Sender: TObject; aPopup: TFrame) of Object;
   //
   // 当要释放一个弹出窗口实例时激发的事件(可以在此读取对象内部全局变量以作处理)...
   TFreePopupEvent=procedure(Sender: TObject; aPopup: TFrame) of Object;

方法说明:
   //
   // 构造方法...
   Constructor Create(AOwner: TComponent); override;
   //
   // 析构方法...
   Destructor Destroy(); override;
   //
   // 在指定的屏幕位置(x,y)弹出一个窗口实例...
   procedure ShowPopup(aPopup: TFrame; x,y: integer);
   //
   // 关闭一个窗口实例...
   procedure HidePopup(aPopup: TFrame);
   //
   // 取当前分级弹出的窗口数...
   function QueuingPopupCount(): integer;
此帖子包含附件:
JPEG 图像
大小:50.9K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2014/12/1 19:49:29
1楼: 三、控件源码
//
//----------
//          
//          
//    QuickBurro Middleware Application Development Package for FireMonkey      
//          
//    Version 4.37          
//    Update Date: 2014.11.30.          
//    Author: Jopher(W.G.Z.)          
//    QQ: 779545524  
//    QQ groups: 79114999,18594635       
//    Email: Jopher@189.cn  
//    Homepage: http://www.quickburro.com/ ;         
//          
//    Copyright(C) Jopher Software Studio,2006-2014. All rights reserved   
//    (樵夫工作室版权所有,如有引用,请注明来源)          
//          
//----------
//
unit Fmx.PopupManager;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  {$IFDEF VER280}
  System.Messaging,
  {$ELSE}
  FMX.Messages,
  {$ENDIF}
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Layouts,
  FMX.Memo, FMX.StdCtrls, FMX.Objects, FMX.Effects, FMX.Filter.Effects;

type
   TDisableMainFormEvent=procedure(Sender: TObject) of Object;
   TRestoreMainFormEvent=procedure(Sender: TObject) of Object;
   TShowPopupEvent=procedure(Sender: TObject; aPopup: TFrame) of Object;
   TClosePopupQueryEvent=procedure(Sender: TObject; aPopup: TFrame; var AllowClose: boolean) of Object;
   THidePopupEvent=procedure(Sender: TObject; aPopup: TFrame) of Object;
   TFreePopupEvent=procedure(Sender: TObject; aPopup: TFrame) of Object;
   TPopupManagerMessage = class(TMessage)
      MsgType: Integer;
      PopupHandle: Pointer;
    end;
   TPopupManager=class(TComponent)
   private
      fOnDisableMainForm: TDisableMainFormEvent;
      fOnRestoreMainForm: TRestoreMainFormEvent;
      fOnShowPopup: TShowPopupEvent;
      fOnHidePopup: THidePopupEvent;
      fOnFreePopup: TFreePopupEvent;
      fOnClosePopupQuery: TClosePopupQueryEvent;
      PopupCount: integer;
      Popups: array of TFrame;
      ParentForm: TForm;
      OldEvent: TKeyEvent;

      procedure FireEvents(const Sender: TObject; const Msg: TMessage);

   public
      Constructor Create(AOwner: TComponent); override;
      procedure CloseControl(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
      Destructor Destroy(); override;
      procedure ShowPopup(aPopup: TFrame; x,y: integer);
      procedure HidePopup(aPopup: TFrame);
      function QueuingPopupCount(): integer;

   published
      property OnDisableMainForm: TDisableMainFormEvent read fOnDisableMainForm write fOnDisableMainForm;
      property OnRestoreMainForm: TRestoreMainFormEvent read fOnRestoreMainForm write fOnRestoreMainForm;
      property OnShowPopup: TShowPopupEvent read fOnShowPopup write fOnShowPopup;
      property OnHidePopup: THidePopupEvent read fOnHidePopup write fOnHidePopup;
      property OnFreePopup: TFreePopupEvent read fOnFreePopup write fOnFreePopup;
      property OnClosePopupQuery: TClosePopupQueryEvent read fOnClosePopupQuery write fOnClosePopupQuery;

   end;

   procedure Register;
   procedure ClosePopup(aPopup: TFrame);

implementation

procedure Register;
begin
  RegisterComponents('QuickBurro Mobile', [TPopupManager]);
end;

procedure ClosePopup(aPopup: TFrame);
var
   m: TPopupManagerMessage;
begin
   m:=TPopupManagerMessage.Create;
   m.MsgType:= 1;
   m.PopupHandle:= Pointer(aPopup);
   TMessageManager.DefaultManager.SendMessage(nil, m);
   FreeAndNil(m);
end;

{TPopupManager}

Constructor TPopupManager.Create(AOwner: TComponent);
begin
   inherited Create(AOwner);
   PopupCount:=0;
   SetLength(Popups,0);
   ParentForm:=TForm(AOwner);
   TMessageManager.DefaultManager.SubscribeToMessage(TPopupManagerMessage, Self.FireEvents);
end;

procedure TPopupManager.CloseControl(Sender: TObject; var Key: Word; var KeyChar: Char;
  Shift: TShiftState);
var
   AllowClose: boolean;
begin
  if Key = vkHardwareBack then
     begin
        if assigned(fOnClosePopupQuery) then
          begin
          AllowClose:=false;
          fOnClosePopupQuery(self,Popups[PopupCount-1],AllowClose);
          if AllowClose then
          HidePopup(Popups[PopupCount-1])
          else
          key:=0;
          end
        else
          key:=0;
     end;
end;

Destructor TPopupManager.Destroy();
var
   i: integer;
begin
   for i := 0 to PopupCount-1 do
      FreeAndNil(Popups[i]);
   PopupCount:=0;
   SetLength(Popups,0);
   ParentForm:=nil;
end;

procedure TPopupManager.FireEvents(const Sender: TObject; const Msg: TMessage);
var
   Frame: TFrame;
begin
  if Msg is TPopupManagerMessage then
     begin
        case TPopupManagerMessage(Msg).MsgType of
          1: begin
          application.ProcessMessages;
          Frame:=TFrame(TPopupManagerMessage(Msg).PopupHandle);
          HidePopup(Frame);
          end;
        end;
     end;
end;

procedure TPopupManager.ShowPopup(aPopup: TFrame; x,y: integer);
var
   i,j: integer;
begin
   if PopupCount=0 then
      begin
         if assigned(fOnDisableMainForm) then
          fOnDisableMainForm(self);
         OldEvent:=ParentForm.OnKeyUp;
         ParentForm.OnKeyUp:=CloseControl;
      end
   else
      begin
         for I := 0 to PopupCount-1 do
          Popups[i].Enabled:=false;
      end;
   j:=PopupCount;
   inc(PopupCount);
   SetLength(Popups,PopupCount);
   Popups[j]:=aPopup;
   if assigned(fOnShowPopup) then
      fOnShowPopup(self,aPopup);
   ParentForm.AddObject(aPopup);
   aPopup.Position.X:=x;
   aPopup.Position.Y:=y;
   aPopup.BringToFront;
end;

procedure TPopupManager.HidePopup(aPopup: TFrame);
begin
   ParentForm.RemoveObject(aPopup);
   if assigned(fOnHidePopup) then
      fOnHidePopup(self,aPopup);
   if PopupCount>0 then
      begin
         if Popups[PopupCount-1]=aPopup then
          begin
          dec(PopupCount);
          SetLength(Popups,PopupCount);
          end;
      end;
   if assigned(fOnFreePopup) then
      fOnFreePopup(self,aPopup);
   FreeAndNil(aPopup);
   if PopupCount>0 then
      Popups[PopupCount-1].Enabled:=true
   else
      begin
         if assigned(fOnRestoreMainForm) then
          fOnRestoreMainForm(self);
         ParentForm.OnKeyUp:=OldEvent;
      end;
end;

function TPopupManager.QueuingPopupCount(): integer;
begin
   result:=PopupCount;
end;

end.
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2014/12/1 19:50:26
2楼: 四、测试程序主程序
    下面来设计一个Demo程序,通过设计几个Frame作为弹出窗口,然后由PopupManager对象来实现弹出、切换、释放等控制。看主程序代码及设计时截图:

unit main;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
  FMX.Objects, FMX.Layouts, FMX.Memo, System.Actions, Fmx.PopupManager,
  Pop1, Pop2, menu;

type
  TMainForm = class(TForm)
    StyleBook1: TStyleBook;
    Layout1: TLayout;
    Layout2: TLayout;
    Memo1: TMemo;
    Rectangle1: TRectangle;
    Rectangle2: TRectangle;
    Label1: TLabel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Line1: TLine;
    PopupManager: TPopupManager;
    MainLayout: TLayout;
    Background: TRectangle;
    Button4: TButton;
    Button5: TButton;
    procedure Button3Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure PopupManagerDisableMainForm(Sender: TObject);
    procedure PopupManagerRestoreMainForm(Sender: TObject);
    procedure PopupManagerShowPopup(Sender: TObject; aPopup: TFrame);
    procedure PopupManagerHidePopup(Sender: TObject; aPopup: TFrame);
    procedure PopupManagerFreePopup(Sender: TObject; aPopup: TFrame);
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.fmx}

//
// 退出...
procedure TMainForm.Button1Click(Sender: TObject);
begin
   close;
end;

//
// 随机弹出一个窗口...
procedure TMainForm.Button3Click(Sender: TObject);
begin
   PopupManager.ShowPopup(TPopupFrame1.Create(nil),Random(Screen.Width-285),65+Random(Screen.Height-252-130));
end;

//
// 清屏...
procedure TMainForm.Button4Click(Sender: TObject);
begin
   memo1.Lines.Clear;
end;

//
// 上弹菜单...
procedure TMainForm.Button5Click(Sender: TObject);
begin
   PopupManager.ShowPopup(TMenuFrame.Create(nil),2,round(Layout2.Position.Y-291-2));
end;

//
// 下拉菜单示例...
procedure TMainForm.Button2Click(Sender: TObject);
begin
   PopupManager.ShowPopup(TMenuFrame.Create(nil),Screen.Width-146-4,round(Rectangle1.Height)+2);
end;

//
// 本窗口(主窗口)失去控制权时,主容器Disable...
procedure TMainForm.PopupManagerDisableMainForm(Sender: TObject);
begin
   Background.Enabled:=false;
   memo1.Lines.Add('###事件### 主窗口失去控制权.');
end;

//
// 本窗口(主窗口)恢复控制权时,主容器Enable...
procedure TMainForm.PopupManagerRestoreMainForm(Sender: TObject);
begin
   Background.Enabled:=true;
   memo1.Lines.Add('###事件### 主窗口恢复控制权.');
end;

//
// 显示弹出窗口事件...
procedure TMainForm.PopupManagerShowPopup(Sender: TObject; aPopup: TFrame);
begin
   if aPopup is TPopupFrame1 then
      memo1.Lines.Add('***事件*** 显示一个Pop1弹出式窗口!');
   if aPopup is TPopupFrame2 then
      memo1.Lines.Add('***事件*** 显示一个Pop2弹出式窗口!');
   if aPopup is TMenuFrame then
      memo1.Lines.Add('***事件*** 显示一个Menu弹出式菜单!');
end;

//
// 隐藏弹出窗口事件...
procedure TMainForm.PopupManagerHidePopup(Sender: TObject; aPopup: TFrame);
begin
   if aPopup is TPopupFrame1 then
      memo1.Lines.Add('***事件*** 隐藏一个Pop1弹出式窗口!');
   if aPopup is TPopupFrame2 then
      memo1.Lines.Add('***事件*** 隐藏一个Pop2弹出式窗口!');
   if aPopup is TMenuFrame then
      memo1.Lines.Add('***事件*** 隐藏一个Menu弹出式菜单!');
end;

//
// 释放弹出窗口事件...
procedure TMainForm.PopupManagerFreePopup(Sender: TObject; aPopup: TFrame);
begin
   if aPopup is TPopupFrame1 then
      memo1.Lines.Add('***事件*** 释放一个Pop1弹出式窗口!');
   if aPopup is TPopupFrame2 then
      memo1.Lines.Add('***事件*** 释放一个Pop2弹出式窗口!');
   if aPopup is TMenuFrame then
      memo1.Lines.Add('***事件*** 释放一个Menu弹出式菜单!');
end;

end.
此帖子包含附件:
JPEG 图像
大小:19.7K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2014/12/1 19:51:14
3楼: 五、弹出窗口示例单元(对话框)
    看演示程序中弹出的对话窗之一的代码和设计图:

unit Pop1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 
  FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
  FMX.Objects, FMX.Effects, FMX.Layouts, Fmx.PopupManager;

type
  TPopupFrame1 = class(TFrame)
    PopupWindow: TRectangle;
    Layout1: TLayout;
    WindowCaptionBar: TRectangle;
    WindowTitle: TLabel;
    Layout2: TLayout;
    Button2: TButton;
    Line1: TLine;
    Button1: TButton;
    WinEffect: TGlowEffect;
    Image1: TImage;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

implementation

uses main,pop2;

{$R *.fmx}

//
// 弹出另一个窗口...
procedure TPopupFrame1.Button1Click(Sender: TObject);
begin
   mainform.PopupManager.ShowPopup(TPopupFrame2.Create(nil),Random(Screen.Width-266),65+Random(Screen.Height-220-130));
end;

//
// 关闭自身...
procedure TPopupFrame1.Button2Click(Sender: TObject);
begin
   Fmx.PopupManager.ClosePopup(self);
end;

end.
此帖子包含附件:
JPEG 图像
大小:24.6K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2014/12/1 19:51:52
4楼: 六、弹出窗口示例单元(菜单)
    再看演示程序中弹出菜单的代码和设计图:

unit menu;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 
  FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
  FMX.ListBox, FMX.Layouts, FMX.Effects, FMX.Objects, Fmx.PopupManager;

type
  TMenuFrame = class(TFrame)
    Rectangle1: TRectangle;
    Button1: TButton;
    Line1: TLine;
    Line2: TLine;
    Button2: TButton;
    Line3: TLine;
    Button3: TButton;
    Line4: TLine;
    Button4: TButton;
    Line5: TLine;
    Button5: TButton;
    Button6: TButton;
    GlowEffect1: TGlowEffect;
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

implementation

{$R *.fmx}

//
// 关闭菜单...
procedure TMenuFrame.Button3Click(Sender: TObject);
begin
   Fmx.PopupManager.ClosePopup(self);
end;

end.
此帖子包含附件:
JPEG 图像
大小:17.1K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2014/12/1 19:52:26
5楼: 七、运行效果
    弹出对话框效果:
此帖子包含附件:
JPEG 图像
大小:63.6K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2014/12/1 19:52:53
6楼: 八、弹出式菜单效果:
此帖子包含附件:
JPEG 图像
大小:63.4K
----------------------------------------------
樵夫的大马甲
作者:
男 jmhyy (jmhyy) ★☆☆☆☆ -
普通会员
2014/12/1 20:01:40
7楼:
----------------------------------------------
-
作者:
男 limin (limin) ★☆☆☆☆ -
盒子活跃会员
2014/12/1 20:06:48
7楼: 虽然不太明白,但是感觉很厉害的样子。
----------------------------------------------
-
作者:
男 framman (阿帝) ★☆☆☆☆ -
普通会员
2014/12/1 20:20:09
8楼: 先马再说.
----------------------------------------------
Delphi是种爱!
作者:
男 nevergrief (孤独骑士) ★☆☆☆☆ -
盒子活跃会员
2014/12/1 20:29:23
9楼: >>由于移动开发时多Form的开销较大
开销有多大?是指运行开销还是内存开销?内存开销无所谓,运行开销应该是指速度慢,慢到什么程度?有必要像你这样搞的这么复杂吗?
----------------------------------------------
只有偏执狂才能生存!
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2014/12/1 20:32:49
10楼: 复杂?看样子还是不公布控件源码,只贴调用的语句——那就很简单了
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2014/12/1 20:37:23
11楼: 弹出式窗口的意义,应用程序设计几个后,就会感觉到这种需求其实蛮多的。
尽管可以自己实现,也不难,但是,用此控件后,会更简单、更模块化
----------------------------------------------
樵夫的大马甲
作者:
男 sqlnew (sqlnew) ★☆☆☆☆ -
盒子活跃会员
2014/12/1 20:39:28
12楼: 无论如何,砍柴能深入研究并公开,对大家都是难得的,非常值得肯定!
----------------------------------------------
-
作者:
男 delphiilove (乌羽玉) ★☆☆☆☆ -
普通会员
2014/12/1 20:44:59
13楼: 感謝分享,佩服啊。
感謝。
----------------------------------------------
-
作者:
男 ultramund (ultramund) ★☆☆☆☆ -
普通会员
2014/12/1 20:57:16
11楼: 是不是使用子窗体,取决于你要弹出窗体的复杂程度。如果比较简单,就像搂主示例一样,我想动态生成一个Panel,上面动态创建几个按钮当然不是问题。但如果稍微复杂些,我就是用的多窗体,至于是不是开销大见仁见智,我个人认为开销不会比楼主想象的大,因为窗体都是动态创建,手机嘛,又不能指望能同时开出多个窗体来显示,因此回到主窗体时,子窗体当然也销毁了。您所说的开销大是占硬盘还是占内存呢?

先不管代码质量如何,搂主的精神值得赞赏。我也大把心得,但懒得写,碰到人家问也没耐心解释。搂主能花这么多时间来写这个,就值得我顶一下。
----------------------------------------------
QQ:56524722 老衲决定重出江湖。
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2014/12/1 21:06:02
14楼: 不得不顶啊。
樵夫终于写包含代码的教程了。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2014/12/1 21:08:46
14楼: 主要的目的有这几个吧:

1、非全屏化弹出窗口界面设计,增加软件的层次感,界面样式会更丰富
2、模块化开发,代码会更清晰
3、减少自己来模拟实现弹出窗口的麻烦事(一两个无所谓,十个二十个怕也够呛)

至于资源的省与不省,确实不是重点
另外,此控件及方法不适合高手,只适合像俺一般的低脚。
----------------------------------------------
樵夫的大马甲
作者:
男 bamboocaep (bamboocaep) ★☆☆☆☆ -
普通会员
2014/12/1 22:33:07
15楼: mark
----------------------------------------------
-
作者:
男 hwkjzyh (汉卿) ★☆☆☆☆ -
盒子活跃会员
2014/12/1 22:35:18
16楼: 谢谢,分享!
----------------------------------------------
作者:
男 iceair (冰晰空气) ★☆☆☆☆ -
盒子活跃会员
2014/12/2 0:35:49
17楼: 顶樵夫,码了这么多字分享经验心得就要支持!
----------------------------------------------
心无挂碍,无有恐怖,远离颠倒梦想,究竟涅槃。
作者:
男 a5824 (Return) ★☆☆☆☆ -
普通会员
2014/12/2 8:31:26
18楼: 老乔真厉害
----------------------------------------------
-
作者:
男 sbamwdx (黑龙) ★☆☆☆☆ -
盒子活跃会员
2014/12/2 9:19:48
19楼: 牛B,好样的
----------------------------------------------
-
作者:
男 bdl1 (bdl1) ▲▲▲▲▲ -
普通会员
2014/12/2 9:30:52
20楼: 模块化开发,代码会更清晰
这一点太重要了!
----------------------------------------------
-我的博客
作者:
男 souledge (souledge) ★☆☆☆☆ -
普通会员
2014/12/2 14:28:55
21楼: XE7以后Form可以针对不同平台设计不同样式,这一点Frame无法做到,不知道英巴会不会对Frame做相应的改进。
----------------------------------------------
-
作者:
男 zhousan (不是昵稱) ★☆☆☆☆ -
盒子活跃会员
2014/12/2 15:44:08
22楼: 不明觉厉~  目前使用XE做的程序还是偏大了些。。
----------------------------------------------
-
作者:
男 kingofsun (小矮人酋长) ★☆☆☆☆ -
普通会员
2014/12/2 17:54:42
23楼: 顶楼主,奉献精神值得一顶
----------------------------------------------
-
作者:
男 vclclx (vclclx) ★☆☆☆☆ -
普通会员
2014/12/2 21:39:32
24楼: 弹出式窗体,效果很赞。
减少资源确实不是重点,我感觉firemonkey的窗口本来就是模拟的,在一个activity画布上自画。
----------------------------------------------
-
作者:
男 l_wming (L_Wming) ★☆☆☆☆ -
普通会员
2014/12/4 11:24:56
25楼: 弹出窗口 点【关闭】会报错App无响应自动退出,看看是什么原因哦?
此帖子包含附件:l_wming_2014124112456.rar 大小:65.9K
----------------------------------------------
-
作者:
男 l_wming (L_Wming) ★☆☆☆☆ -
普通会员
2014/12/4 11:37:28
26楼: procedure ClosePopup(aPopup: TFrame);
var
   m: TPopupManagerMessage;
begin
   m:=TPopupManagerMessage.Create;
   m.MsgType:= 1;
   m.PopupHandle:= Pointer(aPopup);
   TMessageManager.DefaultManager.SendMessage(nil, m);
   //FreeAndNil(m);//这句代码的问题  可能是消息还在处理 此处就释放了 所以报错
end;
----------------------------------------------
-
作者:
男 changson (changson) ▲▲▲▲△ -
普通会员
2014/12/4 11:49:56
27楼: Delphi虽然小问题多,
拐个弯绕个圈
还是可以到达~
----------------------------------------------
-
作者:
男 testerhook (CaptainHook) ★☆☆☆☆ -
普通会员
2014/12/4 11:53:39
28楼: 感谢分享经验。与国外相比,国内愿意分享经验的人真是太少了。
当然,国外分享真正有用经验的也不多,人毕竟还是比较自私的。
----------------------------------------------
-
作者:
男 l_wming (L_Wming) ★☆☆☆☆ -
普通会员
2014/12/4 11:54:30
28楼: 这样注释不释放(泄漏) 
Windows没问题了 但是手机APP还是有问题 不知道啥原因
----------------------------------------------
-
作者:
男 tonyt (tonyt) ▲▲▲▲△ -
普通会员
2014/12/5 0:28:06
29楼: 感谢樵夫分享,很有用
----------------------------------------------
分享研究Delphi Android开发过程中的点点滴滴,一起努力促进Delphi的Android开发繁荣
作者:
男 cywyes (cywyes) ★☆☆☆☆ -
普通会员
2014/12/6 10:26:07
30楼: @l_wming:
   TMessageManager.DefaultManager.SendMessage(nil, m, False); //增加参数False
   FreeAndNil(m);
----------------------------------------------
-
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/5/19 16:05:48
31楼: 咱已经在多个实际项目里用上了本控件
从效果来看,还是很不错的。
此帖子包含附件:
PNG 图像
大小:164.3K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/6 15:46:56
32楼: V4.41版本起,本人专门为此控件增加了10余个通用对话框,进一步方便使用。
下面给出主要的一些通用对话框的用法和效果截图:


1、一般消息提示框
    mainform.PopupManager.ShowMessage('提示信息','本窗口为一般信息提示窗,'+#13#10#13#10+'点确定关闭并继续!');
此帖子包含附件:
PNG 图像
大小:62.9K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/6 15:47:57
33楼: 2、错误信息提示窗
    mainform.PopupManager.ShowError('错误提示','唉呀不好,掐指一算,'+#13#10#13#10+'你今晚要尿床!');
此帖子包含附件:
PNG 图像
大小:65.4K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/6 15:48:47
34楼: 3、警示消息显示窗
    mainform.PopupManager.ShowWarning('警 示 窗','唉呀不好,掐指一算,'+#13#10#13#10+'你今晚要尿床,赶快备尿布!');
此帖子包含附件:
PNG 图像
大小:64.6K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/6 15:49:52
35楼: 4、确认操作对话框
    mainform.PopupManager.ShowConfirm('确 认 窗','本窗口为弹出式确认窗,'+#13#10#13#10+'是否确认这类界面很酷?',255);
此帖子包含附件:
PNG 图像
大小:68.4K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/6 15:51:10
36楼: 5、重试忽略取消三态对话窗
    mainform.PopupManager.ShowRetry('重试选择窗','本窗口为重试操作选择框,'+#13#10#13#10+'选下面三个按钮之一控制程序!',255);
此帖子包含附件:
PNG 图像
大小:67.3K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/6 15:52:16
37楼: 6、单选对话框

procedure TMenu2Frame.Button2Click(Sender: TObject);
var
   Items: TStringList;
begin
   Fmx.PopupManager.ClosePopup(self);
//
   Items:=TStringList.Create;
   Items.Add('千岛湖引水工程');
   Items.Add('富春江防洪工程');
   Items.Add('分水江库区绿化工程');
   Items.Add('富春江水库净化工程');
   Items.Add('钱塘江饮用水工程');
   mainform.PopupManager.ShowOneSelection('单  选  框',Items,'富春江防洪工程',99);
   FreeAndNil(Items);
end;
此帖子包含附件:
PNG 图像
大小:77.5K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/6 15:52:57
38楼: 7、复选对话框

procedure TMenu2Frame.Button4Click(Sender: TObject);
var
   Items: TStringList;
begin
   Fmx.PopupManager.ClosePopup(self);
   Items:=TStringList.Create;
   Items.Add('千岛湖引水工程');
   Items.Add('富春江防洪工程');
   Items.Add('分水江库区绿化工程');
   Items.Add('富春江水库净化工程');
   Items.Add('钱塘江饮用水工程');
   mainform.PopupManager.ShowMultipleSelection('复  选  框',Items,'11000',99);
   FreeAndNil(Items);
end;
此帖子包含附件:
PNG 图像
大小:73.9K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/6 15:54:24
39楼: 8、数据输入对话框

procedure TMenu2Frame.Button5Click(Sender: TObject);
begin
   mainform.PopupManager.ShowInputQuery('输 入 框','请输入测试字符串:','12345678abc');
end;

procedure TMainForm.PopupManagerQueryResult(Sender: TObject; PopTag: Integer;
  QueryResult: string);
begin
   showmessage('Result='+QueryResult);
end;
此帖子包含附件:
PNG 图像
大小:61.3K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/6 15:55:26
40楼: 9、Loading等待窗

procedure TMenu2Frame.Button6Click(Sender: TObject);
var
   i: integer;
begin
   Fmx.PopupManager.ClosePopup(self);
   mainform.PopupManager.ShowLoading('等待提示','正在汇总费用结算报表.'
      +#13#10#13#10+'大约耗费一分钟,请稍等...',99);
   for i := 1 to 500 do
      application.ProcessMessages;
   mainform.PopupManager.CloseLoading(99);
end;
此帖子包含附件:
PNG 图像
大小:55.8K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/6 15:56:11
41楼: 10、进度提示窗
procedure TMenu2Frame.Button1Click(Sender: TObject);
var
   i: integer;
begin
   Fmx.PopupManager.ClosePopup(self);
//
   mainform.PopupManager.ShowProgress('进度窗','正在处理,请稍等...',99);
   for i := 1 to 1000 do
      begin
         mainform.PopupManager.SetProgress(99,1000,i);
         application.ProcessMessages;
      end;
   mainform.PopupManager.CloseProgress(99);
end;
此帖子包含附件:
PNG 图像
大小:57.0K
----------------------------------------------
樵夫的大马甲
作者:
男 cuit_xiong (熊猫) ★☆☆☆☆ -
普通会员
2015/9/6 15:57:22
40楼: 马六甲牛逼啊,支持了
----------------------------------------------
-
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/6 16:03:49
42楼: 11、配套的对话窗返回事件:

//
// 选中选项时...
procedure TMainForm.PopupManagerSelectItem(Sender: TObject; PopTag,
  ItemIndex: Integer);
begin
   ShowMessage('选中了第'+inttostr(ItemIndex)+'个选项!');
end;

//
// 选中多个选项时...
procedure TMainForm.PopupManagerSelectMutipleItems(Sender: TObject;
  PopTag: Integer; CheckedList: string);
begin
   ShowMessage('选的选项标记:'+CheckedList);
end;

//
// 数据输入框返回...
procedure TMainForm.PopupManagerQueryResult(Sender: TObject; PopTag: Integer;
  QueryResult: string);
begin
   showmessage('Result='+QueryResult);
end;

//
// 简单对话框返回...
procedure TMainForm.PopupManagerModalValue(Sender: TObject; PopTag: Integer;
  ModalReturn: TModalValue);
begin
   showmessage('Result='+inttostr(ord(ModalReturn)));
end;


后记: 以上这些,实现起来小菜一碟,但是较为实用,希望对大家有所帮助
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/10 8:14:39
43楼: 12、Hint消息条
   mainform.PopupWaitting.ShowHint('记录已保存到数据库!',1000);
此帖子包含附件:
PNG 图像
大小:37.1K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/10 8:15:30
44楼: 13、文本(Text)输入框
    mainform.PopupManager.ShowInputText('输 入 框','请输入测试文本:','12345678abc'+#13#10+'汉字哈哈哈');
此帖子包含附件:
PNG 图像
大小:55.9K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/10 8:16:32
45楼: 14、弹出式浏览器
   PopupBrowser.ShowBrowser('新浪网','http://www.sina.com.cn/',true,true,true,99);
此帖子包含附件:
PNG 图像
大小:137.8K
----------------------------------------------
樵夫的大马甲
作者:
男 fky1989 (fky1989) ▲▲▲▲▲ -
普通会员
2015/9/10 8:55:47
46楼: 厉害啊~
----------------------------------------------
-
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/15 20:56:22
47楼: 15、地图定位显示窗
          if map.Addr2Geo('杭州市秋涛路240号',Long,Lat) then
          begin
          url:=map.LocationURL(long,lat,16);
          PopupBrowser.ShowBrowser('杭州市秋涛路240号',url,88);
          end
          else
          memo1.Lines.Add('地图定位失败,无法显示地图框!');
此帖子包含附件:
PNG 图像
大小:121.2K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/15 20:57:29
48楼: 16、街区实景显示
procedure TForm1.SpeedButton4Click(Sender: TObject);
var
   Long,Lat: double;
begin
   if map.Addr2Geo('杭州市环城北路120号',Long,Lat) then
      begin
         PopupBrowser.ShowBrowser('杭州市环城北路120号','',88);
         map.CenterLong:=long;
         map.CenterLat:=lat;
         map.ShowPanorama(false);
      end
   else
      memo1.Lines.Add('地图定位失败,无法显示地图框!');
end;

procedure TForm1.MapUrlReady(Sender: TObject; URL: string);
begin
   PopupBrowser.SetURL(88,Url);
end;
此帖子包含附件:
PNG 图像
大小:172.1K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/15 20:58:23
49楼: 17、手机照片采集
          PopupPhoto.TitleBackColor:=TAlphaColorRec.Dodgerblue;
          PopupPhoto.ShowPicker('照片拾取窗',99);
此帖子包含附件:
PNG 图像
大小:134.9K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/15 20:59:21
50楼: 18、单幅图片查看窗
        PopupPhoto.TitleBackColor:=TAlphaColorRec.Darkmagenta;
        PopupPhoto.ShowOneImage('单幅图片查看',PhotoFileName);
此帖子包含附件:
PNG 图像
大小:158.8K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/15 21:00:22
51楼: 19、多幅图片集中切换查看
          PopupPhoto.TitleBackColor:=TAlphaColorRec.Darkgoldenrod;
          FileList:=TStringList.Create;
          FileList.Add(PhotoFileName);
          FileList.Add(ThumbFileName);
          PopupPhoto.ShowMultipleImages('多幅图片查看',FileList);
          FreeAndNil(FileList);
此帖子包含附件:
PNG 图像
大小:170.3K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/15 21:01:51
52楼: 20、异步加载的多幅图切换查看

PopupPhoto.TitleBackColor:=TAlphaColorRec.Darkgreen;
PopupPhoto.ShowMultipleImages('异步多幅图片查看',2);
...
//
// 异步显示多幅图片的事件...
procedure TForm1.PopupPhotoGetImage(Sender: TObject; PopTag,
  ImageIndex: Integer; ImageStream: TMemoryStream);
begin
   if ImageIndex=0 then
      ImageStream.LoadFromFile(PhotoFileName)
   else
      ImageStream.LoadFromFile(ThumbFileName);
end;
此帖子包含附件:
PNG 图像
大小:154.7K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/15 21:02:34
53楼: 更多通用弹出式对话框样式,待续
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/17 16:48:02
54楼: 21、语音录制对话框
PopupAudio.ShowPicker('语音采集窗',99);
...
//
// 语音采集返回...
procedure TForm1.PopupAudioModalValue(Sender: TObject; PopTag: Integer;
  ModalReturn: TModalValue);
begin
   if (PopTag=99) and (ModalReturn=mvOK) then
      begin
         PopupManager.ShowMessage('语音采集成功','语音文件:'
          +extractfilename(PopupAudio.AudioFileName)
          +#13#10#13#10+'语音长度:'+inttostr(PopupAudio.duration)+'毫秒'
          +#13#10#13#10+'请采用下一功能回放测试!');
         VoiceFileName:=PopupAudio.AudioFileName;
      end;
end;
此帖子包含附件:
PNG 图像
大小:58.3K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/17 16:48:49
55楼: 22、音频播放对话框
PopupAudio.ShowPlay('语音回放窗口',VoiceFileName,99);
此帖子包含附件:
PNG 图像
大小:44.2K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/17 16:49:51
56楼: 23、统计图显示窗

PopupChart.PopupHeight:=320;
PopupChart.ShowChart('党员职业分类统计',99);
Chart:=PopupChart.FindChartObject(99);
s:=TPieSeries.Create(nil);
s.Clear;
s.Marks.Arrow.Color:=TAlphaColorRec.Teal;
s.AddPie(12,'学生(12)');
s.AddPie(21,'工程师(21)');
s.AddPie(53,'干部(53)');
s.AddPie(25,'工人(25)');
s.AddPie(95,'公务员(95)');
s.AddPie(40,'农民(40)');
s.AddPie(19,'教师(19)');
Chart.AddSeries(s);
此帖子包含附件:
PNG 图像
大小:61.2K
----------------------------------------------
樵夫的大马甲
作者:
男 baby_moon (孤心明月) ★☆☆☆☆ -
普通会员
2015/9/17 17:13:57
57楼: 这些对话框的确很有用,不知是否可以公布源码?
----------------------------------------------
-
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/17 18:15:06
58楼: 这些对话框控件会包含在QuickBurro V4.42的移动开发组件包里,国庆前夕发布,请到时再看吧。
----------------------------------------------
樵夫的大马甲
作者:
男 baby_moon (孤心明月) ★☆☆☆☆ -
普通会员
2015/9/18 11:35:38
59楼: 我在这些Frame里加了对XE5的条件编译,仅供参考
(文件是7z格式,换下扩展)
此帖子包含附件:baby_moon_2015918113538.zip 大小:43.0K
----------------------------------------------
-
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/20 19:10:39
60楼: 谢谢楼上的支持!
不过XE5实在是差了点,支不支持问题不大,用它来作移动开发的人应该极少。
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/20 21:37:23
61楼: 24、视频播放窗
PopupVideo.ShowPlay('视频播放窗口',TPath.GetDocumentsPath+PathDelim+'Ocean.mp4',99);
此帖子包含附件:
PNG 图像
大小:109.3K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/20 21:38:14
62楼: 25、自由绘图窗
PopupDraw.ShowDraw('自由绘图窗',99);
...
//
// 绘图窗绘图事件,在画布上绘图...
procedure TForm1.PopupDrawPopupDraw(Sender: TObject; aPopupTag: Integer;
  Canvas: TCanvas; const [Ref] ARect: TRectF);
var
   Img: TImage;
   i: integer;
   r: TRectF;
begin
   if aPopupTag=99 then
      begin
         Canvas.Stroke.Kind := TBrushKind.Solid;
         Canvas.Stroke.Color := TAlphaColorRec.Red;
         Img:=PopupDraw.FindDrawObject(99);
         r.Left:=10;
         r.Top:=10;
         r.Right:=img.width-10;
         r.Bottom:=img.Height-10;
         for i := 1 to 25 do
          begin
          Canvas.DrawEllipse(r,1);
          r.Bottom:=r.Bottom-5;
          r.Right:=r.Right-8;
          end;
      end;
end;
此帖子包含附件:
PNG 图像
大小:85.4K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/20 21:40:00
63楼: 26、通用用户登录窗
PopupLogin.ShowLogin('操作员登录','admin','123',99);
...
//
// 验证操作员信息...
procedure TForm1.PopupLoginCheckUser(Sender: TObject; aPopupTag: Integer;
  aUserId, aPassword: string; var Matched: Boolean);
begin
   memo1.Lines.Add('### 事件 ###: 这里验证操作员信息!');
   Fmx.Dialogs.ShowMessage('这里验证操作员信息!');
   Matched:=true;
end;
//
// 登录窗返回...
procedure TForm1.PopupLoginModalValue(Sender: TObject; PopTag: Integer;
  ModalReturn: TModalValue);
begin
   if ModalReturn=mvCancel then
      begin
         memo1.Lines.Add('### 事件 ###: 登录窗返回失败!');
         exit;
      end;
   if ModalReturn=mvOK then
      begin
         memo1.Lines.Add('### 事件 ###: 登录窗返回成功!');
         exit;
      end;
end;
此帖子包含附件:
PNG 图像
大小:43.0K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/20 21:41:16
64楼: 更多的通用对话框,待续
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/22 16:18:26
65楼: 27、打开文件对话框
PopupFile.ShowOpenFile('打开文件',TPath.GetDocumentsPath,'',99);
...
//
// 文件对话框返回...
procedure TForm1.PopupFileModalValue(Sender: TObject; PopTag: Integer;
  ModalReturn: TModalValue);
begin
   if (PopTag=99) and (ModalReturn=mvOK) then
      memo1.Lines.Add('### 事件 ###: 选中了-'+PopupFile.FileName);
end;
此帖子包含附件:
PNG 图像
大小:47.1K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/22 16:19:31
66楼: 28、保存文件对话框
PopupFile.ShowSaveFile('保存文件',TPath.GetDocumentsPath,'','forexample.dat',88);
...
//
// 文件对话框返回...
procedure TForm1.PopupFileModalValue(Sender: TObject; PopTag: Integer;
  ModalReturn: TModalValue);
begin
   if (PopTag=88) and (ModalReturn=mvOK) then
      memo1.Lines.Add('### 事件 ###: 指定保存到-'+PopupFile.FileName);
end;
此帖子包含附件:
PNG 图像
大小:49.5K
----------------------------------------------
樵夫的大马甲
作者:
男 isxuzhu (e.Wong) ★☆☆☆☆ -
盒子活跃会员
2015/9/22 19:53:33
67楼: 非常赞!感谢分享!
----------------------------------------------
你我,都可以是个造梦者!欢迎加入脚本引擎PaxCompiler交流群303904495http://www.cnblogs.com/fireboxsoft有需要错别字检测软件的朋友可以在我博客上的地址下载使用,备注“2ccc”的朋友可以免费获取超级黄金VVVVVVVVVVIP授权
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/23 15:06:33
68楼: 29、树形编码选择窗
PopupSelection.CodeCount:=10;
 SetLength(PopupSelection.Codes,10);
 PopupSelection.Codes[0].Code:='01';
 PopupSelection.Codes[0].Value:='经理办公室';
 PopupSelection.Codes[1].Code:='02';
 PopupSelection.Codes[1].Value:='采购部';
 PopupSelection.Codes[2].Code:='03';
 PopupSelection.Codes[2].Value:='销售科';
 PopupSelection.Codes[3].Code:='04';
 PopupSelection.Codes[3].Value:='总务科';
 PopupSelection.Codes[4].Code:='05';
 PopupSelection.Codes[4].Value:='质检科';
 PopupSelection.Codes[5].Code:='0301';
 PopupSelection.Codes[5].Value:='零售部';
 PopupSelection.Codes[6].Code:='0302';
 PopupSelection.Codes[6].Value:='渠道部';
 PopupSelection.Codes[7].Code:='0303';
 PopupSelection.Codes[7].Value:='大客户部';
 PopupSelection.Codes[8].Code:='030201';
 PopupSelection.Codes[8].Value:='国内代理部';
 PopupSelection.Codes[9].Code:='030202';
 PopupSelection.Codes[9].Value:='国外代理部';
 PopupSelection.TitleBackColor:=TAlphaColorRec.Darkcyan;
 PopupSelection.ShowTreeSelection('树形编码选择窗','2222','01',99);
...
//
// 选中树形节点时...
procedure TForm1.PopupSelectionSelectTreeNode(Sender: TObject; PopTag: Integer;
  Code, Value: string);
begin
   if PopTag=99 then
      memo1.Lines.Add('### 事件 ###: 选中了'+Code+'-'+Value);
end;
此帖子包含附件:
PNG 图像
大小:56.5K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/23 15:07:20
69楼: 30、移动三层网络参数配置窗
Param.NodeId:='china';
Param.ServerAddress:='768791.ichengyun.net';
Param.ServerPort:=80;
Param.DatabaseId:='testdb';
Param.UserId:='admin';
Param.UserPassword:='';
Param.AutoSave:=true;
PopupConfig.ConfigFile:=TPath.GetDocumentsPath+PathDelim+'example.sys';
PopupConfig.ShowConfig('参数配置',param,99);
此帖子包含附件:
PNG 图像
大小:58.4K
----------------------------------------------
樵夫的大马甲
作者:
男 devil10086 (testabc) ▲▲▲▲△ -
普通会员
2015/9/24 15:42:20
70楼: 期待国庆前夕能看到樵夫源码哦。。现在我也是个个窗口自己弄,窗口一多真的是特么烦人。特别是有要修改的地方。。
----------------------------------------------
-
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/24 17:34:59
71楼: 开始写资料了,国庆前夕会发布

下图是整个组件的结构示意:
此帖子包含附件:
PNG 图像
大小:98.5K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/30 16:29:08
72楼: 30、长信息(新闻等)显示框
//
  // 新闻信息窗...
  3: begin
        popupmanager.PopupHeight:=280;
        popupmanager.ShowNews('最高法原副院长奚晓明被双开','  经查,奚晓明严重违反政治纪律和政治规矩,严重违背依法治国决策部署;'
          +'严重违反组织纪律,对党不忠诚、不老实,隐瞒不报个人有关事项;严重违反廉洁'
          +'自律规定,利用职务上的便利为亲属经营活动谋取利益;严重违反中央八项规定精'
          +'神,违规接受公款接待;违反保密纪律,泄露审判工作秘密;利用职务上的便利在'
          +'民事诉讼等方面为他人谋取利益,收受财物。');
     end;
此帖子包含附件:
PNG 图像
大小:71.1K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/30 16:29:50
73楼: 31、弹出式菜单
//
// 弹出式菜单...
11: begin
     Items:=TStringList.Create;
     Items.Add('打开技术资源库');
     Items.Add('增加资源记录');
     Items.Add('资源有效性检查');
     Items.Add('备份资源库到文件');
     Items.Add('从文件还原资源库');
     PopupMenu.BorderColor:=TAlphaColorRec.Dimgray;
     PopupMenu.MenuImages:=ImageList1;
     PopupMenu.ShowMenu('弹出式菜单',Items,99);
     FreeAndNil(Items);
    end;
此帖子包含附件:
PNG 图像
大小:57.1K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/9/30 16:30:32
74楼: 32、图标菜单
//
// 弹出式图标菜单...
12: begin
     Items:=TStringList.Create;
     Items.Add('打开资源库');
     Items.Add('增加资源');
     Items.Add('资源检查');
     Items.Add('备份资源库');
     Items.Add('还原资源库');
     Items.Add('参数配置');
     Items.Add('导出数据');
     Items.Add('资源分类');
     Items.Add('生成汇总表');
     PopupMenu.BorderColor:=TAlphaColorRec.Dimgray;
     PopupMenu.MenuImages:=ImageList2;
     PopupMenu.ShowIconMenu('图标菜单',Items,99);
     FreeAndNil(Items);
    end;
此帖子包含附件:
PNG 图像
大小:73.0K
----------------------------------------------
樵夫的大马甲
作者:
男 pdrich (rich) ★☆☆☆☆ -
盒子活跃会员
2015/10/1 22:54:30
75楼: 好帖子,值得推荐。。。。。
----------------------------------------------
-
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/10/4 22:29:55
76楼: 33、扁平按钮菜单
//
// 弹出式按钮菜单...
13: begin
     Items:=TStringList.Create;
     Items.Add('打开资源库');
     Items.Add('增加资源');
     Items.Add('资源检查');
     Items.Add('备份资源库');
     Items.Add('还原资源库');
     Items.Add('参数配置');
     PopupMenu.ItemRowSpace:=2;
     PopupMenu.ItemsEveryRow:=2;
     PopupMenu.MenuAutoSize:=true;
     PopupMenu.PopupWidth:=280;
     PopupMenu.BorderColor:=TAlphaColorRec.Dimgray;
     PopupMenu.TitleBackColor:=TAlphaColorRec.Teal;
     PopupMenu.MenuImages:=ImageList2;
     PopupMenu.ShowButtonMenu('按钮菜单',Items,99);
     FreeAndNil(Items);
    end;
此帖子包含附件:
PNG 图像
大小:76.4K
----------------------------------------------
樵夫的大马甲
作者:
男 gaoyong_gy (gaoyong_gy) ★☆☆☆☆ -
盒子活跃会员
2015/10/5 15:36:19
77楼: 顶一下!!!
----------------------------------------------
Delphi 的移动程序开发,是您不可再错失的机遇:http://blog.163.com/you888@188/blog/static/6723961920169319529515/
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/10/5 21:56:18
78楼: 34、日期拾取对话框
    Delphi有自带的日历控件,但不好控制大小,所以自己实现一个!

PopupInput.ShowDatePicker('日期拾取对话框',now,99);
此帖子包含附件:
PNG 图像
大小:53.6K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/10/5 21:57:51
79楼: 35、英文样式的日期拾取效果
PopupInput.CalendarLanguage:='EN';
PopupInput.TextOk:='Ok';
PopupInput.TextCancel:='Cancel';
PopupInput.ShowDatePicker('Date Dialog',now,99);
此帖子包含附件:
PNG 图像
大小:52.0K
----------------------------------------------
樵夫的大马甲
作者:
男 hyz_hz (随风) ★☆☆☆☆ -
普通会员
2015/10/5 22:35:18
80楼: 顶一下樵夫。
----------------------------------------------
-
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/10/13 23:11:46
81楼: 36、通用表格分页查询对话框
    很常用的数据库管理类App中的典型模块,做成了通用对话框。用法举例:
Items:=TStringList.Create;
   Items.Add('所有客户类别');
   Items.Add('01-国内客户');
   Items.Add('02-国外客户');
   PopupDataList.FilterMode:=fmTyping;
   PopupDataList.TableName:='Customers';
   PopupDataList.ShowPagingGrid('通用表格分页查询',nil,99);
   PopupDataList.AddColumn(99,'CustimerId','编号',80);
   PopupDataList.AddColumn(99,'CompanyName','客户名称',200);
   PopupDataList.AddColumn(99,'Phone','联系电话',120);
   PopupDataList.InitFilterTypes(99,Items);
   PopupDataList.ShowGridData(99);
   FreeAndNil(Items);
此帖子包含附件:
PNG 图像
大小:59.4K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/10/13 23:17:09
82楼: 37、通用气泡聊天对话框
   私聊、群聊、业务催办之类场合,在业务app之上弹出即时交流的对话框,将会是爽爽的、贴心的功能。用法也很简单:

//
// 主动打开聊天框...
......
   PopupChat.ShowChat('气泡聊天窗','S-China-群聊',99);
   application.ProcessMessages;
   if not checkbox2.IsChecked then
      begin
         PopupChatSendText(self,99, 'S-China-群聊','俺来啦,快欢迎!',ok);
         PopupChat.AddTextTopic(99,'俺来啦,快欢迎!',true,PopupChat.SelfName,PopupChat.SelfHeaderIndex);
      end;
......

//
// 发送文本...
procedure TForm1.PopupChatSendText(Sender: TObject; aPopupTag: Integer;
  aChannelId, aText: string; var Successful: Boolean);
var
   Parcel: TMBParcel;
begin
//
// 组装消息...
   Parcel:=TMBParcel.Create;
   Parcel.PutStringGoods('MsgFlag','PopupTest');
   Parcel.PutStringGoods('PosterSessionId',MBConn.WebSessionId);
   Parcel.PutStringGoods('PosterNickName',PopupChat.SelfName);
   Parcel.PutIntegerGoods('PosterHeaderIndex',PopupChat.SelfHeaderIndex);
   Parcel.PutStringGoods('ChannelId',aChannelId);
   Parcel.PutStringGoods('MsgType','text');
   Parcel.PutStringGoods('TextData',aText);
//
// 发送(绑定为1234的客户端)...
   Successful:=Poster.PostToWebIntPropSessions(1234,Parcel);
//
// 释放对象...
   FreeAndNil(Parcel);
end;
.......

//
// 收到消息时...
<略>
此帖子包含附件:
PNG 图像
大小:79.2K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/10/15 23:01:52
83楼: 38、ListView风格的分页列表框
    和表格形式的分页列表框一样,各种自定义属性、适应各种数据表,也很实用。
...
PopupPagingListView.TableName:='Customers';
PopupPagingListView.ShowPagingView('分页列表浏览框',99);
PopupPagingListView.ShowPageData(99);
...
//
// 读取页面数据...
procedure TForm1.PopupPagingListViewGetPageData(Sender: TObject; PopTag, PageNo,
  PageSize: Integer; Sql: string; var AllRecords: Integer;
  var aTable: TMBTable);
var
   ok: boolean;
begin
   ok:=FetchDataPage(MBA,sql,PageNo,PageSize,AllRecords,Tab);
   if ok then
      aTable:=Tab
   else
      begin
         AllRecords:=0;
         aTable:=nil;
      end;
end;

//
// 取一个记录的显示信息...
procedure TForm1.PopupPagingListViewGetItemInfo(Sender: TObject;
  PopTag: Integer; aTable: TMBTable; var IconIndex: Integer; var ItemTitle,
  ItemSubTitle, ItemDesc: string);
begin
   IconIndex:=random(24);
   ItemTitle:=aTable.GetAsString('ContactName');
   ItemSubTitle:=aTable.GetAsString('CompanyName');
   ItemDesc:='Tel: '+aTable.GetAsString('Phone')+'   Fax: '+aTable.GetAsString('Fax');
end;
...
此帖子包含附件:
PNG 图像
大小:75.9K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/10/15 23:03:25
84楼: 39、选择记录用的分页列表框
    上一样式略加变化,用于在一个数据表中选择需要的记录。示例代码略。
此帖子包含附件:
PNG 图像
大小:74.2K
----------------------------------------------
樵夫的大马甲
作者:
男 jopher3 (樵夫的马六甲) ▲▲▲▲▲ -
普通会员
2015/10/16 5:10:54
85楼: 结贴:
      本贴示意如何通过一个小小的idea进行深度挖掘、不断拓展,从而制造出一个组件产品。盼望大伙齐上阵,集思广益,一起来为delphi添砖加瓦!本贴到此圆满结贴,打扰大家。
----------------------------------------------
樵夫的大马甲
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2021/9/24 16:11:29
86楼: 挖!
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2021/9/24 16:18:52
87楼: 大概看了一下楼主的代码,大概是运行期动态创建一个 Frame 用来当作一个弹出提示框。很多地方需要类似的东西,但需要的时候再写一段代码,确实不如把相似的代码都集中到一起,封装好,需要的时候调用就行了。学习了。

赞楼主。
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行968.75毫秒 RSS