Delphi XE7实现的任意位置弹出菜单

Delphi XE7中目前还没有弹出菜单组件,这个弹出菜单应用很普遍,在Java开发的安卓程序中很简单就可以用上了,应该说是一个标准控件。看了一些例子,但是都不能满足我想在任意位置弹出菜单需求,于是自己在网上找了一个例子,修改后实现了我的在任意位置弹出菜单需求!全部代码如下:

{
  功能:DelphiXE7里面实现的弹出菜单
  ------------------------------------------------------------------------------
  说明:实现在任意位置显示弹出菜单功能。
  ------------------------------------------------------------------------------
  注意:
  1,rcPopup为弹出菜单最外层的容器,在正式使用时候,"visiable"属性建议设置为false。
  在设计菜单时候,把这个属性改为true,那样可以可视化设计菜单。

  2,"main_old.pas"为原作者写的代码,对原作者辛苦工作表示感谢。

  ------------------------------------------------------------------------------
  原作者:不详,从大富翁论坛下载到此代码
  修改者: Email:[email protected]  修改时间:2014/11/20 00:47
  ------------------------------------------------------------------------------
  开发工具:Delphi XE7
  测试手机:华为荣耀X1
}

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.Effects,
  FMX.Objects, FMX.StdCtrls, FMX.Filter.Effects, FMX.Ani;

type
  TForm7 = class(TForm)
    ToolBar1: TToolBar;
    sbDropDown: TSpeedButton;
    rcPopup: TRectangle;
    ShadowEffect1: TShadowEffect;
    lbHome: TLabel;
    imHome: TImage;
    FillRGBEffect1: TFillRGBEffect;
    imSeparator: TImage;
    Image1: TImage;
    lbOption2: TLabel;
    Image2: TImage;
    FillRGBEffect2: TFillRGBEffect;
    Image3: TImage;
    lbOption1: TLabel;
    Image4: TImage;
    FillRGBEffect3: TFillRGBEffect;
    lbOption3: TLabel;
    Image5: TImage;
    FillRGBEffect4: TFillRGBEffect;
    PopupAnimation: TFloatAnimation;
    procedure sbDropDownClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }

    // {
    // 功能: 执行显示弹出菜单操作
    // 参数:
    // menuX:// 菜单显示位置的X值
    // menuX:// 菜单显示位置的Y值
    // isShowMenu:是否显示菜单
    // }
    // procedure DoShowPopMenu(menuX, menuY: Single; var isShowMenu: boolean);

    procedure DoShowPopMenu(menuX, menuY: Single; var popMenu: TRectangle;
      var popAnimation: TFloatAnimation; var isShowMenu: boolean);
  end;

var
  Form7: TForm7;

  isShowPopMenu: boolean; // 是否显示菜单

implementation

{$R *.fmx}

// 演示如何使用
procedure TForm7.sbDropDownClick(Sender: TObject);
var
  menuX, menuY: Single; // 菜单显示位置的X和Y值
begin

  { 测试数据1 }
  // 测试默认菜单X值
  menuX := 1;
  // 测试默认菜单Y值
  menuY := ToolBar1.Height;

  { 测试数据2 }
  menuX := menuX + 20; // 菜单显示位置的X值
  menuY := menuY + 20; // 菜单显示位置的Y值

  // 执行显示弹出菜单操作
  self.DoShowPopMenu(menuX, menuY, rcPopup, PopupAnimation, isShowPopMenu);

end;

// 执行显示弹出菜单操作
procedure TForm7.DoShowPopMenu(menuX, menuY: Single; var popMenu: TRectangle;
  var popAnimation: TFloatAnimation; var isShowMenu: boolean);
begin

  // 如果要执行不显示菜单操作
  if isShowMenu = false then
  begin

    // 设置是否显示菜单布尔值为true,为了下次显示菜单判断用
    isShowMenu := True;

    // 设置菜单显示位置X值
    popMenu.Position.X := menuX;
    // 设置菜单显示位置Y值
    popMenu.Position.Y := menuY;

    // 设置菜单可见
    popMenu.Visible := True;

    { 暂时没弄清楚下面这两个参数含义,只是通过测试知道这样设置达到预期效果了 }
    // 设置菜单打开动画起始位置
    popAnimation.StartValue := popMenu.Position.Y;
    // 设置菜单打开动画结束位置
    popAnimation.StopValue := popMenu.Position.Y;

    // 启动动画
    popAnimation.Start;
  end
  else
  begin

    // 设置是否显示菜单布尔值为false,为了下次显示菜单判断用
    isShowMenu := false;

    // 设置菜单显示位置X值
    popMenu.Position.X := menuX;
    // 设置菜单显示位置Y值
    popMenu.Position.Y := menuY;

    { 暂时没弄清楚下面这两个参数含义,只是通过测试知道这样设置达到预期效果了 }
    // 设置菜单打开动画起始位置
    popAnimation.StartValue := popMenu.Position.Y;
    // 设置菜单打开动画结束位置
    popAnimation.StopValue := popMenu.Position.Y;

    // 启动动画
    popAnimation.Start;

    // 设置菜单不可见
    popMenu.Visible := false;
  end;

end;

end.

源代码下载:http://dl5.csdn.net/fd.php?i=878681887197295&s=1031a6c70ac5628e21f978f48da52987

时间: 2024-12-29 23:24:11

Delphi XE7实现的任意位置弹出菜单的相关文章

Swift实现封装PopMenu菜单,可在屏幕任意位置弹出

效果图: 说明: 代码现已支持 Swift3 语法 使用介绍: 1.初始化位置 //frame 为整个popview相对整个屏幕的位置 箭头距离右边位置,默认15 //popMenu = SwiftPopMenu(frame: CGRect(x: KSCREEN_WIDTH - 155, y: 51, width: 150, height: 112)) //frame 为整个popview相对整个屏幕的位置 arrowMargin :指定箭头距离右边距离 popMenu = SwiftPopMe

Android弹出菜单

在实际开发中,我们可能会用到toolbar控件,然后还要在右上角添加弹出菜单,但是toolbar弹出菜单,实在是不好控制位置,因此用户体验很是不好,所以 就想到了用popupwindow来代替弹出的菜单.话不多说先看效果(文章末尾有demo下载地址): 效果还是基本能接受的. 下面讲讲实现过程: 一:菜单布局,很简单,和一般的布局一样,linearlayout中包裹textview和imageview(需要图片的话) <?xml version="1.0" encoding=&q

JavaScript基础--小案例:在网页指定位置弹出错误信息(十二)

案例分析:点击按钮后,在网页上指定区域,提示错误信息!5秒后,错误信息提示自动消失! 1 <script languag="javascript" type="text/javascript"> 2 var clearId; 3 function test(){ 4 document.getElementById("showMsg").style.cssText="width:200px;height:50px;left:6

MUI组件三:列表、遮罩蒙版、数字输入框、侧滑导航和弹出菜单

1.list(列表) 列表是常用的UI控件,mui封装的列表组件比较简单,只需要在ul节点上添加.mui-table-view类.在li节点上添加.mui-table-view-cell类即可,如下为示例代码 <ul class="mui-table-view"> <li class="mui-table-view-cell">Item 1</li> <li class="mui-table-view-cell&q

弹出菜单的创建与使用

-------------siwuxie095 工程名:TestSwingPopupMenu 包名:com.siwuxie095.popupmenu 类名:MyFrame.java 工程结构目录如下: MyFrame.java: package com.siwuxie095.popupmenu; import java.awt.BorderLayout; import java.awt.Component; import java.awt.EventQueue; import java.awt.

糍粑大叔的独游之旅-u3d实现弹出菜单(上)-动态列表

在u3d5.x中,使用ugui作为默认的界面系统,但控件实在太少,很多需求都不能满足,比如弹出菜单(PopupMenu) 我也懒得去网上找现成的实现,再加上现有代码已经有很多有关列表控件的功能,不想再重新动这些代码. 所以自己实现一个,目前先只实现核心.搭建控件相关类的骨干,后期再慢慢丰富和做的更花哨. 开篇之前声明,我的u3d理解非常有限,有很多也许本身自带的功能或有现成库功能我不知道,所以选择了自己探索或实现, 感觉太low欢迎给出好的意见. 定义和代码结构 PopupMenu是点击鼠标或按

iOS开发——实战技术OC篇&amp;关于蒙板和弹出菜单

关于蒙板和弹出菜单 一:关于蒙板 蒙板的作用一般就是用来实现不能做其他操作还有一些模糊效果提示用户 我们只需要自定义一个View,并且创建两个类方法用来给外界调用实现显示和隐藏 + (void)show; + (void)hide; 显示:直接添加到window上,并且设置和window同样大小,然后设置相应的透明度(alpla) 1 + (void)show 2 3 { 4 5 6 7 8 9 iCocosCover *cover = [[self alloc] init]; 10 11 12

用PopupWindow实现弹出菜单(弹出的菜单采用自定义布局)

     用PopupWindow实现弹出菜单是一个比较好的方式.当然我们还有一个类PopupMenu也能实现弹出菜单,但那个太过于局限了,所以不是很推荐. 这个实例的效果是这样的:点击按钮后,一个菜单从屏幕的右边滑入到屏幕中,点击按钮/空白处后菜单消失. 布局文件时一个按钮,我就不贴出代码了.下面是菜单的布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&

【转】android创建Popwindow弹出菜单的两种方式

方法一的Activity [java] view plaincopy package com.app.test02; import android.app.Activity; import android.os.Bundle; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import