使用 InputBox、InputQuery 的启发

看了 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 源码的收获.

delphi 使用 InputBox、InputQuery 的启发的更多相关文章

  1. Delphi Inputbox,InputQuery用法

    Delphi :InputQuery,InputBox用法及区别 function InputQuery(const ACaption, APrompt: string; var Value: str ...

  2. Delphi中Inputbox 和Inputquery 函数的使用

    原文转自:http://blog.csdn.net/zengcong2013/article/details/18355959 inputbox的返回值是,你在输入框中输入的文字.而inputquer ...

  3. delphi控件属性大全-详解-简介

    http://blog.csdn.net/u011096030/article/details/18716713 button 组件: CAPTION 属性 :用于在按钮上显示文本内容 Cancel ...

  4. delphi中的inpubox,如何能控制它的位置? 10

    https://zhidao.baidu.com/question/153270855.html delphi中的inpubox,如何能控制它的位置? 10 RT ! 前辈!最好你就把那代码都拿出来吧 ...

  5. [原创] Delphi InputBox、InputQuery函数

    Delphi InputBox.InputQuery函数 两个函数都是弹框提示输入信息 function InputQuery(const ACaption, APrompt: string; var ...

  6. 【转】Delphi的消息对话框

    Delphi的消息对话框 输入输出inputBox()函数MessageBox()ShowMessage 对话框是Windows操作系统中程序与用户沟通的一种常见的交互方式,对话框可以向用户提供当前程 ...

  7. delphi弹出信息框大全(转载)

    1. 警告信息框 MessageBox(Handle,'警告信息框','警告信息框',MB_ICONWARNING); 2.疑问信息框 MessageBox(Handle,'疑问信息框','疑问信息框 ...

  8. Delphi完成的断点续传例子 转

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  9. Delphi的Socket编程步骤(repulish)

    转贴自:http://topic.csdn.net/t/20010727/16/212155.html ClientSocket 和ServerSocket几个重要的属性:   1.client和se ...

随机推荐

  1. javascript-object对象属性操作之Object.defineProperty

    一.基本用法简介 声明一个简单的对象,如下 var obj = { name: 'ldld' } 我们可以用Object.defineProperty来声明这个对象 var obj = {} Obje ...

  2. 拒绝从入门到放弃_《鸟哥的 Linux 私房菜 — 基础学习篇(第三版)》必读目录

    目录 目录 前言 关于这本书 必看知识点 最后 前言 相信部分刚进入这个行业的新同学会对一个问题感到疑惑,为什么从培训学校出来的学员不被欢迎? 这里记录下一些我个人的看法(博主也曾有面试新员工的经历) ...

  3. 测开之路六十二:接口测试平台之公共的js、html、平台入口

    common.js //定义后台的host和端口var host = 'http://192.168.xxx.1:8000'; //'http://127.0.0.1:8000'; //用于发送htt ...

  4. Python算法每日一题--002--求众数

    给定一个大小为 n 的数组,找到其中的众数.众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素. 你可以假设数组是非空的,并且给定的数组总是存在众数. 示例 1: 输入: [3,2,3]输出: 3示 ...

  5. 【题解】4879. 【NOIP2016提高A组集训第11场11.9】少女觉

    Description 在幽暗的地灵殿中,居住着一位少女,名为古明地觉.据说,从来没有人敢踏入过那座地灵殿,因为人们恐惧于觉一族拥有的能力——读心.掌控人心者,可控天下. 咳咳.人的记忆可以被描述为一 ...

  6. Gradient Vanishing Problem in Deep Learning

    在所有依靠Gradient Descent和Backpropagation算法来学习的Neural Network中,普遍都会存在Gradient Vanishing Problem.Backprop ...

  7. Windows系统命令整理-Win10

    硬件相关 显卡 显卡升级 - 我的电脑->属性->设备管理器->显示适配器->更新驱动程序 服务 telnet 安装:启用或关闭Windows 功能,勾选上“Telnet客户端 ...

  8. [Linux] 018 关机重启命令

    1. shutdown 命令 $ shutdown [选项] 时间 选项 -c 取消前一个关机wgwy -h 关机 -r 重启 2. 其他关机命令 $ halt $ poweroff $ init 0 ...

  9. [BZOJ1901][luogu2617]Dynamic Rankings(树状数组+主席树)

    题面 单点修改,区间求第k大 分析 首先,这道题卡权值线段树套treap的做法,所以只能用主席树做 对于静态的查询,root[i]对应的主席树的区间[l,r]保存的是a[1]~a[i]有多少个值落在区 ...

  10. JVM(14)之 类加载机制

    开发十年,就只剩下这套架构体系了! >>>   从本篇博文开始,我们就进入虚拟机类加载机制的学习了.那么什么是类加载呢?当我们写完一个Java类的时候,并不是直接就可以运行的,它还要 ...