能请教高手关于MaskEdit控件的输入限制使用技巧么 |
尚未結案
|
sailorjoye
一般會員 發表:11 回覆:18 積分:5 註冊:2003-05-13 發送簡訊給我 |
|
pedro
尊榮會員 發表:152 回覆:1187 積分:892 註冊:2002-06-12 發送簡訊給我 |
|
channel
尊榮會員 發表:67 回覆:707 積分:854 註冊:2002-05-02 發送簡訊給我 |
引言: 能请教高手关于MaskEdit控件的输入限制使用技巧么,它自带的属性并不好用,如何才能顺利控制用户的输入? 比如将其MaskEdit属性确定为ShotTime 可是用户输入55:00也不会出现报错! 我是新手,如何解决,还望有高手指点迷津,不胜感激~~< src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=9503945&CC=212555"> 凤翅天翔, 无比彷徨! procedure TForm1.MaskEdit1Exit(Sender: TObject); begin try StrToTime(MaskEdit1.Text); except raise Exception.Create('時間輸入錯誤'); end; end;~小弟淺見,參考看看~
------
~小弟淺見,參考看看~ |
wnhoo
高階會員 發表:75 回覆:443 積分:198 註冊:2003-04-22 發送簡訊給我 |
将我在编程中使用该软件的一点体会写出,供您参考! 1、MaskEdit控件的使用方法:
MaskEdit控件最重要的属性是其 EditMask属性,它用一个特定的字符串作为掩码(Mask)用来控制用户输入的字符。每个掩码由三部分组成,各部分之间用“;”分隔。掩码的第一部分是掩码值本身;第二部分决定了是否保存书面字符;第三部分控制空字符的显示(默认显示为“_”)。
第一部分用一些预先定义的字符串掩码来表示用户可以输入的字符集。如“!99/99/00;1;_”当中,第一个“!”表示TMaskEdit.Text值中不包含前后的空格字符;紧接着后面的“99”表示可以输入两位数字,但并不是必须输入;“/”是一个固定的字符,也叫作书面字符(Literal Characters),它固定地显示在规定的位置,用户在输入数据时不能修改。下面列出了在掩码中定义的常用特殊控制字符。
表一 常用的控制字符 字符 作用
! 使字符串前后的空格字符不包含在控件的Text属性值中
L 此处允许输入字母(A-Z或者a-z)。
I 此处允许输入字母(A-Z或者a-z),且可以为空。
A 此处允许输入字母和数字(A-Z、a-z或者0-9)。
A 此处允许输入字母和数字(A-Z、a-z或者0-9),且可以为空
0 此处仅仅允许输入数字,且不为空。
9 此处仅仅允许输入数字,可以为空。
: 常用来分隔时间,实际显示受控制面板中“区域设置”的影响
/ 常用来分隔日期,实际显示受控制面板中“区域设置”的影响
_ 自动插入空格。 第二部分用“0”或“1”来表示是否把书面字符(Literal Characters)作为字符串值的一部分。当为“1”时,书面字符也作为字符串值的一部分存入 TMaskEdit.Text值中。
第三部分定义了空字符的显示方式,如在掩码“!99/99/00;1;_”中,用“_”来显示空字符。需要注意的是,这里所谓的空字符实际上在 Borland公司的文档中的实际意思是 UnEntered Characters,即未输入的字符,而不是空格(“Space”)。这意味着所有未输入的字符以“_”显示,但是实际上空格字符也还是用“_”显示。 2、利用MaskEdit控件输入日期:
①由于MaskEdit控件的EditMask 属性的默认日期格式为“!99/99/00;1;_”,因此日期的后两位必须输入。而实际工作中往往由程序自动提供日期的后两位,或者用户有时只输入了一位日期,在窗口的焦点离开该控件时就会出现英文提示“Invalid input value,Use escape key to abandon changes!”。所以我们应该自定义一个符合我们需要的日期格式的掩码为“!99/99/99;1;_”,其后两位不输入的时候就不会出错。(注意:其日期的后两位必须事先赋值,以免转换时出错。)
②默认的掩码格式中,空字符用下划线“_”表示,这多少有点不太美观,也不太符合我们日常生活中空格用“0”填充的习惯。我们可以将其改为“0”,方法是把MaskEdit的掩码改为“!99/99/99;1;0”。
③将MaskEdit的空字符改为“0”后,会出现一个问题是:Delphi把10、20、30这样的正常的日期值认为中的“0”都认为是空字符,在提取字符串的值时予以删除,在调用TMaskEdit.Text属性时,10、20、30这样的值都变成了1、2、3,这就出现了错误的结果。解决问题的方法是改用TMaskEdit.EditText属性来代替Text属性。前者是调用MaskEdit上的书面值,即显示的字符串形式(包含空格符),而后者是该控件的实际字符值(不含空格符)。
经过上述处理过程,日期格式的文字输入框将显示为类似“99/05/01”这样的样式而不是原来“99/_5/_1”的形式。这就比原来的格式更适合我们的习惯。 3、使MaskEdit控件响应回车键与光标键。
由于在Windows环境下,软件编写时忽视了键盘的可操作性,许多软件在输入数据时移动光标只能使用鼠标,导致在输入数据时需要混用键盘和鼠标,手忙脚乱,缺乏效率。这个问题的解决办法是使MaskEdit控件相应回车键,以使焦点(光标)在多个MaskEdit控件之间移动,方便用户输入。
为此,我们先将MaskEdit的窗体(假设为Form1)的KeyPreview属性设为True。然后在FormKeyPress事件中加入如下代码:
procedure TForm1.FormKeyPress(Sender:TObject;var Key:Char);
begin
if Key=#13 then
begin
Key:=#0;
Perform(WM_NEXTDLGCTL,0,0);
end;
end;
另外,我们也可以直接在MaskEdit的OnKeyPress事件句柄中增加其对回车键及上下光标键的支持,方法大家可以参考有关的书籍。但是必须注意的是,我们不要把MaskEdit对回车键的响应程序也放在OnKeyUp事件处理程序中,因为若是因某种原因而出现了错误的输入值,例如前边所述的“!99/99/00;1;_”日期掩码中,由于用户只输入了一位日期值会出现英文提示“Invalid input value,Use escape key to abandon changes!”,这时用户按回车键会再次出现提示,反复循环,除非使用鼠标,否则无法退出。 發表人 - wnhoo 於 2003/05/13 13:43:50
------
风花雪月 e梦情缘 |
sailorjoye
一般會員 發表:11 回覆:18 積分:5 註冊:2003-05-13 發送簡訊給我 |
首先感谢pedro大虾和channel大虾提供的查核码:)
其次是感谢wnhoo大虾的详细入微的指导,使我获益非浅^-0-^
在此拜谢……
我还有个问题是当我把MaskEdit的掩码改为“!0000-!00-00 !90:90;1;_”,
希望显示格式是:2003-05-13 13:43,即日期与时间的结合(中间有空格),
该如何书写查核码?并且我想把Text的内容作为字符串,望能够进行大小比
较,请问我该如何做?还望各位先行不吝赐教。
< src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=9518969&CC=212891"> 凤翅天翔, 无比彷徨!
------
凤翅天翔, 无比彷徨! |
sailorjoye
一般會員 發表:11 回覆:18 積分:5 註冊:2003-05-13 發送簡訊給我 |
首先感谢pedro大虾和channel大虾提供的查核码:)
其次是感谢wnhoo大虾的详细入微的指导,使我获益非浅^-0-^
在此拜谢……
我还有个问题是当我把MaskEdit的掩码改为“!0000-!00-00 !90:90;1;_”,
希望显示格式是:2003-05-13 13:43,即日期与时间的结合(中间有空格),
该如何书写查核码?并且我想把Text的内容作为字符串,望能够进行大小比
较,请问我该如何做?还望各位先行不吝赐教。
凤翅天翔, 无比彷徨!
------
凤翅天翔, 无比彷徨! |
wnhoo
高階會員 發表:75 回覆:443 積分:198 註冊:2003-04-22 發送簡訊給我 |
MaskEdit的掩码为“!0000-!00-00 !90:90;1;_”
//比较字符
procedure TForm1.BitBtn1Click(Sender: TObject);
var
tmp:string;
begin
tmp:='2003-05-14 10:30';
if trim(MaskEdit1.Text)=trim(tmp) then
showmessage('ok')
else
showmessage('fail');
end; 风花雪月 e梦情缘
------
风花雪月 e梦情缘 |
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
驗証是否合法的日期時間格式 :
uses DateUtils procedure TForm1.MaskEdit1Exit(Sender: TObject); begin try EncodeDateTime(StrToInt(Copy(MaskEdit1.Text,1,4)), StrToInt(Copy(MaskEdit1.Text,6,2)), StrToInt(Copy(MaskEdit1.Text,9,2)), StrToInt(Copy(MaskEdit1.Text,12,2)), StrToInt(Copy(MaskEdit1.Text,15,2)),0,0); except MaskEdit1.SetFocus; ShowMessage('不正確的時間日期!請重新輸入。'); end; end;最好先用上述 EncodeDateTime 轉化為時間再對比 : var DateTime1, DateTime2 : TDateTime begin DateTime1 := EncodeDateTime(......); DateTime2 := EncodeDateTime(......); if DateTime1 > DateTime2 then .... else .... end;但若你肯定兩個對比文字的格式均無錯也可用文字直接對比。 |
sailorjoye
一般會員 發表:11 回覆:18 積分:5 註冊:2003-05-13 發送簡訊給我 |
在此再次感谢wnhoo先进的指导^&!^您书写的查核码简洁明了:)
等我TRY一下trim(tmp)的用法
同时向Justmade先进敬礼,您肯定兩個對比文字的格式均無錯的话
即可用文字直接對比么?
比如说“2003-05-14 10:30”和“2003-05-14 10:30”可以直接对
比么?中间有空格呀……再有:我不知道用EncodeDateTime函数后能
否实现复合格式对比,等我试试……
在此向各位前辈敬礼!! 凤翅天翔, 无比彷徨!
------
凤翅天翔, 无比彷徨! |
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
字串對比
中間有空格只要格式一致是沒問題的,只要不是一個多點空格一個少點空格,即使頭尾也有空格也沒問題,最重要的是兩個的格式(含空白)是完全一致的。
你可以下列 code 自己試試 ShowMessage(BoolToStr('2003-05-14 10:31' >= '2003-05-14 10:30',true)); 自己改改日期時間及 比對符號便可試不同情況 但是我始終認為轉回日期格式對比會好些,因為
1. 肯定不會是不正當的日期 如 '2003-02-29 25:61'
2. 比較快
3. 不用擔心會否多了個空格等的問題
4. 你若和別的時間對比(如 now)不用將別的時間轉做文字格式如 :
var DateTime1 : TDateTime begin DateTime1 := EncodeDateTime(......); if DateTime1 > Now then .... else .... end; |
sailorjoye
一般會員 發表:11 回覆:18 積分:5 註冊:2003-05-13 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
不會罷,我剛重新開個專案(之前試的刪了)輸入你說的日期沒問題丫 MastEdit1 的 EditMask : !0000-!00-00 !90:90;1;_
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, DBCtrls, StdCtrls, DB, DBTables, Mask, DateUtils; type TForm1 = class(TForm) MaskEdit1: TMaskEdit; Edit1: TEdit; procedure MaskEdit1Exit(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.MaskEdit1Exit(Sender: TObject); begin try EncodeDateTime(StrToInt(Copy(MaskEdit1.Text,1,4)), StrToInt(Copy(MaskEdit1.Text,6,2)), StrToInt(Copy(MaskEdit1.Text,9,2)), StrToInt(Copy(MaskEdit1.Text,12,2)), StrToInt(Copy(MaskEdit1.Text,15,2)),0,0); except MaskEdit1.SetFocus; ShowMessage('不正確的時間日期!請重新輸入。'); end; end; end. |
wnhoo
高階會員 發表:75 回覆:443 積分:198 註冊:2003-04-22 發送簡訊給我 |
//转化成为日期时间型比较
procedure TForm1.Button2Click(Sender: TObject);
var
tmp:string;
mydate:tdatetime;
begin
try
tmp:='2003-05-14 10:30';
mydate:=StrToDateTime(tmp);
if StrToDateTime(trim(MaskEdit1.Text) ':00')>mydate then
showmessage('MASKEDIT.TEXT is max')
else
showmessage('MASKEDIT.TEXT is min'); except
showmessage('无效日期时间类型输入!');
end;
end; 风花雪月 e梦情缘
------
风花雪月 e梦情缘 |
sailorjoye
一般會員 發表:11 回覆:18 積分:5 註冊:2003-05-13 發送簡訊給我 |
wnhoo先进:您的查核码我试过了(您的代码在输入错误的情况下依然
可以把焦点转移,程序能够退出),非常准确~再次拜谢! procedure TFormG.MaskEdit2Exit(Sender: TObject);
var
tmp:string;
mydate:tdatetime;
begin
try
tmp:='2003-05-14 10:30';
mydate:=StrToDateTime(tmp);
if StrToDateTime(trim(MaskEdit2.Text)+':00')>mydate
then
showmessage('MASKEDIT.TEXT is max')
else
showmessage('MASKEDIT.TEXT is min');
except
showmessage('无效日期时间类型输入!');
end; end; Justmade斑竹前辈,您的查核码经验证亦无误(您的代码在输入错误的情况
下不能够把焦点转移,必须输入正确才能够退出),不胜感激! uses DateUtils;
procedure TFormG.MaskEdit1Exit(Sender: TObject);
begin
try
EncodeDateTime(StrToInt(Copy(MaskEdit1.Text,1,4)),
StrToInt(Copy(MaskEdit1.Text,6,2)),
StrToInt(Copy(MaskEdit1.Text,9,2)),
StrToInt(Copy(MaskEdit1.Text,12,2)),
StrToInt(Copy(MaskEdit1.Text,15,2)),0,0);
except
MaskEdit1.SetFocus;
ShowMessage('不正確的時間日期!請重新輸入。');
end;
end;< src=""> 凤翅天翔, 无比彷徨!
------
凤翅天翔, 无比彷徨! |
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
|
sailorjoye
一般會員 發表:11 回覆:18 積分:5 註冊:2003-05-13 發送簡訊給我 |
Justmade先进:
您说的是wnhoo的查核码吗?我还不知道该选哪一个查核码呢?
我试了您书写的代码,我作了少许改动,如下:
procedure TFormG.MaskEdit2Exit(Sender: TObject);
var
tmp:string;
mydate:tdatetime;
begin
try
tmp:='2003-05-16 10:30';
mydate:=StrToDateTime(tmp);
if StrToDateTime(trim(MaskEdit2.Text) ':00') < mydate
then
showmessage('请输入预计划的时间!')
except
showmessage('不正確的時間日期!請重新輸入!');
end;
end; 您看如何?
在此感谢Justmade前辈。 还有能否请教您一下,您的查核码如何改动才能够在
提示信息结束后允许转移焦点呢? 凤翅天翔, 无比彷徨!
------
凤翅天翔, 无比彷徨! |
sailorjoye
一般會員 發表:11 回覆:18 積分:5 註冊:2003-05-13 發送簡訊給我 |
Justmade先进:
您说的是wnhoo先进的查核码吗?我还不知道该选哪一个查核码呢?
(我试了您书写的代码,很好用,就是不输入一个正确格式的时间,
程序不能够退出!),我将wnhoo先进的查核码作了少许改动,如下:
procedure TFormG.MaskEdit2Exit(Sender: TObject);
var
tmp:string;
mydate:tdatetime;
begin
try
tmp:='2003-05-16 10:30';
mydate:=StrToDateTime(tmp);
if StrToDateTime(trim(MaskEdit2.Text) ':00') < mydate
then
showmessage('请输入预计划的时间!')
except
showmessage('不正確的時間日期!請重新輸入!');
end;
end; 您看如何?
在此感谢Justmade前辈。 还有能否请教您一下,您的查核码如何改动才能够在
提示信息结束后允许转移焦点呢? 凤翅天翔, 无比彷徨!
------
凤翅天翔, 无比彷徨! |
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
不輸入正確代碼就不許移出,是檢查的正常手法,否則讓使用者不用修改保持錯誤,到執行其他部份時(如與其他時間比對或存檔)便會失去控制了。 若你真的要任由使用者不用修改,刪除
MaskEdit1.SetFocus
就可以了 老實說,只幾句程式碼,任何一個初學的程式師都可以看得出是這句不給使用者離開的。 不過你既然選擇 Wnhoo 的答案,還是用他的版本罷,要不然就好像不是按解答而是有其他私人原因來給分了。 等分發後收到客戶投訴再修改也不遲。←不是說容不容許移出的問題 發表人 - Justmade 於 2003/05/16 09:13:37
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |