2014-09-01 70 views
1

我在插入查询之前检查备忘录的内容。防止插入空白备忘录

if memo1.lines.Text = '' then begin 
showmessage('Warning:Missing data!'); 
abort; 
end else .... 

只要备忘录1中没有任何内容,它就可以正常工作。 但是,当用户点击进入空白备忘录内部并且光标移动到第二行时,运行查询,在没有警告消息的情况下触发插入, 尽管备注中没有任何内容。 有没有办法来防止这种情况?

+0

请原谅我的好奇心,但是请不要将备忘录写到数据库字段中,如果是这样,为什么不使用TDBMemo? – MartynA 2014-09-02 06:34:11

+0

@MartynA对于很多人来说,Databound控件是一个很大的禁忌。他们中的大多数人对数据库进行了公开交易,在大多数情况下,这是非常不明智的。 – mg30rg 2014-09-02 07:53:36

+0

@ mg30rg好点。我很习惯做我忽视的三层/ CDS方式。请注意,从前面的问题来看,我认为OP在使用DBX或FD,这与从服务器进程隔离客户端方面几乎是一回事。 – MartynA 2014-09-02 07:58:46

回答

2

用户点击后输入您的备忘录的文本包含空白(线返回),因此它不等于''。

您需要先修剪文本。 http://docwiki.embarcadero.com/Libraries/XE2/en/System.SysUtils.Trim

var 
    memoText : String; 

...

memoText := Trim(memo1.lines.Text); 
if memoText = '' then 
begin 
    showmessage('Warning:Missing data!'); 
    abort; 
end else .... 
+0

这不起作用。 Trim()仅删除字符串中的前导和尾随空格。它不会删除将在TStrings列表中分隔多行(甚至空白行)的CR/LF。 – Deltics 2014-09-01 22:53:50

+0

忽略上面的注释 - 修剪()确实会删除所有非打印字符。我的错。 – Deltics 2014-09-01 23:47:59

+0

当备忘录中有大量文字时,这是非常低效的 – 2014-09-02 00:22:50

1

如果用户按下回车是导致该备忘录的附加导线,那么你必须有WantReturns属性设置为TRUE ,和OnKeyPressOnKeyDown处理#13键的事件或VK_RETURN虚拟键码。

如果设置WantReturns为FALSE,则用户必须使用CTRL + ENTER插入新行,和回车键的简单醒目将插入一个空行。

但是,如果你很高兴与您的用户界面目前的行为方式,只是要检查的备忘录是否包含只有空白,那么你将不得不单独验证此使用TRIM(Memo.Text)或其他一些用于测试备忘录内容的机制以满足您的应用程序定义“不为空”。

正如其他人指出,使用TRIM()Memo.Text只是为了测试的非空白字符的存在可能是非常低效的,但如何关心的与其说这是你的情况将取决于您申请中备忘录的预期内容。

甲以测试非空白串更加有效的方式将是:

function ContainsOnlyWhitespace(const aString: String): Boolean; 
var 
    i: Integer; 
begin 
    result := FALSE; 

    for i := 1 to Length(aString) do 
    if (aString[i] > ' ') then 
     EXIT; 

    result := TRUE; 
end; 

这将是如此使用:

if ContainsOnlyWhitespace(Memo.Text) then 
begin 
    // show warning message etc... 
end; 

这将是显著比修剪更有效(),因为它不涉及生成任何新字符串或修改正在测试的字符串。

+2

*“CR/LF pair这将不会被删除“*这是不正确的,请参阅修剪文档。 – 2014-09-01 22:57:15

+0

有趣...你在和Deltics一起工作什么版本的Delphi? – trooper 2014-09-01 22:59:05

+0

糟糕,您是对的,修剪()会删除所有非打印字符。我的错。 – Deltics 2014-09-01 23:42:15