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;