Q&A

  • A~Z까지 유효검사를 하는 문제입니다.
아래 내용은 입력처리 조건을 처리하는 부분입니다.



문제는 조건4.우수고객등급은 영문 1자리 A~Z까지 입력이라는 조건인데

if 문을 쓰면 너무 복잡할것 같아서

상수와 for문을 사용했는데 적정한 데이타를 입력시켜도 에러메시지가 나옵니다.



어디가 잘못된 것인지 이해가 가질 않습니다

설명을 좀 부탁드립니다.



덧붙여 기사시험을 준비하면서 델파이를 강의하는 학원이 없어 이곳에서 많은 도움을 얻었는데

지금까지 제 질문에 답변해 주신 분들께도 고맙다는 인사를 드립니다.

행복하세요..





procedure TForm1.Button1Click(Sender: TObject);

var i, j: integer;

const

temp : array[1..26] of string = ('A', 'B', 'C', 'D', 'E', 'F', 'G',

'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',

'U', 'V', 'W', 'S', 'Y', 'Z');

begin

count := count +1;



if count > 7 then

begin

showmessage('최대입력건수를 초과했습니다');

count := count -1;

exit;

end;



if (edit1.text = '') or (edit2.text = '') or

(edit3.text = '') or (edit4.text = '') then

begin

showmessage('필수입력항목입니다');

count := count -1;

exit;

end;



//조건1. 고객번호는 정수3자리, 중복입력불가

case strtoint(edit1.text) of

1..999 :

else

begin

showmessage('고객번호는 정수 3자리입니다');

count := count -1;

edit1.setfocus;

exit;

end;

end;



for i:= 1 to count-1 do

begin

if edit1.text = in_data[i].in1 then

begin

showmessage('이미 등록된 고객번호가 존재합니다');

count := count -1;

edit1.setfocus;

exit;

end;

end;



//조건2. 상품코드는 영문1자리, 정수1자리(코드화)

if (uppercase(edit2.text) <> 'Q1') and

(uppercase(edit2.text) <> 'Q2') and

(uppercase(edit2.text) <> 'Q3') and

(uppercase(edit2.text) <> 'Q4') and

(uppercase(edit2.text) <> 'Q5') and

(uppercase(edit2.text) <> 'Q6') then

begin

showmessage('잘못된 상품코드입니다');

count := count -1;

edit2.setfocus;

exit;

end;



//조건3. 판매수량은 정수 1-99

case strtoint(edit3.text) of

1..99 :

else

begin

showmessage('판매수량은 정수 2자리입니다');

count := count -1;

edit3.setfocus;

exit;

end;

end;



//조건4. 우수고객등급은 영문1자리 A~Z까지 입력 ---> 에러발생

for j := 1 to 26 do

if uppercase(edit4.text) <> temp[j] then

begin

showmessage('우수고객등급은 A~Z까지입니다');

count := count -1;

edit4.setfocus;

exit;

end;



with in_Data[count] do

begin

in1 := edit1.text;

in2 := edit2.text;

in3 := edit3.text;

in4 := edit4.text;

end;



edit1.text := '';

edit2.text := '';

edit3.text := '';

edit4.text := '';



edit1.setfocus;

end;



4  COMMENTS
  • Profile
    정성훈 2001.07.10 20:33
    이금선 wrote:

    > 아래 내용은 입력처리 조건을 처리하는 부분입니다.

    >

    > 문제는 조건4.우수고객등급은 영문 1자리 A~Z까지 입력이라는 조건인데

    > if 문을 쓰면 너무 복잡할것 같아서

    > 상수와 for문을 사용했는데 적정한 데이타를 입력시켜도 에러메시지가 나옵니다.

    >

    > 어디가 잘못된 것인지 이해가 가질 않습니다

    > 설명을 좀 부탁드립니다.

    >

    > 덧붙여 기사시험을 준비하면서 델파이를 강의하는 학원이 없어 이곳에서 많은 도움을 얻었는데

    > 지금까지 제 질문에 답변해 주신 분들께도 고맙다는 인사를 드립니다.

    > 행복하세요..

    >

    >

    > procedure TForm1.Button1Click(Sender: TObject);

    > var i, j: integer;

    > const

    > temp : array[1..26] of string = ('A', 'B', 'C', 'D', 'E', 'F', 'G',

    > 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',

    > 'U', 'V', 'W', 'S', 'Y', 'Z');

    > begin

    > count := count +1;

    >

    > if count > 7 then

    > begin

    > showmessage('최대입력건수를 초과했습니다');

    > count := count -1;

    > exit;

    > end;

    >

    > if (edit1.text = '') or (edit2.text = '') or

    > (edit3.text = '') or (edit4.text = '') then

    > begin

    > showmessage('필수입력항목입니다');

    > count := count -1;

    > exit;

    > end;

    >

    > //조건1. 고객번호는 정수3자리, 중복입력불가

    > case strtoint(edit1.text) of

    > 1..999 :

    > else

    > begin

    > showmessage('고객번호는 정수 3자리입니다');

    > count := count -1;

    > edit1.setfocus;

    > exit;

    > end;

    > end;

    >

    > for i:= 1 to count-1 do

    > begin

    > if edit1.text = in_data[i].in1 then

    > begin

    > showmessage('이미 등록된 고객번호가 존재합니다');

    > count := count -1;

    > edit1.setfocus;

    > exit;

    > end;

    > end;

    >

    > //조건2. 상품코드는 영문1자리, 정수1자리(코드화)

    > if (uppercase(edit2.text) <> 'Q1') and

    > (uppercase(edit2.text) <> 'Q2') and

    > (uppercase(edit2.text) <> 'Q3') and

    > (uppercase(edit2.text) <> 'Q4') and

    > (uppercase(edit2.text) <> 'Q5') and

    > (uppercase(edit2.text) <> 'Q6') then

    > begin

    > showmessage('잘못된 상품코드입니다');

    > count := count -1;

    > edit2.setfocus;

    > exit;

    > end;

    >

    > //조건3. 판매수량은 정수 1-99

    > case strtoint(edit3.text) of

    > 1..99 :

    > else

    > begin

    > showmessage('판매수량은 정수 2자리입니다');

    > count := count -1;

    > edit3.setfocus;

    > exit;

    > end;

    > end;

    >

    > //조건4. 우수고객등급은 영문1자리 A~Z까지 입력 ---> 에러발생

    > for j := 1 to 26 do

    > if uppercase(edit4.text) <> temp[j] then

    > begin

    > showmessage('우수고객등급은 A~Z까지입니다');

    > count := count -1;

    > edit4.setfocus;

    > exit;

    > end;

    >

    > with in_Data[count] do

    > begin

    > in1 := edit1.text;

    > in2 := edit2.text;

    > in3 := edit3.text;

    > in4 := edit4.text;

    > end;

    >

    > edit1.text := '';

    > edit2.text := '';

    > edit3.text := '';

    > edit4.text := '';

    >

    > edit1.setfocus;

    > end;

    >





    안녕하세요.

    FOR는 루프인데 결과가 같아도 계속 반복되니 메시지 출력은 당연합니다.

    BREAK 하나 추가하시면 됩니다.

    그럼 20000



    > //조건4. 우수고객등급은 영문1자리 A~Z까지 입력 ---> 에러발생

    > for j := 1 to 26 do

    > if uppercase(edit4.text) <> temp[j] then

    > begin

    > showmessage('우수고객등급은 A~Z까지입니다');

    > count := count -1;

    > edit4.setfocus;

    > exit;



    end //이부분을 이렇게



    end else begin

    ShowMessage( '당신은 우수고객이시네요^^*' );

    Break;

    end;





  • Profile
    이금선 2001.07.11 04:36
    정성훈 wrote:





    >

    > 안녕하세요.

    > FOR는 루프인데 결과가 같아도 계속 반복되니 메시지 출력은 당연합니다.

    > BREAK 하나 추가하시면 됩니다.

    > 그럼 20000

    >

    > > //조건4. 우수고객등급은 영문1자리 A~Z까지 입력 ---> 에러발생

    > > for j := 1 to 26 do

    > > if uppercase(edit4.text) <> temp[j] then

    > > begin

    > > showmessage('우수고객등급은 A~Z까지입니다');

    > > count := count -1;

    > > edit4.setfocus;

    > > exit;

    >

    > end //이부분을 이렇게

    >

    > end else begin

    > ShowMessage( '당신은 우수고객이시네요^^*' );

    > Break;

    > end;

    >

    >



    답변 감사합니다.

    그런데 설명은 이해를 하겠는데 break를 사용했는데도 문제가 해결되질 않습니다.

    마찬가지로 A를 입력해도 에러 메시지('우수고객등급은 A~Z까지입니다')가 나타납니다

    다시 한번 제가 올린 소스를 보셔서 설명해 주시면 고맙겠습니다





  • Profile
    뽀록이 2001.07.11 23:38
    안녕하세요

    전 그렇게 복잡하게 안 할거 같은데요

    이렇게 함 안 될까요>>>>>>>>>>???????



    if not ((edit4.text[1]) in ['A'..'Z']) then

    showmessage('우수고객등급은 A~Z까지입니다');



    이렇게 해두 될꺼 같은데요........



    즐코딩 하세요

















    이금선 wrote:

    > 정성훈 wrote:

    >

    >

    > >

    > > 안녕하세요.

    > > FOR는 루프인데 결과가 같아도 계속 반복되니 메시지 출력은 당연합니다.

    > > BREAK 하나 추가하시면 됩니다.

    > > 그럼 20000

    > >

    > > > //조건4. 우수고객등급은 영문1자리 A~Z까지 입력 ---> 에러발생

    > > > for j := 1 to 26 do

    > > > if uppercase(edit4.text) <> temp[j] then

    > > > begin

    > > > showmessage('우수고객등급은 A~Z까지입니다');

    > > > count := count -1;

    > > > edit4.setfocus;

    > > > exit;

    > >

    > > end //이부분을 이렇게

    > >

    > > end else begin

    > > ShowMessage( '당신은 우수고객이시네요^^*' );

    > > Break;

    > > end;

    > >

    > >

    >

    > 답변 감사합니다.

    > 그런데 설명은 이해를 하겠는데 break를 사용했는데도 문제가 해결되질 않습니다.

    > 마찬가지로 A를 입력해도 에러 메시지('우수고객등급은 A~Z까지입니다')가 나타납니다

    > 다시 한번 제가 올린 소스를 보셔서 설명해 주시면 고맙겠습니다

    >

    >

  • Profile
    정성훈 2001.07.11 06:32
    이금선 wrote:

    > 정성훈 wrote:

    >

    >

    > >

    > > 안녕하세요.

    > > FOR는 루프인데 결과가 같아도 계속 반복되니 메시지 출력은 당연합니다.

    > > BREAK 하나 추가하시면 됩니다.

    > > 그럼 20000

    > >

    > > > //조건4. 우수고객등급은 영문1자리 A~Z까지 입력 ---> 에러발생

    > > > for j := 1 to 26 do

    > > > if uppercase(edit4.text) <> temp[j] then

    > > > begin

    > > > showmessage('우수고객등급은 A~Z까지입니다');

    > > > count := count -1;

    > > > edit4.setfocus;

    > > > exit;

    > >

    > > end //이부분을 이렇게

    > >

    > > end else begin

    > > ShowMessage( '당신은 우수고객이시네요^^*' );

    > > Break;

    > > end;

    > >

    > >

    >

    > 답변 감사합니다.

    > 그런데 설명은 이해를 하겠는데 break를 사용했는데도 문제가 해결되질 않습니다.

    > 마찬가지로 A를 입력해도 에러 메시지('우수고객등급은 A~Z까지입니다')가 나타납니다

    > 다시 한번 제가 올린 소스를 보셔서 설명해 주시면 고맙겠습니다

    >

    >





    안녕하세요

    혹시나 해서 제가 테스트해봤는데 문제가 없네요.



    A-Z 면 통과이고 아니면 메시지를 띄우는거 맞죠?

    그러다가 count 값이 계속 감소하면 어떤처리를 하는거구요?

    그냥 Break 만 다시 한번 해보십시요





    procedure TForm1.Button1Click(Sender: TObject);

    var i, j: integer;

    count : Integer;

    const

    temp : array[1..26] of string = ('A', 'B', 'C', 'D', 'E', 'F', 'G',

    'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',

    'U', 'V', 'W', 'S', 'Y', 'Z');

    begin

    for j := 1 to 26 do

    if uppercase(edit4.text) < temp[j] then

    begin

    showmessage('우수고객등급은 A~Z까지입니다');

    count := count -1;

    edit4.setfocus;

    exit;

    end else Break; //이부분 수정.



    {

    with in_Data[count] do

    begin

    in1 := edit1.text;

    in2 := edit2.text;

    in3 := edit3.text;

    in4 := edit4.text;

    end;



    edit1.text := '';

    edit2.text := '';

    edit3.text := '';

    edit4.text := '';



    edit1.setfocus;

    end;



    }

    end;