2014-09-01 1 views
1

삽입 쿼리를하기 전에 메모의 내용을 확인하고 있습니다.빈 메모 삽입 방지

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

memo1에는 아무 것도없는 한 괜찮습니다. 그러나 사용자가 빈 메모를 입력하고 커서가 을 두 번째 줄로 이동하면 쿼리를 실행하면 메모에 아무 것도 표시되지 않고 경고 메시지없이 삽입 메시지가 발생합니다. 이것을 방지 할 수있는 방법이 있습니까?

+0

내 호기심에 사로 잡히지 만, 메모에있는 내용이 db 필드에 쓰여지는지, 그렇지 않으면 TDBMemo를 사용하지 않는 이유는 무엇입니까? – MartynA

+0

@MartynA 데이터 바인딩 된 컨트롤은 많은 사람들에게 큰 노 - no입니다. 대부분의 경우 데이터베이스에 대한 공개 트랜잭션을 유지하는데 이는 대부분의 경우에 좋지 않은 권고를받습니다. – mg30rg

+0

@ mg30rg 좋은 지적.3 단계/CDS 방식으로 일을 처리하는 데 익숙해졌습니다. DBX 나 FD를 사용하는 이전 q의 인상을 받았다. 클라이언트와 서버 프로세스를 분리하는 측면에서 보면 거의 같다. – MartynA

답변

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

+0

위의 설명을 무시하십시오. - Trim()은 실제로 인쇄 할 수없는 문자를 모두 제거합니다. 내 잘못이야. – Deltics

+0

메모가 많은 텍스트를 가지고있을 때 이것은 매우 비효율적입니다 –

1

RETURN을 누르면 사용자가 메모에 추가 라인을 초래하는 경우에, 당신은 속성이 TRUE로 설정 WantReturns이, 그리고해야한다 OnKeyPress 또는 OnKeyDown 이벤트는 # 13 키를 처리하거나 VK_RETURN 가상 키 코드를 처리합니다.

그런 다음 사용자가 CTRL +는 새로운 라인을 삽입 할 ENTER를 사용해야합니다 FALSE로 WantReturns을 설정 한 경우와 RETURN 키의 간단한 눈에 띄는 하지은 빈 줄을 삽입합니다.

사용자 인터페이스가 현재 작동하는 방식에 만족하고 단순히 메모에 공백 만 포함되어 있는지 확인하려면 자르기 (Memo.Text) 또는 일부를 사용하여 별도로 유효성을 검사해야합니다. "비어 있지 않다"라는 애플리케이션 정의를 충족시키기 위해 메모의 내용을 테스트하는 메커니즘. 단순히 공백이 아닌 문자의 존재를 테스트하기 위해 트림() Memo.Text에를 사용하여 다른 사람이 언급 한 것처럼

은,이 사건에 얼마나 많은 관심을하지만, 잠재적으로 매우 비효율적이다 신청서에 예상되는 메모 내용에 크게 의존하게됩니다.

A A 공백이 아닌 문자열을 테스트하는보다 효율적인 방법은 다음과 같습니다

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 쌍 제거되지 않을 것 "* 잘못되었습니다. Trim의 설명서를 참조하십시오. –

+0

흥미 롭군요 ... Delphi의 어떤 버전을 Deltics와 함께 사용하고 있습니까? – trooper

+0

자, 맞습니다. Trim()은 인쇄되지 않는 문자를 모두 제거합니다. 내 잘못이야. – Deltics