2014-09-01 109 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