FreePascal Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
FreePacal 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

FreePascal 강좌/문서
[11] 라자루스를 이용한 업무 프로그램 개발 - 10
어느좋은날 [freepascal] 617 읽음    2020-06-13 22:46
2-3. 클라이언트 만들기

테스트 클라이언트를 실행하면 먼저 사용자 ID와 암호를 입력받아서 로그인 처리를 한다. 암호는 잘못 입력했을 시 3번까지 다시 입력가능하게 하고 3번을 넘기면 프로그램을 강제 종료시킨다.



unit login_dlg;
  :
  :
  TdlgLogin = class(TForm)
    btnCancel: TButton;
    btnOK: TButton;
    edUsrID: TEdit;
    edPasswd: TEdit;
    :
    :
  private
    u_Cnt: Int32; // 암호확인 카운트
  public
    r_OK: Boolean;
  end;
  :
  :
uses
  simlaz_dm; // DataModule
:
:
procedure TdlgLogin.FormCreate(Sender: TObject);
begin
  u_Cnt := 0;
  r_OK := False;
end;

procedure TdlgLogin.btnCancelClick(Sender: TObject);
begin
  Close;
end;


로그인 처리 전에 입력된 암호는 SHA256으로 인코딩한다.
procedure TdlgLogin.btnOKClick(Sender: TObject);
var
  l_Passwd: string;
begin
  Inc(u_Cnt);
  try
    l_Passwd := dmSIMLaz.UF_SIMLazSHA(edPasswd.Text);
    r_OK := dmSIMLaz.UF_SIMLazLogin(edUsrID.Text, l_Passwd);
    if not r_OK then edUsrID.SetFocus;
  finally
    if (u_Cnt >= 3) or r_OK then Close;
  end;
end;


Enter Key로 Control간 이동(Focusing)하는 방법은 Form의 KeyPreview를 True로 설정하고 아래와 같이 KeyDown 이벤트에 코드를 추가해서 처리한다. Key값 관련 상수는 LCLType에 선언되어있으므로 uses에 추가해야 한다. Enter Key 입력시 컨트롤간 이동이 아니라 다르게 처리해야할 경우를 위해서 Form의 Tag 값을 활용한다. TButton의 경우 Enter Key로 이동 해버리면 Click 이벤트가 발생하지않기 때문에 포커스가 왔을 때 Form의 Tag 값을 1로 설정해서 이동처리가 되지않게 한다.
procedure TdlgLogin.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if (Shift = []) and (Key in [VK_RETURN, VK_DOWN, VK_UP]) then
  begin
    if Self.Tag = 1 then Exit;
    case Key of
      VK_RETURN, VK_DOWN: SelectNext(ActiveControl, True, True);
                   VK_UP: SelectNext(ActiveControl, False, True);
    end;
  end;
end;

procedure TdlgLogin.btnOKEnter(Sender: TObject);
begin
  Self.Tag := 1;
end;

procedure TdlgLogin.btnOKExit(Sender: TObject);
begin
  Self.Tag := 0;
end;

위의 코드에서 확인 버튼에 대한 이동처리 코드만 있고 취소 버튼에 대한 코드가 없는 이유는, 둘다 동일 코드라서 취소 버튼의 이벤트에 확인 버튼의 이벤트명을 넣어서 처리했기때문이다.

델파이의 dpr 파일에 해당하는 파일이 lpr 파일인데 프로그램 시작 전에 처리해야할 내용을 여기에 작성한다. 프로그램 시작시 DataModule을 먼저 생성하고 로그인 후 정상적으로 로그인 되었으면 Main Form을 생성한다.
program simlaz_test;

{$mode objfpc}{$H+}

uses
  Interfaces, Forms, indylaz, simlaz_lib, simlaz_dm, main_frm, login_dlg;

{$R *.res}

function UF_Login: Boolean;
begin
  try
    dlgLogin := TdlgLogin.Create(Application);
    dlgLogin.ShowModal;
  finally
    Result := dlgLogin.r_OK;
    dlgLogin.Free;
  end;
end;

begin
  RequireDerivedFormResource := True;
  Application.Title := 'Simple Middleware - Lazarus Test Client';
  Application.Scaled := True;
  Application.Initialize;
  Application.CreateForm(TdmSIMLaz, dmSIMLaz);
  if UF_Login then
  begin
    Application.CreateForm(TfrmMain, frmMain);
    Application.Run;
  end
  else
  begin
    dmSIMLaz.Free;
    Application.Terminate;
  end;
end.


Main Form에 데이터를 가져오기위한 "Open", 처리를 위한 "ExecSQL", 버전 확인을 위한 "Get Version", 사용자 목록을 가져오기 위한 "User List" 버튼을 추가한다. SQL문을 받거나 사용자 목록을 보여줄 TMemo도 추가하고 가져온 데이터를 보여줄 TBufDataset, TDataSource, TDBGrid도 추가한 후 TDataSource의 DataSet 속성과 TDBGrid의 DataSource 속성을 설정한다.



각 버튼별 처리는 이미 DataModule에서 다 구현해놨기때문에 간단하게 처리할 수 있다. 데이터 가져오기(UF_SIMLazOpen)의 ALoadFields 파라메터는 True로 설정해서 매번 필드를 새로 생성하게 한다.
procedure TfrmMain.btnOpenClick(Sender: TObject);
begin
  if memSQL.Lines.Text = '' then Exit;
  if qrData.Active then qrData.Close;
  dmSIMLaz.UF_SIMLazOpen(qrData, memSQL.Lines.Text, True);
end;

procedure TfrmMain.btnExecClick(Sender: TObject);
var
  i: Int32;
begin
  if memSQL.Lines.Text = '' then Exit;
  if qrData.Active then qrData.Close;
  i := dmSIMLaz.UF_SIMLazExec(memSQL.Lines.Text);
  ShowMessage('RowsAffected = ' + IntToStr(i));
end;

procedure TfrmMain.btnVersionClick(Sender: TObject);
var
  s: string;
begin
  s := '';
  if InputQuery('버전 정보', '프로그램 ID를 입력하세요!', s) then ShowMessage(dmSIMLaz.UF_SIMLazVer(s));
end;

procedure TfrmMain.btnUserListClick(Sender: TObject);
begin
  memSQL.Lines.Clear;
  memSQL.Lines.Text := dmSIMLaz.UF_SIMLazList;
end;

+ -

관련 글 리스트
11 라자루스를 이용한 업무 프로그램 개발 - 10 어느좋은날 617 2020/06/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.