Q&A

  • 사용자 log-in문제입니다.
제가 맹글고 있는 프로그램은 간단한 자재관리 프로그램입니다.

그런데, .exe파일을 실행시켰을때, 바로 프로그램이 실행됩니다.



질문 하나.

앞부분에 사용자 로그인 폼을 만들어서 로그인과정을 거쳐서 사용이 가능하게 하려고 합니다.



먼저 login.db를 만들고, 폼을 만들면 사용자 로그인 과정은 가능하겟는데..

로그인과정이 확인되었을때, 프로그램 메인창이 뜨게 하는 방법을 모르겟습니다.



질문 둘.

로그인 앞부분에 프로그램의 로고화면을 잠깐 띄운다음에 로그인 확인창을 띄우려면 어떻게 해야 하나요..



고수님들의 자문 부탁합니다.



-좋은 하루 되세요-

2  COMMENTS
  • Profile
    토맛토 2001.06.21 20:34
    한보람 wrote:

    > 제가 맹글고 있는 프로그램은 간단한 자재관리 프로그램입니다.

    > 그런데, .exe파일을 실행시켰을때, 바로 프로그램이 실행됩니다.

    >

    > 질문 하나.

    > 앞부분에 사용자 로그인 폼을 만들어서 로그인과정을 거쳐서 사용이 가능하게 하려고 합니다.

    >

    > 먼저 login.db를 만들고, 폼을 만들면 사용자 로그인 과정은 가능하겟는데..

    > 로그인과정이 확인되었을때, 프로그램 메인창이 뜨게 하는 방법을 모르겟습니다.

    >

    > 질문 둘.

    > 로그인 앞부분에 프로그램의 로고화면을 잠깐 띄운다음에 로그인 확인창을 띄우려면 어떻게 해야 하나요..

    >

    > 고수님들의 자문 부탁합니다.

    >

    > -좋은 하루 되세요-



    1. 로그인폼 표시하기

    원리 :

    어플리케이션 초기화 과정 중에 로그인하기 위한 폼을 모달(modal)로 표시하고

    로그인이 성공한 후에 로그인 폼이 없어지면서 다음 과정으로 넘어가도록 합니다.



    구현설명 :

    View > Units누르시고 유닛 목록에서 프로젝트 파일 선택합니다.

    프로젝트파일의 소스코드가 보입니다.

    윗부분의 uses절에 Forms,Controls를 추가합니다.

    아래 begin...end 절의 내부가 다음과 흡사 할 것입니다.



    Application.Initialize;

    Application.CreateForm(TForm1, Form1);

    Application.CreateForm(TForm2, Form2);

    Application.Run;



    여기서 Form1은 메인윈도우 이고 Form2는 로그인 폼 윈도우라 가정하겠습니다.

    아직 로그인 윈도우를 만들지 않은 상태라면 폼을 하나 생성하십시오



    Application.CreateForm과 Application.Run 사이에 다음과 같이 코딩합니다.



    Application.Initialize;

    Application.CreateForm(TForm1, Form1);

    Application.CreateForm(TForm2, Form2);



    if form2.showmodal = mrOK then // 추가된 부분



    Application.Run;



    * 추가된 코드 설명 : form2를 모달폼으로 띄우고 form2에서 mrOK를 반환(로그인 성공일 경우만 mrOK를 반환하는 것입니다.)한 경우에 다음 코드 즉, Application.Run 을 실행하는 것입니다.



    다음은 Form2에 소스코드를 열어 로그인 과정에 관한 코드를 작성해 봅시다.

    폼에 ID와 Password를 입력 받을 TEdit과 버튼을 놓습니다.

    버튼을 누르면 DB에 접속하여 로그인을 확인하도록 코딩합니다.

    로그인 결과에 따라 다음과 같이 코딩합니다.

    var

    loginResult : boolean;



    begin



    ... // 로그인 검사 로그인 성공하면 loginResult := true로 하고 실패하면 loginResult := false로 합시다.



    if loginResult then

    modalResult := mrOK

    else

    showMessage('ID 또는 Password가 틀렸습니다.');



    * modalResult := mrOK란? : 모달로 띄운 폼을 닫으면서 폼을 띄웠던 곳에 반환값을 주는 것입니다. 여기서는 mrOK를 반환하도록 하며 위에서 mrOK가 반환될 경우에 다음 코드를 진행한다고 설명했습니다. 참고로 TForm의 ShowModal과 mrOK에 대하여 꼭 도움말을 읽어보십시오



    우선 모달폼이 제대로 동작하는지 보고 싶다면 로그인 폼에 시험을 위한 버튼을 두개 만들고 첫번째 버튼의 누름이벤트에 modalResult := mrOK;를 넣고 두번째 버튼의 누름 이벤트에 modalResult := mrCancel; 넣은후 프로그램을 시작해 보십시오

    로그인 폼에 먼저 뜹니다. 여기서 첫번째 버튼을 누르면 로그인 폼이 닫히면서 메인 폼이 뜨고 두번째 버튼을 누르면 로그인 폼이 닫히고 프로그램이 종료 됩니다.

    즉, modalResult := mrCancel;은 로그인에 실패한 경우를 말하며 일반적으로 두세번정도의 로그인 시도에 계속 실패한 결과일 것입니다.

    위의 코드에는 로그인 실패시 실패한 휫수등은 고려하지 않고 계속 재시도하는 경우입니다.



    2. 스플래쉬 윈도우 보이기(로고화면)

    원리 :

    로고화면보이기를 프로그래밍에서 보통 스플래쉬 윈도우라 부릅니다.

    프로그램을 시작하기 전에, 메인 쓰레드를 시작하기 전이죠(Application.Run), 스플래쉬 윈도우를 보이고 초기화 과정이 모두 끝난 후(다수의 Application.CreateForm) 다음으로 넘어 갑니다 .



    구현설명 :

    우선 아까와 같이 프로젝트 파일의 소스코드를 봅니다. 이제 1번과정의 로그인폼 보이기는 무시하고 스플래쉬 윈도우에 관해서만 설명드리겠습니다.

    uses절에 Forms,Windows를 추가합니다.

    스플래쉬 윈도우를 Form2로 만들었다고 가정 합니다.



    Application.CreateForm(TForm2, Form2);라고 되어 있는 코드를 지우거나 주석처리하여 실행되지 않도록 하십시오



    추가된 코드를 적용하여 결과적으로 다음과 같은 형태가 됩니다.



    Application.Initialize;



    Form2 := TForm2.Create(Application);

    Form2.Show;

    Form2.update;



    Application.CreateForm(TForm1, Form1);



    Form2.Hide;



    Application.Run;



    추가된 부분은 Application.Initialize;다음, Application.CreateForm(TForm1, Form1); 앞에 Form2를 동적으로 생성하여 표시하는 부분이 있고 Form1생성 후에 Form2를 감추는 코드가 있습니다.

    즉, Form2를 보인 후에 다른 폼들을 생성하는 과정이 모두 끝나면 Form2가 감추어 지는 것이지요

    그런데 이렇게 실행하면 대부분 Form2가 너무 빨리 없어집니다. Form1을 비롯하여 다른 폼을 로드하는데 거의 시간이 걸리지 않으니까요(초기화 과정이 너무 짧아서 그렇습니다.)

    초기화 과정이 짧은 것은 좋지만 스플래쉬 윈도우가 너무 빨리 없어지는 것은 좀 허무하니까 이렇게 하도록 하죠

    스플래쉬 윈도우의 표시 시간은 최소 5초로 하고 초기화 과정이 5초를 넘으면 초기화 과정이 끝나는 대로 스플래쉬 윈도우가 없어 집니다.

    별도의 변수 선언을 비롯하여 코드는 다음과 같이 바뀝니다.



    var

    splashShowTime : DWORD;



    begin

    Application.Initialize;

    Form2 := TForm2.Create(Application);

    Form2.Show;

    Form2.update;

    splashShowTime := GetTickCount;



    Application.CreateForm(TForm1, Form1);

    // ... 다른 폼 생성과 기타 초기화 과정코드를 여기에 넣습니다.



    while splashShowTime + 5000 > getTickCount do

    application.ProcessMessages;



    Form2.Hide;

    Application.Run;

    end.



    추가된 부분은 splashShowTime 변수가 선언되었고 getTickCount라는 함수와 while문으로 Application.ProcessMessage가 반복되는 것이 보입니다.

    splashShowTime := GetTickCount;은 스플래쉬 윈도우를 표시할 때의 시간을 저장한 것이고 while문은 초기화 과정이 끝난 후의 시간이 스플래쉬 윈도우표시시간으로 부터 5초가 될때 까지 기다린다는 뜻입니다.



    마지막으로 스플래쉬 윈도우는 항상 화면 가운데에 나타나니까 폼의 Postion속성을 poScreenCenter로 설정하는 것을 잊지 않도록 합니다.





  • Profile
    한보람 2001.06.21 20:52
    토맛토님, 감사합니다. 토맛토는 어느나라 채소인가염? 헤~



    아무튼 감사합니다. 답변이 이름만큼이나 상큼하시군여.. 감사합니다.



    상세한 설명.. 코딩이 길어서리~ 많이 연구해야겟지만, 아무튼 맛토님이 알려준 방법.



    연구해보겟습니다. 그리고, 안되면, 다쉬 질문드릴께염.



    -좋은 하루 되세여..-