文档章节

使用 InputBox、InputQuery 的启发

涂孟超
 涂孟超
发布于 2014/09/26 15:33
字数 1109
阅读 10
收藏 0
点赞 0
评论 0

看了 InputBox、InputQuery 函数实现的源码, 有些收获与心得...

通过 InputBox 可获取用户输入的字符串:
procedure TForm1.Button1Click(Sender: TObject);
var
  str: string;
begin
  str := InputBox('输入窗口标题', '输入提示', '默认输入内容');
  ShowMessage(str); //显示输入的内容
end;

 
 
 
 
 

 

 

  

InputBox 是调用了 InputQuery, InputQuery 是通过一个 var 参数获取新字串:
procedure TForm1.Button2Click(Sender: TObject);
var
  str: string;
begin
  InputQuery('输入窗口标题', '输入提示', str);
  ShowMessage(str); //显示输入的内容
end;

 
 
 
 
 

 

 

  

InputQuery 可返回一个 Boolean 值, 可判断用户是确认还是取消, 挺有用的:
procedure TForm1.Button3Click(Sender: TObject);
var
  str: string;
begin
  str := '默认输入内容';
  if InputQuery('输入窗口标题', '输入提示', str) then
    ShowMessage(str); //如果点击了 ok 按钮将显示输入的内容
end;

 
 
 
 
 

 

 

  

我经常用到需要用户输入或选择的窗口, 一般都是 Show 一个提前设计好的窗口; 这会浪费资源, InputQuery 的窗口应该是动态建立的.

但如果动态建立还是有诸多麻烦, 譬如给按钮添加事件...

但查看 InputQuery 的源码, 只有区区几十行, 果然是动态建立的窗口, 但并没有发现 "事件" 相关的代码!

再看下去, 发现这和 "模式窗口" 有关, 假如不是用 ShowModal 启动窗口的话, 恐怕 "事件" 代码是非写不可.

那 "模式窗口" 中的 "按钮" 和 "模式窗口" 又是如何关联的呢?

还是做起来看吧:

//主体代码就这些:
procedure TForm1.Button1Click(Sender: TObject);
var
  frm: TForm;
begin
  frm := TForm.Create(Application);
  frm.ShowModal;
  frm.Free;
end;

 
 
 
 
 

 

 

  

同时动态添加进两个按钮:
procedure TForm1.Button1Click(Sender: TObject);
var
  frm: TForm;
begin
  frm := TForm.Create(Application);

  with TButton.Create(frm) do begin
    Caption := '确认';
    Parent := frm;
    Left := 100; top := 40;
  end;

  with TButton.Create(frm) do begin
    Caption := '取消';
    Parent := frm;
    Left := 100; top := 80;
  end;

  frm.ShowModal;
  frm.Free;
end;

 
 
 
 
 

 

 

  

但上面代码写出的按钮并没有任何作用, 其实只要设置一下按钮的 ModalResult 属性就可以了:
procedure TForm1.Button1Click(Sender: TObject);
var
  frm: TForm;
begin
  frm := TForm.Create(Application);

  with TButton.Create(frm) do begin
    Caption := '确认';
    ModalResult := mrOk; {1}
    Parent := frm;
    Left := 100; top := 40;
  end;

  with TButton.Create(frm) do begin
    Caption := '取消';
    ModalResult := mrCancel; {2}
    Parent := frm;
    Left := 100; top := 80;
  end;

  frm.ShowModal;
  frm.Free;
end;

 
 
 
 
 

 

 

  

按钮的 ModalResult 属性就是一个整数, 窗体也有相同的属性; 点击按钮时它会传递给所属窗体的同名(ModalResult)属性; 这个属性的默认值是 0, 非 0 时模式窗口即刻关闭.

另外: ShowModal 是个函数, 调用时会返回窗口的 ModalResult 值.

上面几句话挺重要, 我也都从相关源码中核实了.
procedure TForm1.Button1Click(Sender: TObject);
var
  frm: TForm;
begin
  frm := TForm.Create(Application);

  with TButton.Create(frm) do begin
    Caption := '确认';
    ModalResult := mrOk; {1}
    Parent := frm;
    Left := 100; top := 40;
  end;

  with TButton.Create(frm) do begin
    Caption := '取消';
    ModalResult := mrCancel; {2}
    Parent := frm;
    Left := 100; top := 80;
  end;

  if frm.ShowModal = mrOk then
    ShowMessage('确认了')
  else
    ShowMessage('没有确认');

  frm.Free;
end;

 
 
 
 
 

 

 

  

完善一下, 并添加两个文本框准备接受信息:
procedure TForm1.Button1Click(Sender: TObject);
var
  frm: TForm;
begin
  frm := TForm.Create(Application);
  frm.Position := poScreenCenter;
  frm.ClientWidth := 270;
  frm.ClientHeight := 100;
  frm.Caption := '输入对话框';

  with TEdit.Create(frm) do begin
    Parent := frm;
    Name := 'Edit1';
    SetBounds(10, 10, 100, 20);
  end;

  with TEdit.Create(frm) do begin
    Parent := frm;
    Name := 'Edit2';
    SetBounds(150, 10, 100, 20);
  end;

  with TButton.Create(frm) do begin
    Caption := '确认';
    ModalResult := mrOk;
    Default := True;
    Parent := frm;
    SetBounds(100, 40, 75, 25);
  end;

  with TButton.Create(frm) do begin
    Caption := '取消';
    ModalResult := mrCancel;
    Cancel := True;
    Parent := frm;
    SetBounds(100, 70, 75, 25);
  end;

  if frm.ShowModal = mrOk then
  begin
    ShowMessage('确认了');
  end;

  frm.Free;
end;

 
 
 
 
 

 

 

  

如何传回用户输入的信息呢? 我觉得用类似 InputQuery 函数中的 var 参数接受信息就挺好的, 这种方式用于接受复杂的信息也很方便; 不过要先把上面的代码写到一个函数里:
{函数}
function GetInfo(var str1,str2: string): Boolean;
var
  frm: TForm;
  MyEdit1, MyEdit2: TEdit;
begin
  Result := False;
  frm := TForm.Create(Application);
  frm.Position := poScreenCenter;
  frm.ClientWidth := 270;
  frm.ClientHeight := 100;
  frm.Caption := '输入对话框';

  MyEdit1 := TEdit.Create(frm);
  with MyEdit1 do begin
    Parent := frm;
    Text := str1;
    SetBounds(10, 10, 100, 20);
  end;

  MyEdit2 := TEdit.Create(frm);
  with MyEdit2 do begin
    Parent := frm;
    Text := str2;
    SetBounds(150, 10, 100, 20);
  end;

  with TButton.Create(frm) do begin
    Caption := '确认';
    ModalResult := mrOk;
    Default := True;
    Parent := frm;
    SetBounds(100, 40, 75, 25);
  end;

  with TButton.Create(frm) do begin
    Caption := '取消';
    ModalResult := mrCancel;
    Cancel := True;
    Parent := frm;
    SetBounds(100, 70, 75, 25);
  end;

  if frm.ShowModal = mrOk then
  begin
    str1 := MyEdit1.Text;
    str2 := MyEdit2.Text;
    Result := True;
  end;

  frm.Free;
end;

{调用测试}
procedure TForm1.Button1Click(Sender: TObject);
var
  s1,s2: string;
begin
  s1 := 'aaa';
  s2 := 'bbb';
  if GetInfo(s1, s2) then ShowMessageFmt('%s - %s', [s1, s2]);
end;

 
 
 
 
 

 

 

  

完成了, 但这远远没有 InputQuery 的源码精彩; 不过从今往后再用到一个采集信息的对话框时, 我会尽量用这样一个函数来完成; 这就是我阅读 InputQuery 源码的收获.

本文转载自:http://www.cnblogs.com/del/archive/2009/10/08/1579174.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
好多Javascript日期选择器呀-5

最精致的日历式日期输入控件 (Smart Ver 1.00)

晨曦之光
2012/03/09
1K
0
unity安卓移动端读写Xml实例

翻别人的博客,翻来翻去试来试去,翻到了一些东西,撞来撞去后终于撞到对的结果 之前总感觉好难啊,不想看啊,跳了。后来还是躲不过。移动端的路径什么的还是要弄懂啊, 路径一直是个问题。之...

ou_nvhai的博客
2017/12/19
0
0
VBS脚本:计算还需要净胜多少局才能让自己的扫雷胜率增长1%

程序说明 作为一个扫雷爱好者,今天突然想做一个脚本,看看自己还剩下多少局才能让胜率增长1个百分点 脚本通过已玩游戏数和已胜游戏数,推算还需要连胜多少局游戏才能让自己的获胜率增长一个...

北风其凉
2014/12/29
0
0
如何用VBS编写一个简单的恶搞脚本

windows系统的电脑, 首先右击桌面,选择新建-文本文档,在桌面上新建一个文本文档; image.png 随后打开计算机或者是我的电脑,点击其中的组织(xp系统多为工具),选择下面的文件夹和搜索选...

_周小董
2017/12/04
0
0
VB 实现二分查找

VB 实现二分查找 tiankonguse blog2014-10-29205 阅读 vb查找 背景 女朋友要把代码贴给我,我说把cpp文件发给我吧。 结果老婆发给我一个 vbp 文件,原来是VB编写的。我想难道 VB 代码以 vbp ...

tiankonguse blog
2014/10/29
0
0
linux里命令的对话框whiptail

Linux里面可以在命令行里形成对话框,用光标上下,左右选择,一屏一屏的问答选择,填写。 whiptail是Linux不需要另行安装,默认就有的,其它的比如dialog需要另行安装,很麻烦,虽然功能比较...

shen_xu
06/29
0
0
window.prompt 的设置[摘]

自定义prompt window.prompt = (function(prompt) { if (window.navigator.appName.toLowerCase().indexOf("microsoft")<0) return prompt; return function(msg) { window.vbsvar = null; e......

于子洋
2010/03/08
0
0
Wabacus 3.5 发布,开发效率提高5倍以上

JavaEE 快速开发框架 Wabacus 3.5 版已发布,通过该框架,开发者的代码量可以减少60%以上,开发效率提高5倍以上。 3.5版本主要功能变更列表: 输入框改进,包括: 1) 标签支持description属性...

oschina
2012/10/09
2.3K
8
图形化桌面上的脚本编程

1创建文本菜单 创建交互式shell脚本最长用的方法就是使用菜单。提供各种选项帮助脚本用户了解脚本功能。菜单会清空显示区域,然后显示可用的选项列表。 1.1创建菜单函数 菜单布局函数 创建菜...

Caishu
2016/05/22
89
0
mapreduce job所需要的各种参数在Sqoop中的实现

InputFormatClass com.cloudera.sqoop.mapreduce.db.DataDrivenDBInputFormat 2) OutputFormatClass1)TextFile com.cloudera.sqoop.mapreduce.RawKeyTextOutputFormat 2)SequenceFile org.ap......

超人学院
2015/05/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

50 行 Python 代码,带你追到最心爱的人

程序员世纪难题 人们一提到程序员第一反应就是:我知道!他们工资很高啊!但大部分都是单身狗,不懂得幽默风趣,只是每天穿格子 polo 衫的宅男一个。甚至程序员自己也这样形容自己:钱多话少...

猫咪编程
8分钟前
0
0
JAVA知识点随心记

1.Switch case具体的支持类型? Q:支持byte、short、char、int基本类型,枚举类型和String类型(JDK7以上支持),四种基本类型的包装类型也支持,但是原因在于触发了自动拆箱,将包装类型拆成了基本...

勤奋的蚂蚁
18分钟前
0
0
NoSQL

一、NoSQL介绍 NoSQL属于非关系型数据,mysql属于关系型数据库。 对于关系型数据库来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当数据量非常大的时候...

人在艹木中
23分钟前
0
0
第17章MySQL主从配置

mysql安装总结 mysql主从准备工作: 准备两台机器,每台机器安装msyql服务,并启动mysql服务 mysql详细安装 1.首先下载二进制免编译的包,下载到/usr/local/src/目录下 2.解压压缩包 3.解压完...

Linux学习笔记
27分钟前
0
0
Redis高可用及分片集群

一、主从复制 使用异步复制 一个服务器可以有多个从服务器 从服务器也可以有自己的从服务器 复制功能不会阻塞主服务器 可以通过服务功能来上主服务器免于持久化操作,由从服务器去执行持久化...

Java大蜗牛
31分钟前
0
0
前端面试题汇总

最近在复习,准备找工作了,特此总结一下前端的相关知识。 1.获取浏览器URL中查询字符的参数: function getQuery(name){    var reg = new RegExp("(^|&)"+name+"=([^&]*)"(&|$));...

凛冬来袭
今天
0
0
可持续发展的学习道路

与其要求别人,不如提升自己 内心渴望进步 经常做出改变现有模式,不断学习 寻找资源,整合资源,不断熟练这种模式 渠道很重要 先打开新世界的航路

狮子狗
今天
0
0
apollox-lua开源项目 示例codepen2

今天在示例上增加了几个功能, 首先添加js array的标准库。 所有js array的方法目前都支持了。 添加查看code模式。 点击查看code可以看到生成的lua代码。默认web模式需要把标准库连接进来, ...

钟元OSS
今天
0
0
javascript性能优化之避免重复工作

javascript最重要也最根本的性能优化标准之一是避免工作,避免工作又包括两点,第一,不做不必要的工作,第二,不做重复的已经完成的工作。第一部分可以通过代码重构完成,第二部分不做重复的...

老韭菜
今天
0
0
缓存穿透、并发和雪崩那些事

0 题记 缓存穿透、缓存并发和缓存雪崩是常见的由于并发量大而导致的缓存问题,本文讲解其产生原因和解决方案。 缓存穿透通常是由恶意攻击或者无意造成的;缓存并发是由设计不足造成的;缓存雪...

Java填坑之路
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部