1. 필요 unit


엑셀로 인한 추가 unit 2개 : ComObj, OleCtrls


2. 변수 선언


var

     XL : variant ;

begin

    XL := CreateOLEObject('Excel.Application');     // OLE컨트롤 생성
    XL.DisplayAlerts := False;          //경고창 숨기기

    XL.WorkBooks.Add;                   //새화일 열기

    XL.SaveAs('C:\test.xls');         //다른이름 저장

    XL.quit;            //엑셀 언로드 ---> exception 구간에서 사용하기 ! 안사용하면 메모리누수


3. 생각해야 될것 기타 값 입력 모양 변경 등등은


엑셀에 보면 도구 - 메크로 - 메크로 기록이라는 항목이 있는데


거기서 기록 을 누른 후 행동을 하고 ㅁ 버튼을 눌러 메크로 기록을 중지하면


기록된 메크로를 볼 수 있는데 (alt + F11)  여기서 만들어진 메크로를 적용 시키면 된다.



3번이 가장 중요 ! 즉 메크로 기록을 한후 역추적을 통해 코딩 ㄱㄱ



===================================================================================

이하 코드를 통하여 참조하여 주시기 바랍니다. ㄳ

===================================================================================

unit Unit1;

interface

uses
//    엑셀로 인한 추가 unit 2개 : ComObj, OleCtrls
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComObj, OleCtrls, Grids, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  Function  ReadExcelFile(sFileName:String):integer;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
    ReadExcelFile('12.xls');
end;

function TForm1.ReadExcelFile(sFileName: String): integer;
var
  XL, XArr, XTitle : Variant;
  sheetNumer,x,y : Integer;
  temp : String;
begin
  sheetNumer:=1;
  temp := 'a1:a1';
  try
    XL := CreateOLEObject('Excel.Application');
    XL.DisplayAlerts := False;          //경고창 보이기
    XL.workbooks.add;                   //새화일 열기
    XL.ActiveCell.FormulaR1C1 := '=3*3';
    XL.ActiveCell.CurrentRegion.Select;
    XL.selection.style:='Currency';
    XL.Cells[1,3].value := '3';

    XL.Range['D22'].Select;
    XL.ActiveCell.FormulaR1C1 := 'wonsama';
    XL.Selection.Font.ColorIndex := 3;


//   참조항목
//    XL.workbooks.Add('C:\test.xls');    //특정 이름의 화일 열기
//    XL.workbooks.Open('C:\'+sFileName); //특정 이름의 화일 열기
//    XL.ActiveWorkbook.saveas('C:\123.xls'); //활성화된 엑셀 다른 이름으로 저장
//    XL.ActiveCell.FormulaR1C1 := '=3*3';    //값입력
//    XL.ActiveCell.Font.Bold := True      //글자 환경 변경
//    XL.ActiveCell.CurrentRegion.Select;   //활성화 된 셀의 영역을 선택
//    XL.selection.style:='Currency';       //선택영역 통화 형태로

  except
    result:= 0;
    MessageDlg('Excel이 설치되어 있지 않습니다.'+#13+'이 기능을 이용하시려면 반드시 MS오피스 엑셀이 설치되어 있어야 합니다.- ' , MtWarning, [mbok], 0);
    XL.quit;            //엑셀 언로드
    Exit;
  end;
  XL.Visible := true;
  XL:= Unassigned;
 end;
end.

Posted by 나비:D
:
이 자료는 지적재산권 보호를 받습니다.

개인이 개발과 관련된 연구 목적으로 열람이 가능하지만

무단으로 배포하거나 타 게시판에 게시하지 못하며,

상용이나 영리를 목적으로 인쇄 및 배포를 금합니다.

이 글 내용의 일부분 또는 전체의 무단 전제를 금합니다.

----------------------------------------------------------------------

이 글은 대한민국의 지적재산권, 저작권 관련법의 보호를

받습니다. 이 글을 델마당, 한델, 델파이코리아 등의 게시판에

게시했다하여, 상업적으로 이용 또는 부분 및 전체 복제를

허여하는 것은 아닙니다. 즉, 묵시적으로 허용하는 것이 아닙니다.

이것은 자유 게시판에 공개된 글이라도 상업적으로 이용

가능하다는 의미가 아니며, 어떠한 경우라도 상업적으로

이용 불가함을 알립니다.

이 글의 저작권은 유 솔로몬에게 있습니다.

Copyrights,2001,By ds4byw, All rights reserved.

초 판 : 2000. 7. 6.

최종 수정 : 2001. 7. 20.

유 솔로몬 (ds4byw@hanmail.net Tel 0116459006)

----------------------------------------------------------------------

유 솔로몬은 이 글 내용 및 기법을 이용하여 제작한

프로그램이 데이타 손실 및 파괴에 대하여 민형사상 책임을

지지 않으며 사용자 책임임을 알립니다.

따라서, 유 솔로몬은 어떠한 경우에도 귀하에게 보증을

드리지않으니 사용에 주의하시기 바랍니다.

이 글을 대한민국에서 소프트웨어 개발을 하시는 이름모를

개발자님들과 이미 늦어버린 나이에도 개발 기술을 취득할 기회를

허락하여 주신 존경하는 은사님이신 홍 박사님과 여러 선생님들,

ICU(AIIT) 동문 여러분과 얼굴은 모르지만 전화를 통하여 아낌 없는

도움말과 조언을 주신 한국과학기술원 연구원님들께 바칩니다.

AIIT와 인연을 맺은 것에 대하여 자랑스럽게 생각합니다.

소프트웨어 개발 분야의 진흥이 되길 빌며 ...

*********************************************************************

[개발자를 위한] 미니프로젝트 실무

*********************************************************************

// 들어가는 말 //

짧은 실무 경력이지만 초보 델파이 개발자에게

도움을 드리기위해 이 글을 씁니다.

초보자가 초보자를 위해 글을 쓰는 일은 부담되는 일입니다.

이 글은 초보자를 위해 쓰여지지만 표현이 난해하고

어려운 용어가 사용 될 수 있으며 저의 주관적인 생각들이

강하므로 이 글에 대한 댓글이나 질문은 정중히 사양합니다.

이 글과 관련하여 절대로 연락하지 마세요.

어떠한 질문이나 메일, 문의 등을 사절합니다.

필자는 이 글을 열람하시는 분들께 답변할 의무는 없으며,

귀한 시간을 거기에 투자해야 할 어떤 이유가 없습니다 .

이 글의 내용 중에 특별한 경우를 제외하고는 특별히 예시를

않더라도 사용되는 용어는 각 회사의 등록상표임을 밝힘니다.

그리고, 이 글을 열람하시는 독자분들께 연재 약속을 드리지

못합니다. 다만, 개인적인 흥미로 틈틈이 글을 쓰려고 합니다.

제가 1967년 생으로 이미 30대 중반입니다.

우리나라 개발 문화에서는 황혼기라고 할까요 .

프로그램밍 경력이 5년이상이지만 코딩 작업에 들어가면

여러 상념이 머리 속에 맴돕니다.

혹시라도 30대에 개발자를 꿈꾸시는 분이 있다면 말리고 쉽습니다.

여러 가지 이유로 개발업체에서 고연령 개발자를 채용하는 것을

꺼리고 있으며 고등학교 혹은 대학교 졸업을 한 전산전공자를

선호하고 있으며 21세 이상 30세 이하가 적정한 연령인 것 같습니다.

많은 분들이 그렇듯이 30세 이상인 분은 전업이나 장래에 대한

계획이 필요합니다.

이 글에서는 정보공학에 대해서는 언급을 전혀 하지 않습니다.

정보공학이 실제로 단순한 코더 보다는 오히려 부가 가치가 높은

것인지도 모릅니다.

필자는 가난한 개발자입니다. 필자가 부자이고 넉넉한 마음으로

이 글을 쓰고 있다면 마음이 편했을 텐데 웬지 서글픈

마음이드는 것은 왜? 일까요?

개발자가 되고 싶다고 해도, 간단한 업무용 프로그램을

만들려고 해도, 초보자에게는 모든 것이 힘들기만 합니다.

개발 기술은 회사에서 보호되어 있고 시중의 참고 서적들은

도움이 되지 않습니다. 참으로 이상한 일입니다.

개발자에 입문한지가 어제인듯하더니 벌써 5년이란 세월이

흘러가 버렸습니다.

어느 순간, 직업적인 개발자가 되어버린 모습에 스스로 놀라울

따름입니다.

하지만, 아직도 배울게 많고, 필요한 기능을 신속하게 구현 할 수

있는 능력을 갖도록 노력하려고 합니다.

이 글에 대한 조회수가 1000회가 넘은 것에 대하여 감사를

드리는 맘입니다. 물론, 1년이란 기간 동안 조회한 숫자이지만 ,

허접한 글에 대하여 여러분들이 관심을 가져 주셔서 필자로서

고마울 따름입니다.

이 글은 현업에서 실무 중 느낀 점을 간략하게나마 기술한 것이므로

주관적인 생각이 강하고 객관성이 많이 결여 되어있는 것은 사실이지만

개발 전 분야에 걸쳐서 어려움이 많다는 것을 알려 드리고 싶습니다.

일반인들은 소프트웨어가 담긴 CD 한장에 1-3만원 정도란 것이 각인

되어 있습니다. 따라서, 소프트웨어 개발 비용이 일천만원 이상을 한다고

말하면 도무지 벌린 입을 다물지 못합니다.

무슨 CD 한장에 일천만원 까지 하냐고... 사람을 놀리지 말라고...

여러 소프트웨어 개발 회사의 기술 수준은 차이가 있습니다.

아직까지 그것들과 비교해서 이 글에서 소개한 개발 기법에 대하여

강한 긍지를 가지고 있습니다.

개발자는 철저한 생존을 위한 몸부림으로 항상 최적화된 개발 기법을

찾아야합니다.

비교적 팀 프로젝트에서는 시간적인 여유를 가지고 진행 할 수

있으나 프리렌서인 경우엔 모든 작업을 혼자 해야하기 때문에

최적화된 기법을 찾기에 힘써야 하며, 프로젝트 시작 전에 라이브러리가

미리 준비 되어 있어야 합니다.

라이브러리는 공통으로 사용된 함수의 모임이나 콤포넌트, 재사용 가능한 것을

말하며 개발 시간을 단축시키고 효율적으로 코딩을 하기 위함입니다.

// 네트워크보안 그리고 NT4.0 그리고 funlove.4099 virus program //

일반적으로 NT4.0에서는 각각의 파일에 대하여 소유권이 있습니다.

그런데, funlove 바이러스 프로그램에 감염된 상태에서 관리자모드로 로그인

즉, Administrator란 아이디로 로그인하면 모든 파일의 접근 권한을

everyone으로 변경시켜버려 순식간에 guest까지도 시스템에 접근

할 수 있습니다.

정기적인 바이러스 체킹으로 각종 회사 기밀이 노출 되지 않도록

서버 관리자는 주의하시기 바랍니다. 악의적인 해커가 타켓 서버에

침입하려 할 때 펀러브바이러스.4099의 변종 바이러스는 해킹을 위한

사전 도구로서 사용 될 소지가 있습니다.

이 글을 열람하시는 서버관리자는 자기 서버에 이 바이러스가 감염되었는지

확인하시기 바랍니다.

// C에서의 폼 실행 원리 //

C코딩을 하신 분들은 이해가 되 실 겁니다. 즉 창이 보여 줄 때는 무한루프가

걸려있습니다. 그래픽 처럼 폼을 구현하면 한번 실행되고 사라져 버립니다.

전역 변수를 제외하고는 그리기 이벤트가 계속 발생해야 폼 형태가

유지 되는 겁니다.

// 고급 디자이너를 위한 보정작업 //

모니터의 배경색은 완전한 검정색이 아닙니다. 표준 색상표를 기준으로

모니터 색, 그리고 그래픽 툴 프로그램의 색상 그리고 프린터 인쇄물의

색상이 정확하게 일치해야 합니다.

광원의 삼원색 RGB으로 구현한 색상과 색상의 삼원색 RYB으로 구현한

색상의 조합이 일치해야 합니다.

// 비쥬얼 베이직에서의 런타임라이브러리 //

비쥬얼 베이직에서 런타임 라이브러리가 몇가지 있습니다. 그 예로

msvbvm60.dll 같은 것이 있다. 싫은 1메가 바이트가 넘는 크기 때문에

투덜거리는 개발자도 많지만 이러한 DLL은 사실 우리가 코딩하다 보면

반복적으로 중복되는 함수들을 모아 놓은 것이다. 물론 여기에 포함된 단

몇개의 함수만 사용된 경우도 있습니다. 이렇게 반복되는 함수를 한 곳에

모아 놓지 않으면 각 모듈별 지루하게도 소스코드 내에서 반복되거나 참조하게

될 것입니다. 클래스들을 한 곳에 모아 필요 할때만 참조하도록 하는 것이

괜찮은 생각인지도 모릅니다.

// 델파이 소스코드를 비쥬얼 베이직 소스 코드로의 포팅 //

일반적으로 어셈블리어나 기계어는 CPU 종류에 의존 됩니다.

그리고 C언어나 C++은 플랫폼, 즉 운영체제에 상관 없이 소프트웨어를 이식시키기

위한 목적으로 사용됩니다. 이것은 소프트웨어를 다양하게 판매가 가능하다는 것을

의미하며 부가 가치를 높이는 일일 것입니다.

델파이는 CPU가 인텔인 x86 계열과 알파 칩 계열의 소스코드를 생성하는 윈도우용

개발툴입니다. 윈도우라는 운영체제에 의존합니다.

kylix는 lynux라는 플랫폼에서 소프트웨어를 개발하는 툴이지 윈도우용이나 유닉스용

툴이 아닙니다. 그리고 리눅스에서의 실행파일이 유닉스에서 실행되라는

보장이 없습니다. 크로스 컴파일러나 아니면 에뮬레이터가 필요하겠지요.

델파이 소스코드를 비쥬얼 베이직으로 포팅하는 것은 차라리 소스코드의 로직을

이해한 후, 새롭게 코딩해버리는 것이 빠를 수 있습니다.

일일이 소스 코드를 분석하고 비슷한 함수를 찾아 포팅하는 것이 시간이 많이 걸릴 수

있습니다. 물론 두가지 툴에 전문가라면 쉬운 일이 될 수도 있겠지요.

그런데 또 한가지 방법은 델파이에서 사용된 사용자 정의 함수나 공통 함수를

DLL형태로 만들어서 비쥬얼 베이직에서 임포트해서 사용하는 방법도 좋습니다.

// 즐거운 윈도우 프로그래밍 //

윈도우 프로그래밍의 기초는 코딩 순간 순간에 저장 버튼을 수시로

누르는 것입니다. 이것은 매우 중요합니다.

노련하고 직업적인 개발자는 이것을 주의합니다.

필자의 경험으로는 300라인 이상 코딩을 하고나서도 저장 버튼을 누르기

전에 알수 없는 오류, UPS 미 설치로 인한 갑작스런 정전이나 알 수 없는

기타 원인으로 컴퓨터가 폴트되어 처음부터 다시 코딩해야 하는

경우가 생겨서 허탈해 하는 개발자를 많이 보았습니다.

처음 부터 다시 코딩하면 되지만 귀한 시간을 낭비했고, 100퍼센트 원래대로

코딩하기가 쉽지 않습니다. 이것은 습관 문제인데, 여러분이 전문 개발자가

되기 원하시면 수시로 파일 저장 버튼을 클릭하시기 바랍니다.

필자 경험으로 좀 유머스런 일은 그 개발자가 초절정 고수임에도 불구하고

새로운 프로그램 테스트, 새로운 버전의 운영체제 테스트,

혹은 바이러스 프로그램으로 인하여 귀중한 소스 코드와 자료를 HDD에서

잃어 버리는 경우가 많습니다.

그 개발자에게는 별로 중요하지 않는 소스코드이지만 다른 사업자 중에는

그 프로그램을 필요로 하는 경우가 있습니다.

// 오라클 DB에 연결 설정 //

오라클 DB에서 폼 디자이너에 올려진 DB 컴포넌트를 클릭했을 때 나타나는

파라미터의 설정은 아래와 같습니다.

지금 기술하는 것은 오라클 DB와 BDE 5.1 버전에서이며 다른 DB 종류에따라

DB의 클라이언트 종류에 따라 그 설정 방법이 다를 수 있습니다.

[형식1]
SERVER NAME=@(alias of oracle DB )
USER NAME=(user ID)/password

[보기]
SERVER NAME=@ora_mydb
USER NAME=su/1234

// 인쇄 솔류션 //

제일 조은 방법은 프린터에 켄버스를 이용하여 직접 그리는 것입니다.

주의 해야 할 점은 프린터 기종 별로 다르게 인쇄 되지 않도록 해야합니다.

이 방법은 도스 시절 코딩에 익숙한 개발자에게 편리하나 그렇지 않는 개발자는

어렵운 점이 있습니다. 이렇게 구현한 양식의 인쇄 품질은 좋습니다.

또 다른 방법은

인쇄 양식을 스케너를 사용하여 1:1 비율로 스켄한다음 BMP 파일로 저장한 다음

폼에서 Back Ground 이미지로 활용한다음 폼을 투명하게 만들어

양식 이미지에서 인쇄할 좌표를 얻어 인쇄하는 방법이 있습니다.

이 방법은 편리하긴 하지만 인쇄 품질이 좋지 못하여 프린터가 3번 연속

인자 하도록 제어를 해야합니다.

퀵 레포트를 사용하는 방법은 매우 편리하나 버전 별로 약간의 버그가 있습니다.

예를 들면 화면 스케일 변화에 따른 셀들의 수직 선들이 일치하지 않는

점입니다. 개발자에 따라서 특별한 기법을 이용하여 구현하기는 하나

올바르게 구현하면 매우 편리합니다.

// 구현의 시작 //

개발 전 분야를 거쳐서 한사람의 개발자를 양성 시키기 위해서는

막대한 시간과 비용이 듭니다.

필자의 경험으로 볼 때 부유하지 않으면 이제 졸업한 사회 초년생들은 많은

어려움이 있습니다. 그래서, 많은 경우 시중의 서적들을 의지하여

독학하는 경우도 많습니다.

물론 개발자의 자질이 풍부한 분들도 있겠으나 뼈를 깍는 노력을 해야

합니다. 특히, 오라클 관련 핵심 기술은 거기에 접근하는 분들은

많지 않습니다.

윈도우 메시지의 후킹은 나름대로 중요함을 느껴서 나름대로 정리하여

기술 할 것입니다. 필자는 편이한 소스를 선호한 편이어서 쓰레드 처리 기법,

메시지 후킹, 가상머시인 제작, 페이징 기법, 메모리 맵 활용등의 기술은

틈틈이 기술하도록 하겠습니다.

프로그램을 개발하면서 느낀점은 이러한 개발 기술들이 악용되면 취약한 윈도우

운영체제에서 강력한 해킹 툴이 만들어 질 수 있다는 것입니다.

각종 관련 법규보다는 그 이전에 개발자의 직업 윤리가 매우 중요하다고 생각됩니다.

체계적으로 개발 전 분야를 습득하는 것은 개인 자질에 따라 시간이 많이 걸리므로

우선 프로젝트 단위로 만들어 보는 것이 중요합니다.

어려움이 많겠지만 하나의 단위 프로그램의 완성은 개발자에게 자신감을 얻게합니다.

각종 팁은 구현 과정의 요소로써 중요하고 전체적으로는 우선 무작정 개발해 보는

경험이 매우 중요합니다.

개발자가 되기 전에 사무직이나 각종 개발과 관련된 업무에 종사하는 경험이

많은 도움이 됩니다. 개발 툴이 아무리 편리하더라도 프로그램의 개발은

역시 개발자의 몫입니다.

현업의 실무자가 직접 개발하는 것은 바람직하지 않으나 업무 프로세스나 알고리즘

개발은 긍정적인 일입니다.

MS-DOS나 WINDOWS 3.1 그리고 WINDOWs95 모두 개발 툴은 C나 VC가 아닌

어셈블리어로 추정 됩니다. 윈도우 운영체제가 VC와 매우 친화적인 것을 나타내고

있으나 운영체제 개발은 순수한 기계어나 어셈블리어로 추정 됩니다.

최근에 C로된 소스 코드는 나중에 포팅 된 것으로 생각됩니다.

// 소스 코드의 유지 보수성 //

같은 분야에 소프트웨어 개발 회사인 A,B회사가 있다고 할 때,

서로 다른 회사의 개발자가 경쟁 회사의 소스 코드를 볼 기회가 생겼다고

가정하면 지저분한 소스 코드에 실망을 하게 됩니다.

그동안 이러한 지저분한 소스 코드에서 생산된 제품과 회사 사활을 건 경쟁을

했나 하는 허탈감을 느끼게 만듭니다.

이것은, 필자가 가정을 한 이야기이지만 실제 현업에서 많이 발생 할 수 있는

일입니다.

윈도우는 GUI란 직관적인 인터페이스를 갖고 있습니다.

그렇습니다. 그 지저분한 소스 코드로 생산된 제품이 경쟁력이 갖을 수 있는 점은

사용자의 인터페이스의 승리라고 하겠습니다. ^^

비록 이런 제품의 개발은 바람직하지 않지만 결과를 중요시 하는 현실에서

눈에 보이는 부분에 대한 처리는 매우 중요합니다.

그래서 합리적이고 유지 보수가 편리한 소스 코드는 개발자의 시각일 뿐

최종 사용자나 경영자는 그러한 부분이 중요하게 생각하지 않으며

관심도 없습니다.

이런 말을 하는 것은 교양있는 사고 방식이 아니지만 수단 방법을 가리지

않고 주어진 기간안에 개발하여 납품을 하고 사용자 인터페이스에 대한

상품 포장에 대한 것이 얼마나 강조해도 지나치지 않다는 것이

실무에서 중요하다는 것입니다.

현장 실무에서 프로젝트가 돈이 되는지? 상품성이 있는지? 사업성이 있는지가

매우 중요하므로 이 글을 열람하시는 분들은 명심하셔서 개발에 임하시길

바랍니다. 그 결과로 여러 분은 아마추어 개발자가 아니라 프로페셔널한

개발자로 성장하게 될 것입니다.

중소형 개발 기업들이 난립하여 적은 급여에 비하여 엄청난 수고와 자기

건강까지도 망가지는 경우가 있는 데, 그러한 브로커들을 잘 판단하여

개인적인 부를 축적하시길 빕니다.

개발 툴이 어떤 종류이든지 합리적이고 효과적인 소스 코드의 생산을 하는

개발자는 대한민국에서 그리 많지 않습니다.

필자가 소프트웨어 개발 회사들의 깊은 속내를 알 수 없지만 이제까지의

경험으로 볼 때 충분히 유추 할 수 있습니다.

개발자의 코딩 습관은 주위의 영향을 많이 받습니다.

수 많은 프로그램 개발자 중에서 FM대로 교육 받고 코딩하는 분은 매우

적습니다. 요행이 외국계 개발 회사에 적을 둔 분들도 소수에 불과합니다.

양질의 소프트웨어를 개발하기 위해서는 개발자를 양성하는 교육 기관의

역할이 중요합니다. 어떤 개발자들은 현장의 경험이 매우 중요하다고 합니다.

몸으로 체험하는 실무 경험을 중요시 한다는 말입니다.

매우 뛰어난 개발자의 자질을 갖고 있는 분들도, 실무에서 여러가지 원인으로

중도에 그만두고 이직한 사례가 많습니다.

각 소프트웨어 개발회사들이 정도의 차이는 있지만 프로젝트가 완료된

소프트웨어를 개선 및 유지 보수하는 경우는 적으며 개발완료시 소스코드는

그 생명을 다하고 맙니다.

만약, 사회적으로 소프트웨어 개발 기술 발전을 추구하지 않으면 많은 개발자들이

프리렌서 즉, 자유 계약직 형태의 성격을 갖을 거란 전망을 해봅니다.

어떤 대안이 제시되지 않는 다면 미국의 마이크로소프트 같은 성공적인 소프트웨어

개발 회사는 우리나라에서 보기 힘들 것이란 전망을 해봅니다.

인도처럼 소프트웨어 개발 육성책이 필요하다고 하겠습니다. 그리고 가장 중요한 것은

소프트웨어 개발 발전을 위한 기금은 반드시 소프트웨어 개발 분야에 쓰여지고

그 기금의 집행에 대한 관리 감독하는 지혜가 필요하다 하겠습니다.

소프트웨어 개발 분야에 수 많은 브로커들이 난립하여 단기 수익을 위해 나서는 것을

지양하고 기술 개발이 집적되도록 많은 분들의 생각을 모아야 하겟습니다.

// 월 억대 수입을 올리는 개발자 //

매일경제신문의 지난호를 살펴보면 월 억대의 수입을 올리는 개발자를 소개하는

기사가 있습니다. 어떻게 해서 프리렌서가 그러한 수입을 올리는 지 알 수 없지만

필자는 사실 월 억대 수입이라고 해서 오타나 오보로 생각했었습니다.

즉, 연간 수입을 생각했었습니다. 만약 이 기사가 사실이란 전제하에 생각을 해봅니다.

필자는 그 개발자가 실력이 뛰어나다는 생각을 안합니다. 그러한 수준에 있는 개발자는

우리 나라에서 많이 있으리란 생각을 해봅니다.

첫째, 혈연, 지연, 학연등의 인맥입니다. 그에게 억대 수입을 가능하게 만든 것은

그에게 수주하는 많은 사람들을 알고 있다는 의미입니다.

둘째, 그 개발자의 부단한 자기 노력과 자기 개발에 대한 재 투자입니다.

세째, 개발된 제품에 대한 최종 사용자의 만족도입니다.

네째, 그 개발자에 주어진 기회에 대하여 적절히 놓치지 않고 잡았다는 사실입니다.

다섯째, 신문 기사를 살펴보면 외국계 개발회사에서 실무경력과 중요직책에

근무한 점입니다. 아마도 외국계 회사에서 재직할 때 합리적이고 효과적인 코드 생산

기법을 습득하였을 것입니다.

우리나라에는 수 많은 개발자들이 있습니다. 그들 개발자들이 전부 경제적인 안정과

수입을 얻는 것은 아닙니다. 그래서 개발자란 직업에 대해서 장미 빛 환상에

젖어들지 않기를 바랍니다. 수 많은 개발자들이 영리보다는 자기가 하고 싶은

일을 한다는 긍지와 자기 존중이 개발 분야의 발전에 도움을 준겁니다.

특히, 특정 분야에 열정을 가진 전문적인 개발자들에게는 그 기회가 많지 않지만

조은 기회가 올 것입니다. 그 기회를 잘 이용한다면 명예와 부를 획득하지 않을까여?

// 툴의 안정적인 코드생산 //

델파이로 개발한 응용 프로그램의 실행 파일은 안정적인 것으로 알려져

있습니다. 그러나 델파이가 이러한 고성능 툴임에도 불구하고 일부 비판적인

시각이 있는 것을 보면 개발자의 개인적인 개발능력

즉, 소프트웨어의 설계, 업무 분석, 요구분석 등이 중요하다고 생각합니다.

유지보수가 용이한 코드 생산은 아무리 강조해도 지나치지 않습니다.

소프트웨어 개발 회사의 경영자 모임에 나가보면 비쥬얼 툴 중

마이크로 소프트의 비쥬얼 스튜디오를 선호하는 것을 볼 수 있습니다.

우선 그 이유로는

첫째, 툴의 가격이 저렴하다.

비쥬얼 스튜디오 엔터프라이즈판이 이백만원 이내입니다.

경영자에게 가격 문제는 엄청난 자극이 됩니다.

둘째, 비쥬얼 베이직 사용 회사의 외곡된 시각입니다.

특이하게도 개발 분야에 대하여 정통하지 못하면서 경영자가

귀가 얇아서 주위의 분위기에 동조하는 경우가 많습니다.

어떤 툴을 사용하는 것도 중요하지만 그 툴을 사용하여 최적의 고품질의

소프트웨어 개발을 하는 것이 중요합니다.

세째, 개발자 의사에 반하여 경영자의 이상과 추구하는 것은

바로 이윤 추구입니다.

최소의 투자로 최대의 이윤을 추구하는 것이죠.

그래서, 경영자의 입장에선 어떤 툴을 사용하는지의 여부와

상관 없이 돈만 잘 벌면 그뿐이란 생각을 합니다.

그래서, 주위에 근거 없는 이야기와 분위기에 편승하여

델파이를 사용했다가 비쥬얼 베이직을 사용했다가

또, 파워빌더를 사용하기도 합니다.

이런 경영자의 아래의 개발자는 그 만큼 운신의 폭이 좁기 마련입니다.

네째, 경영자의 대부분이 개발자의 기술적인 의견을 경청하지 않습니다.

경영자는 개발하고자는 프로그램의 난이도에 대해서 아랑곳하지

않고 돈이 되는 것이라면 무조건 시행하는 경우가 많습니다.

많은 경영자가 소프트웨어 개발 분야에 전반적인 지식이 없는 경우가

많으며 그래서 전횡을 하지만 그 아래에 개발자는 우수한 인력인 경우가

많습니다. 필자는 그동안 실무 경험에서 어느 툴을 사용하는가도 중요하겟지만

개발자의 소프트웨어 설계 기술이 얼마나 중요한가를 알게 되었습니다.

// 비쥬얼 베이직의 장점 //

1. 툴의 가격이 저렴하다.

2. 배우기가 쉽다.

3. 툴 개발회사의 재정상태가 양호하다.

4. 비쥬얼 베이직 툴을 사용하는 개발자가 많다.

5. 비전문가 툴이다.

6. DB 관련 프로그램 개발이 용이하다.

// 비쥬얼 베이직의 단점 //

1. 컴파일 속도가 느리다.

2. 런타임 라이브러리가 반드시 필요하다.

3. DB 관련 외 다른 분야의 프로그램 개발이 쉽지않다.

4. 툴 사용자가 많아서 버그 패치나 다운로드가 쉽지 않다.

5. 툴 사용으로 인한 다른 손해에 대해서 책임을 지지 않는다.

// 델파이의 장점 //

1. 컴파일 속도가 빠르다.

2. 런타임 라이브러리가 선택적으로 사용 할 수 있다.

단독 실행 파일 생성이 가능하다.

3. 전문가용 툴이다.

4. 오픈 소스로 고급 개발 기법에 대한 것을 습득 할 수 있다.

5. DB 관련 프로그램 개발이 용이하다.

// 델파이의 단점 //

1. 툴의 가격이 비싸다.

2. 버전에 따라서 로딩 속도가 느리다.

3. 퀵 레포트에 버그가 있다.

4. 플랫폼이 다른 경우 직접적인 이식이 어렵다.

5. BDE를 배포 할 경우 별도로 배포해야 되며 실행이 무겁다.

6. 파라독스 테이블의 인덱스 손상이 빈번하다.

// *.DB *.DBF에서 RDBMS으로 포팅 //

많은 개발자들이 파일 시스템의 테이블을 관계형 DB의 테이블로 포팅하는

것을 어렵게 생각하는 것 같습니다.

이 글에 제시한 방법대로 DB를 설계하신다면 DB 종류가 오라클, 사이베이스,

인포믹스, MSSQL, mysql, 인터베이스 등에 관계없이 쉽게 포팅 하실 수 있습니다.

물론 자세한 SQL 스크립트 중에 특정 DB에 종속된 함수가 있을 지 모르지만,

수정하는 것은 어렵지 않습니다.

C/S 버전에서는 서버에 질의하여 계산된 결과만을 가져오도록 해야합니다.

보통 잘못된 코딩으로 레코드를 클라이언트로 가져와 가공하는 경우가 많은데

커넥션이 10이상만 되어도 네트워크 트레픽과 서버의 과부하를 발생시켜

최악의 경우까지 발생시켜셔는 안됩니다.

개발자는 코딩하면서 항상 커넥션을 고려한다면 C/S 개발은 그리 어려운

일이 아닙니다.

// 고급 기법의 사용자 함수들 //

초보 개발자들의 입장에서 보면 메시지 후킹하는 것들이나 좀더

고급 기법의 함수를 사용하는 개발자들을 바라보며 감탄을 합니다.

어떻게 그러한 고급 함수들을 사용하게 되었을 까요?

첫째, 지금은 절판되어 시중 서점에서 구할 수 없지만, 윈도우 프로그래밍이란

주제로 API 함수를 소개한 원서가 있었습니다.

둘째, 러시아, 이스라엘, 인도 등 특정한 사이트에 가시면 고급 함수를 완전히

공개한 경우가 있습니다. 즉, 오픈 프로젝트 구룹입니다.

이러한 사이트 찾는 것이 쉬운 일이 아니며, 최근에는 무슨 이유인지 이러한

사이트에 접근하는 것을 차단하는 경우가 많아졌습니다.

세째, 와레즈 사이트 이용입니다.

와레즈 사이트는 현제 우리 나라에서 불법입니다.

그러나, 순수 연구 목적이라면 와레즈 사이트에서 상용 컴포넌트의 소스코드를

모두 볼 수 있습니다. 보통 와레즈 사이트라면 상용 프로그램의 실행파일을

불법으로 배포하는 것으로 알고 있지만, 소스 코드만을 취급하는 경우도

있다고 하지만 확인된 사실은 없습니다.

// 툴에 관련된 질문 //

질문: 솔로몬씨? 어떤 툴을 주로 사용합니까?

답변: 저는 어셈블리어, BASIC, GW-BASIC, FORTRAN, COBOL,

PASCAL, C++, CLIPPER, Visual Basic, Visual C++,

PowerBuilder, DELPHI를 사용합니다.

질문: 그럼, 어떤 툴이 좋습니까?

답변: 저는 모든 툴이 나름대로 일장일단이 있다고 생각합니다.

그래서 모든 툴이 좋습니다.

프로젝트 종류에 따라 구현하기 편한 툴이 좋습니다.

질문: 모든 툴을 전부 공부해야 합니까?

답변: 능력이 되신다면 권장드리고 싶습니다. 하지만 특정 툴하나에 대해서는

최고의 수준이 되셔야 합니다. 하나의 툴의 전문가가 다른 툴을 배우는

것은 쉬울 수도 어려울 수도 있습니다.

★ 유솔로몬은 델파이가 넘 좋습니다. ★ 델/파/이/만/세/다

// 윈도우 시스템 메시지 받기 //

먼저 프로시져를 변수로 정의하며,

반환 값은 윈도우메시지 명령의 메시지 값입니다.

var
procedure WMSysCommand(var AMsg: TWMSysCommand); message WM_SYSCOMMAND;

실제 함수의 구현 내용입니다.

procedure WMSysCommand(var AMsg: TWMSysCommand);
begin
inherited;
if AMsg.CmdType = SC_MINIMIZE then // 최소화 버튼이 눌려졌으면..
...;
end;

{
TWMSysCommand.CmdType = SC_CLOSE // 윈도우가 닫힐때
= SC_MAXIMIZE // 최대화
= SC_MINIMIZE // 최소화
= SC_KEYMENU // 키보드로 메인메뉴 호출
= SC_MOUSEMENU // 마우스로 메인메뉴 호출
= SC_RESTORE // 최소화에서 원래의 상태로 복원 될 때

}

// 폼 종료시의 메모리에서 모든 컴포넌트 해제 //

// TCloseAction 클래스의 인스턴트 Action의 정의 . 생략가능
var
Action: TCloseAction);

begin
Action:=caFree;
end;

// INI 파일의 응용 //

*.ini는 윈도우3.1에서 보듯이 우리에게 친숙한 파일 형태입니다.

이 파일은 주로 환경 설정용으로 많이 사용되고 있습니다.

만약 MyConfig.ini의 내용이 아래와 같고

[ASection]
MyLeft=1
MyTop=2

[BSection]
MyString=ABCDEFG

위 파일을 읽어 드릴려면 아래와 같이 구현한다.

먼저 선언 할 사항은
uses
IniFiles;

var
MyIni : TIniFile;


procedure INIRead;
var
Path : String;
begin
// ini 파일 동적 생성
Path := ExtractFilePath(ParamStr(0)) + 'MyConfig.ini';
MyIni := TIniFile.Create(Path);
Left := MyIni.ReadInteger('ASection','MyLeft',1);
Top := MyIni.ReadInteger('ASection','MyTop',2);
MyEdit.Text := MyIni.ReadString('BSection','MyString','ABCDEFG');
MyIni.Free; // INI 파일 메모리해제
end;

INI 파일에 내용을 기록하려면 아래와 같이 구현한다.

procedure INISave;
var
Path,MMySting : String;
begin
Path := ExtractFilePath(ParamStr(0)) + 'MyConfig.ini';
MyIni := TIniFile.Create(Path);
MyIni.WriteInteger('ASection','MyLeft',1);
MyIni.WriteInteger('Asection','MyTop',2);

MMySting := MyEdit.Text;

// 문자열 중에 공백(' ')이 있으면 그 공백을 제거.
while pos(' ',MMySting) <> 0 do Delete(MMySting,pos(' ',MMySting),1);
MyIni.WriteString('BSection','MyString',MMySting);
MyIni.Free;
end;

// 메모리 맵의 활용 //

1. 전혀 다른 파일 포맷의 자료 변환 하고자 할 때

2. 소켓프로그램에서

3. 파일 전송시

// DLL 파일의 용도 //

1. 메시지 후킹 할 때.

2. 나만의 함수를 감추고 시플 때(프리렌서들이 사용함 ).

3. 메모리 관리를 동적으로 핸들링할 때.

4. 소켓 프로그램 만들 때 사용.

// 레지스터리의 용도. //

레지스터리는 다양한 용도로 사용합니다.

1. 복사방지 장치로 이용.

2. 응용프로그램의 path 설정.

// 어플의 중복실행을 막아야 하는 경우 //

1. DB 관련 프로그램에서 클라이언트의 과도한 연결을 줄이고자 할 때

2. TMediaplay 컴포넌트 사용시 윈도우 리소스 과도한 사용을 제약 할 때

3. C/S 어플에서 특히 서버 프로그램이 중복 실행되지 않도록 한다.

// 하드웨어 참고자료 //

요즘의 컴퓨터는 저가형에 통합보드를 사용하고 해서

산업용으로 제어하는 데 어려움이 있을 수 있습니다.

BIOS는 자사 브랜드 특성에 맞게 수정하여 범용적인 호환문제에 제약을

둔 경우가 많습니다. 삼성컴퓨터의 M2771도 그렇구요.

HP의 BRIO410A도 그렇습니다.

따라서 BIOS에 의존않고 윈도우에서 제어하도록 해야합니다.

c:windowssystembios.vxd를 도스모드에서

bios.old로 수정한다음 사용하시면 됩니다.

카드 슬롯에 카드를 모두 꼿아서 장치가 많아져서 오동작을 하는 경우엔

시스템-등록정보-시스템장치-PCI장치 - 등록정보 - IRQ 조절장치 사용안함에

체크표시 하면 됩니다.

컴퓨터에 부착된 장치들의 제어에 대한 오동작은 메인 보드의 PCI

ROUTER CHIP의 성능에 의해 영향을 받습니다.

// 프로젝트 관리문서 //

프로젝트 관리는 ISO 소프트웨어 품질관리 규정에 따라 관리하는게

좋습니다. 프로젝트 관리에 대한 문서 목록입니다.

1. 업체상담 보고서
2. 제안서
3. 견적검토서
4. 견적서
5. 계약검토의뢰서
6. 계약관련회의록
7. 계약서
8. 개발계획서
9. 테스트 계획서
10. 테스트 결과 기록서
11. 개발단계평가보고서
12. 개발변경보고서
13. 개발출력물목록표
14. 개발완료보고서
15. 구매 품의서
16. 견적의뢰서
17. 거래명세표
18. 물품인수증
19. 검수확인서
20. 개발승인원
21. 개발회의록
22. 견적내용
23. 개발요청서
24. 개발검토서
25. 발주서


// 개발자들의 보조 도구 //

여기에는 일반 개발자들이 사용하는 프로그램들입니다.

이 목록에 있는 소프트웨어를 사용하지 않는 분들도 있어요

* 주의 : 모두 상용 소프트웨어이며 제조회사의 등록상표입니다.

1. Case 도구 : ErWin, Rose

2. DFD 도구 : ViSio2000

3. DB 종류 : 퍼셔날 오라클(윈도우용), 리눅스용 오라클(개발자버전)

4. 텍스트 에디터 : UltaEdit32.

5. 압축 도구 : WinRAR

8. 화면캡쳐도구(사용설명서제작): Snigit32

// 보안 //

보안은 아무리 강조해도 지나치지 않습니다. 하지만 완벽한 보안은

없습니다.

해킹, 크랙킹, 데킹의 기술은 항상 보안 기술보다 앞서 있습니다.

우리 나라는 최고의 해킹 기술을 갖고 있는 분들이 다른 해커들을

적발하여 사법 처리를 하고 있지만, 해커를 추적하는 분들도

어느 순간에 해커로 돌변 할 지 아무도 모릅니다.

어떠하든지 세미나, 개발자 모임에서 자기 회사의 서버가 완벽한

보안 시스템을 구축했다고 공언을 해서는 절대로 안됩니다.

개발 툴이 어떤 것이든지 프로그램 소스 코드는 개발회사의 재산입니다.

그러나, 오너, 프로젝트 메니저, 심지어 개발자까지 소스 코드의 보안에

무관심합니다.

보통, 개발 소스가 오픈 된 경우는 바이러스 프로그램에 의한 경우가

많습니다. 바이러스 프로그램이 포트와 공유 리소스를 강제 개방 시키는

것입니다. 바이러스 프로그램에 의한 것은 각종 보안 툴로 검사해도

공유 리소스가 열리지 않는 것으로 나타나지만 실제로는 열려진 경우가

많습니다. 그 실례가 원격 컴의 포트 139번 개방과 네트워크 브로드

케스팅입니다.

특히, NetBEUI 프로토콜인 경우도 보안에 취약하기 마련입니다.

원격 컴퓨터의 공유 리소스 오픈의 확인 형식은

//IP Adress, IP Adress, //HostName, HostName등입니다.

보기> //127.0.0.1, 127.0.0.1, //HomPC, HomPC

위 형식은 TCP/IP와 윈도우 운영체제에서 공유 리소스에 대한

접근을 허용합니다.

위에 대한 문제는 방화벽을 구축한 서버에서 어느 정도 감시 및 보안을

기대 할 수 있으나 아직도 여기에 무관심한 개발자가 많습니다.

따라서 어떠한 곳이든지 인터넷에 연동 되었다면 공유 리소스가 오픈된

상태에서 자료를 열람이 가능하게 됩니다.

일반 개발회사의 소스코드 노출 사고는 많은 경우 실무 경력이 없거나

개발자에 입문하신 분이나 신입 사원에 의해서 많이 발생하게 됩니다.

개발자 동호회 사이트의 게시판은 프록시 서버를(보안과 캐쉬를 위한)

사용하지 않는 경우에는 고정 IP주소가 고스란히 남습니다.

이것은 해커들의 표적이 됩니다.

해커들은 개발 기술에는 관심이 없고 상대의 컴퓨터 자료를 훔치는

일에 시간을 보냅니다.

폴더의 공유이름뒤에 $를 붙이면 윈도우 탐색기에는 나타나지 않지만

실제로 폴더가 열려 있습니다.

특정 폴더의 읽기 전용의 권한은 방화벽이 없는 경우 근거리 뿐만 아니라

원거리 까지도 공유 가능하다는 것을 주의 하시기 바랍니다.

따라서 폴더를 공유 할 때는 반드시 읽기 전용에 암호를 -바빠도1234정도는-

부여하시고 전체 공유를 해서는 안됩니다.

<주의 >

초보 개발자는 노련한 개발자를 의지하게 마련입니다.

그리고, 전문가의 포트 스캔에 무력하기만 합니다.

그래서 만약 다른 개발자가 보안툴이라고 파일을 보내주면 절대로

개발 작업을 하는 컴퓨터에 설치해서는 안됩니다.

99.9 % 순도의 백도어 프로그램입니다.

비록 호의에 고맙기는 하지만 거의가 백도어 프로그램입니다.

상대 컴퓨터의 소스코드를 훔치려는 나쁜 사람들이 많습니다.

전 개발 과정에서 항상 컴퓨터를 개발자 한사람당 컴퓨터를

2대를 할당하여 개발용 컴퓨터는 물리적으로 인터넷 망으로 부터

절단 시키고, 인터넷 검색용은 별도로 마련하도록 합니다.

DB 서버는 절대로 물리적으로 인터넷과 연동 시켜서는 안됩니다.

// NB Scanner의 로직 //

1. 검색 시작IP와 끝IP를 입력 받습니다.

2. ping을 합니다.

3. ping 응답이 있으면 GetHostName하여 컴퓨터 이름을 가져옵니다.

4. port 검색을 시작합니다.

5. port 숫자는 1..6555 까징

// 나약한 DLL 파일들 //

윈도우 운영체제에서는 DLL 파일을 포함해서 *.DB *.DBF등의 파일은

자주 손상됩니다.

외관상 정상적으로 보이나 헤더 및 중간에 체인이 되는 경우가 많습니다.

어떤 경우엔 HDD의 결함으로 파일 손상이 빈번하게 발생되면,

프로그램의 재 설치로는 소용이 없는 경우가 있습니다.

이럴때는 특정 DLL을 메모리에 로드 할 때 즉시 이것을 가로채어

DLL헤더 및 구조를 검사하여 손상되었으면 복원 및 교체 시키는

방법이 있습니다. 인터럽트를 가로체서 하는 방법이 있을 수 있습니다.

열려진 파일들이 갑작스런 정전시에 닫혀지지 않거나 바이러스

프로그램으로 인해서 발생하기도 합니다.

소스코드에서도 반드시 사용 후에는 파일이 닫혀지도록 코딩하는 게

좋습니다.

// CD-R/RW 사용시 주의 사항 //

* 기록중에는 절대로 다른 작업을 하지 마십시요. 실패의 주원인이

됩니다.

* 각종 DISK를 복사할 때는 HDD에 DATA를 저장 후 복사를 진행합니다.

* 기록 전에 화면 보호기, 백신 프로그램의 시스템 감시기능, 기타

백그라운드에서 실행되는 E-Mail 도착을 알리는 프로그램등을

종료해야 합니다.

* 전원 절전기능은 Disable하십시요(Bios 및 윈도우 절전기능)

* CD-ROM이나 RW의 등록정보에서 DMA 설정창의 활성화

* HDD의 DMA 설정을 Check.

* 디스크 조각모음을 합니다.

* 저배속으로 기록시 실패율이 적습니다.

// 코딩시 주의할 점 //

구현하시다 보면 개발 툴에 관계 없이 질리도록 반복 되는 것이

있습니다. 또한, 한 프로젝트 내에 특정 함수가 생각이 잘 안나서

그동안 개발한 응용프로그램 소스 내에서 찾느라 고생하는 경우도

있습니다. 그럴 경우엔 공통 유닛에 모두 모아 두면 참으로

편하답니다. 물론 단점도 있습니다.

그리고, 어떤 경우라도 로직은 편이하게,

어느 누가 소스를 보아도 이해하기 쉽게 구현하셔야 합니다.

그러면 그것을 재사용 하는 데 용이하고 소스가 사장 되지 않고

프로그램을 개선 할 수 있습니다.

20년 이상을 개발하시는 분들의 소스를 보면 그것을

알 수 있습니다. 조잡한 소스는 그걸로 생명이 끝나고 맙니다.

자기 발전에 도움도 되지 않습니다.

실무용 소스를 보고 가치가 있는 것인지 여부의 판별이

쉽지 않습니다.

// 미니프로젝트 //

여기서 제가 말하는 미니프로젝트는 6개월 이하의 짧은

프로젝트나,팀 프로젝트가 아닌 개발자 혼자서 업무분석,

설계, 코딩, 디버깅, 배포, 도움말 작성등 일련의

모든 작업을 하는 것을 말합니다.

중소 규모의 소프트웨어 개발업체가 영세성을 면하지

못하고 있고, 또한 발주로부터 수주까지의 과정이 까다롭고

투명하지 못하여 하청에 재하청 연속으로 실제적으로 개발자에

돌아가는 현물 금액이 그리 많지 않는 형편입니다.

특히, 델파이와 관련해서 초급 기술자가 많은 편이고

중고급 개발자가 많이 부족해서 소프트웨어 개발 관련 업체에서

많은 어려움을 겪고 있습니다.

// NT4.0에 Interbase DB 올리기 //

* NT를 부팅시킨다음 관리자 계정으로 로그인 한다.

* [ 시작 - 설정 - 제어판 - 서비스 ]를 차례대로 클릭한다음

window installer가 시작되었는지 확인해서 시작되지 않았으면

서비스 시작을 시킨다.

* [ 시작- 프로그램 -관리도구(공용)-사용자 관리 ]를 클릭한다음

새로운 사용자 계정추가를 클릭한다음,

클라이언트의 윈도우 로그온 사용자이름을 입력한다.

주의 할 점은 네트워크 환경을 클릭했을 때 나타나는

컴퓨터 이름을 입력하는 것이 아니라 윈도우 부팅시

로그온 할 때 입력하는 사용자 이름을 입력하는 것이다.

시디롬 드라이브에 델파이 엔터프라이즈 버전을 넣으면

나타나는 설치 목록 중에 InterBase5.11을 클릭한다.

설치 지시에 따라 프로그램을 설치를 완료한다.

* [ 시작 - 설정 - 제어판 - 서비스 ]를 차례대로 클릭한다음

InterBaseServer 를 클릭하고 시작옵션을 클릭한다음

자동으로 선택하고 시스템 및 데스크탑 상호작용을

선택한다.

* 인터베이스 DB 파일을 반듯이 루트 디렉토리에 복사한다.

예론, HDD가 C: D: 으로 파티션이 나누어 졌다면

d: 디렉토리에 DB를 복사하면 된다.

HDD의 디렉토리 깊은 곳에 DB를 복사하면 효율적이 아니다.

* 공유에서 디렉토리 사용자 권한 설정은

다음과 같이 4가지 구성원이 추가 되어야 한다.

Administrators 모든 권한

Creator Owner 모든 권한

Everyone 바꾸기

System 모든 권한

* 클라이언트 윈도우에서 BDE 관리자를 열고 알리아스와 Path를

설정한다 .

경로 설정은 다음과 같다.

SERVER NAME의 파라미터 설정은 BDE의 버전에 따라 다를 수 있습니다.

일반적으로 형식은 다음과 같습니다.

서버컴퓨터이름:드라이브명:/절대경로/DB이름

보기> NTServer:d:/InterBase.GDB

구 버전에서 다음과 같은 경우도 있었습니다.

//서버컴퓨터이름/드라이브명:/절대경로/DB이름

보기> //NTServer/d:/InterBase.GDB

// 델파이 개발자님들에 대한 소개 //

초보 개발자나 실무경력 1년차 분들은 다음 소개하여 드린

개발자님들의 홈페이지를 방문하여 많은 자료를 수집하시기

바랍니다.

이 분들의 이름을 알려드리기 전에 그 분들의 허락을 받아야 하나

제 임의대로 게시합니다. 또한 그 분들의 이의가 제기되면

즉시, 모두 삭제하고 다시 편집하겠습니다.

순서는 없으며 생각나는 대로 게시하겠습니다.

[ 개발자 인명록 ]

권용길님, 민성기님, 하영재님,이정욱님, 김영대님, 양병규님,

류기동님, 허일학님, 우영범님, 김태영님, 이화식님, 여덕수님,

석봉현님, 신문섭님

< 추가 >...

우리 나라는 재능이 많은 고급 개발자님 들이 있습니다.

이름이 널리 알려지지 않았지만 초절정 고수님들이 수 없이

우리 주위에 많습니다.

여기 델마당은 다른 개발 툴의 영업직원이나,

비쥬얼 베이직, 비쥬얼 C++, C++, 파워빌더 등

주력 툴이 델파이가 아닌 분들도 많이 방문하는 것으로

생각됩니다.

// DELPHI와 VCL //

VCL은 참으로 예술 자체입니다. 만일 개발자 개인이 이런 라이브러리를

만들 정도라면 실력있는 고급 개발자입니다.

VCL을 보고 다른 툴의 라이브러리로 만들면 재미 있을 것이라는

생각을 했습니다.

소스가 있는 라이브러리는 다른 툴로 쉽게 포팅이 가능합니다.

그래도 원초적인 운영체제의 버그를 피해가거나 최적화 시키기 위해서

dcc32.exe의 역할이 크다고 봅니다. 안정적인 기계어 코드의 생산은

아무리 강조해도 지나치지 않습니다.

// 구현할 때 주의 할점 //

1. 생성된 실행 파일의 크기가 작아야합니다.

2. 실행 파일이 윈도우 리소스를 소모하는 것을 최소화 시켜야

합니다.

컴퓨터의 사양이 저급하더라도 프로그램이 잘 실행되게

만들어야 합니다. 날씬한 프로그램이 C/S 버전에서 위력을

발휘합니다.

3. C/S 버전 어플을 개발한다고 해도 꼭 TClientDataSource,

TClientQuery를 사용 하실 필요는 없습니다.

다만 TQuery나 TDataSource를

사용 할 때 Connection 처리만 잘해주면 실제적으로

프로그램이 잘 실행됩니다.

어떤 개발자님들은 BDE 엔진이 무겁게 느껴져 짜증을 내기도 합니다.

사실 DB 설계만 잘 하면 BDE내의 함수가 다 필요로 하진 않습니다.

그래서 같은 BDE엔진이지만 SQL LINK를 사용하기도 하고

심지어 어떤 경우에는 독자적으로 DB 엔진을 DLL 파일 형태로

만들어 사용합니다. 일종의 소켓 프로그램이지여

// 이론과 실무 //

이 글을 열람한 분들이 이미 느끼고 계시겠지만 이 글 내용면에서

시중의 컴퓨터 관련 서적에서는 볼 수 없는 것들이 많습니다.

물론, 시중의 참고 서적 중에 실무에 대한 책이 전혀 없는 것은

아닙니다. 그런한 서적이 존제한다 할지라도 실무에 얼마나

도움이 될지는 미지수입니다.

이 글은 개발과 관련된 저의 개인적인 경험과 고민을 바탕으로

구성 될 것입니다.

개발자란 직업을 갖게 되었을 때 제일 힘들게 하는 것은

이론과 실무는 너무 차이가 있다는 것입니다.

저의 은사님이었던 박사님들 까지도 그 차이가 크다는 것을

예측하지 못하셨나 봅니다. 또한 저를 개발자로 양성하여

주신 선생님들까지도 실무에 사용된 라이브러리를 공개하여

주시지 않았고 그 개발 노하우 즉 배타적인 개발기술에 대한

강한 집착을 보여 주셔서, 저는 항상 그것에 대해 의문을

가지고 있었는 데, 제가 실무에 종사하고 보니 그 맘을

해아리게 되었습니다.

많은 분들이 소스 공개를 외치며, GNU 구호를 외칩니다.

여러분은 이찬진 님의 워드프로세서 한글97의 소스 가치는

얼마라고 생각 되시는지요?

안철수님의 V3의 소스 가치는 얼마나 된다고 생각하십니까?

빌게이츠님의 운영체제인 윈도우95의 소스 가치는 얼마나

된다고 생각하십니까?

그렇습니다. 모두 수억원을 호가합니다. 이런 부가 가치를

생각하신다면, 개발자 의사에 반해서 함부러 소스 공개를 요구하지

못하실 겁니다. 간혹, 아무 댓가 없이 소스를 주시는 분을 만날 수도

있습니다. 만약, 그렇다면 그 개발자는 님에게 엄청난 호의와 배려를

한겁니다. 현금처럼 자신의 재산을 나누어 주시는 겁니다.

아무쪼록, 이 글을 읽으시는 모든 분들이 양질의 고급 프로그램을

많이 개발하시길 바랍니다.

초보자들이 많이 궁금해 하는 것은 어떻게 하면 빠른 시간 내에

원하는 프로그램을 만들 수 있는가? 또한 그 방법은 무엇인가?

그런데, 정말 기초 부터 튼튼한 개발자라면 델파이에 공개된

소스들을 그냥 지나치지 않을 것 입니다.

이 소스들은 어떻게 코딩을 하는 것인가? 구현 방법들을

구체적으로 예시하여 준 것을 나타내므로 개발자는

왜? 이렇게 구현을 하였는가에 의문을 가지고 주의 깊게

소스들을 살펴보아야 합니다. 개발 관련 고급 기술등은

델파이 정품 안에 모두 포함되어 있습니다.

이 소스와 함께 델파이 도움말을 참고로 연구하신다면

틀림 없이 좋은 결과가 올겁니다.

이 글 때문에 다른 개발자님들의 입지가 좁아질까 염려가 됩니다.

그 분들 나름대로 고생과 땀으로 그 개발 기술을 습득했고

너무 쉽게 개발 기술이 전수되면 질보다는 양적 팽창을

염려하게 될 것입니다.

이 글을 쓰면서 많은 부분이 실무와 관련하여 인연을 맺게된

프로젝트 메니저님, 소장님, 실장님 들의 개발 기술들이

담기게 될 겁니다.

혹시라도, 프리랜서로 재직하시는 분들은 그럴 기회가

있을 지 모르지만, ERP 관련 업체에 근무하시게 되면 꼭 프로젝트

보고서를 열람하시기 바랍니다.

ERP 프로젝트 보고서 이 책 한권을 만들어 내기 위해선

수억이 들어갑니다. 회사 규모에 따라 다르지만 수십억에서

수 백억의 비용이 소요됩니다.

이 보고서는 일반적으로 대외비입니다.

회장, 정보담당이사,전산실장 등이 열람 가능자입니다.

요즘은 평생직장 개념이 사라졌읍니다.

그래서 사람을 임의로 면직 시킵니다.

오너가 무능하면 전산 관련 담당자를 아무나 선임하는 경우가 있고,

보안 관련해서 서버 관리자를 임의로 교체하는 경우도 있습니다.

이런곳에 파견나가면 손쉽게 그 귀한 보고서를 열람 할 수

있습니다. 이 문서의 가치와 취급을 잘 못하는 경우도

있습니다. 개발시 필요하다고 요청하면 되겠죠? ^^

우리나라에서 ERP 관련 유명한 업체는 엔더슨~스미스

컨설팅일 것으로 생각합니다.

SAP는 넘 유명해서 SAP와 관련하여 개발 경험이 있는 분은

많은 기술을 배울 수 있을 것이란 생각을 하지만

잘 모르겠습니다. 우연이라도 이런 자료를 열람하게 되면

그냥 지나치지 마시구 깊이 연구 및 탐독하시기 바랍니다.

저는 고백하건데 파스칼을 본능적으로 싫어 했습니다.

수치해석과 관련하여 어쩔 수 없이 사용하긴 했지만.

아무튼 파스칼이 그래픽을 표현하는 데 용이하다고 해서.

친구 녀석의 꼬임에 넘어가서 관심을 가지게 되었습니다.

델파이가 이런 나의 파스칼에 대한 편견에 마침표를 찍었습니다.

파스칼을 오브젝트 파스칼로 바꾼 것은 예술 그 자체입니다.^^

델파이를 공부하게 되면서 시중 서점에서 엄청 두꺼운 4만원

가까이 하는 델파이 관련 서적들을 구입하여 탐독 하였습니다.

그러나 책을 읽고나서, 도무지 쓸만한 응용프로그램을 만들 수가

없었읍니다. 그리고 인터넷에서 웹,고퍼,아키, FTP 사이트를

전전해도 실무용 소스를 찾기는 힘들었습니다.

개발자가 되고 싶다고 해서 인도처럼 실무에 사용 될 정도로

개발자를 우리나라에서 양성하는 곳이 적습니 다.

물론 (주)비트컴퓨터에 입사하면 좋은 데 입사가 매우 까다롭고

입사 시험에 합격해야 합니다.

우리 나라에서 개발자가 되는 일이 쉬운일이 아닙니다.

그리고 전산 관련 세계는 인맥을 중요시 하니까, 어느 직장에

입사하시든지, 실무 1년차는 인간관계를 소중히 하시길 바랍니다.

피곤하고 스트레스 많아도 직장 상사들과 원만하게 지내며

근무하시길 바랍니다.

// 실제 세계와 컴퓨터의 세계 //

소프트웨어 개발 업체의 오너는 개발 과정에 대한 이해가

많이 부족합니다.

그래서 때때로 개발자에게 말도 안되는 로직과 기능을

요구합니다. 보통 오너들은 개발자가 만능 재능을 가지고

있다고 착각을 많이 합니다.

개발자도 나름대로 자신 있는 분야가 있기 마련입니다.

예론, 비쥬얼 베이직 개발자 에게 자바 프로젝트를 의뢰한다거나

어셈블리어를 구현 시키는 것 등등 .

중급 개발자라도 오너가 로직이 불가능한 것을 지시했을 때

의견 충돌로 사직하는 경우가 많습니다.

오너는 자기가 제시한 아이디어가 구현하는 것이 그렇게

어려운 일인가는 모릅니다. 다만 사업성 즉, 돈이 되겠다는

생각에 그렇게 지시하는 것입니다.

이때는 먼저 오너가 제시한 문제에 대하여 최선의 인터뷰를

기획하여 사장님의 구상이 실제 전산 세계로 변환시키는

작업을 합니다.

프로그램 실행상 오류를 내겠지만 그것을 조각화 내지

단편화 시켜서 부분적으로 구현합니다.

그러니까 제시한 아이디어 중 당신이 구현 가능한 것을 찾아내어

그것부터 구현하시라는 말입니다.

그리고 구현이 어려운 부분은 예외처리를 이용하며

최선을 다하여 개발에 힘쓰고 전반적인 것에 대하여

충분하게 오너에게 설명해야 합니다.

오너가 이해하든지 말든지 그게 중요한게 아니구요.

필요하다면 프로젝트 성공을 위해 자기가 취약한 부분에 대한

다른 개발자 차용 및 임용 또는 아웃소싱을 고려합니다.

오너 입장에서는 경제성을 고려하여 프로젝트를 진행할것인지를

결정하게 될 것입니다.

개발자가 무조건 오너에게 반항하는 것은 옳지 못합니다.

사전에 충분이 오너에게 이해를 구하셔야 합니다 .

이런 일이 실무에서 자주 생겨서 유능한 개발자가 사표를 내는

경우에 마음이 아픕니다.

이 글을 읽으시면서 실무경력 1년차 분들은 실무에 대한

기본적인 개념을 습득하길 바라며, 여기에 소개된 로직과

함수들은 비쥬얼베이직, 파워빌더, C 언어로 모두 포팅이

가능한 것들입니다.

각 개발 툴에서 기본적인 것이 무엇일까요?

저는 프로그래밍한지가 오래 되었습니다.

그렇다고 해서 제가 실력이 뛰어나다는 것은 아닙니다.

프로그램 구현에 있어서 가장 중요한 것을 들라면

컴포넌트, 클래스, 함수, 로직이 아닐까 생각합니다.

결국은 함수의 싸움인 것 같습니다.

여기서 함수란 사용자 정의의 함수를 말하며,

델파이에서 지원하는 기본적인 함수의 함수를 말합니다.

함수안에 함수로써 로직을 구현한 것들의 집합입니다.

여러가지 비쥬얼 툴들은 컴포넌트만 잘 관리하고 유지하면

응용프로그램들을 쉽고 빠르게 만들 수 있습니다.

개발자는 틈틈히 컴포넌트에 대해서 깊게 공부해야 합니다.

컴포넌트 아무리 강조해도 지나치지 않습니다.

컴포넌트 내부를 뜯어 고치려면 함수를 깊이 알아야

합니다.

컴포넌트는 소스가 없으면 외관상으로 컴포넌트 프로퍼티나

이벤트는 쉽게 나타나지만, 내부의 실제적인 구현 내용

즉,컴포넌트가 가지고 있는 행동 기능은 나타나지 않습니다.

일반 라이브러리처럼 콤포넌트 사용설명서나 소스가

있어야 내부에서 이 콤포넌트가 하는 일을 정확히 알 수

있습니다.

폼에 콤포넌트를 올리면 바로 그 컴포넌트가 하는 기능을

사용 가능합니다. 그치만 그 폼에서 그 컴퍼넌트의 영역으로

영향을 주는 범위로 한정합니다. 마치 지역 변수 객체처럼요.

여러가지 함수로 자기만의 라이브러리를 구축 할 때

자기도 모르게 개발능력이 배양되는 것 같습니다.

어떤 특정 기능을 위해서는 즉, 막고 품어야 할 경우에는

API 함수를 잘 알아야 합니다.

이 함수 전체를 알 필요는 없지만 그래도 많이 알아 둘수록

막고 품어야 하는 최악의 경우에 매우 유용합니다.

많은 실무용 프로그램에서 자주 사용되는 것은 바로

사용자의 입력 받는 폼의 처리입니다.

대다수의 고급 개발자는 델파이 컴퍼넌트의 파랫트에

있는 표준 컴포넌트를 그대로 사용하지 않습니다.

왜냐하면 델파이를 오래 사용했다 하더라도 표준 컴포넌트에

내장된 정확한 함수를 모르는 경우가 많고 기능도 모르는 것도

많습니다. 그래서, 이 표준 컴포넌트를 가지고 중복정의하여

새로운 컴포넌트를 만들어 사용합니다.

그럼, 표준용 컴포넌트를 가지고 사용자 정의용 컴포넌트를

만들어 보겟습니다.

이렇게 표준 컴포넌트에 다가 다시 사용자정의로 컴포넌트를

만들어 쓰는 이유는 물론 텍스트 상에서 소스를 분석 가능

하겠지만 이 사용자 정의의 컴포넌트가 없으면,

비쥬얼하게 소스를 보는 것이 쉽지가 않겟지여.

각 툴들이 동일 버전에서 마이그레이션을 한정합니다.

그래서, 표준 컴포넌트만 사용하면 마이그레이션이

쉬울 겁니다.그러나 소스 코드만 갖고 있다면 염려하실

필요는 없습니다.

가장 많이 사용되는 것이 에디트, 마스크 에디트, 리얼에디트,

비트버튼 등입니다.

수 많은 클래스 구조를 만들어 보시고 이미 만들 어진

클래스도 열람하시면 됩니다.

// 에디트 클래스의 구조 //

TMyEDIT = Class(TEdit)
private { Private declarations }
FFFF : Boolean;
procedure enter; Override;
procedure Click; Override;
procedure Change; Override;
procedure KeyDown(Var key : Word; Shift : TshiftState); override;
public { Public declarations }
Constructor Create(Aowner : Tcomponent); override;

published { Published declarations }

property Han : Boolean read FFFF Write FFFF;

end;

먼저 사용자 정의의 에디트 클래스에 추가해야 할 멤버 함수는

Change, Click, Enter, KeyDown, Create 등입니다.

// procedure TMyEDIT.Change의 구현 //

1. 폼 변수 설정

2. 상속 ( inherited change; )

3. 폼 변수에 할당 ( GetParentForm(Self); )

4. 만약 폼 변수 <> Nil 이면

만약 MaxLength = GetTextLen 이면 SendMEssage(MyFORM.Handle,WM_NEXTDLGCTL,0,0);

// procedure TMyEDIT.click의 구현 //

1. SelectAll

2. 상속(inherited Click;)

// procedure TMyEDIT.DoEnter의 구현 //

1. 만약 ffff 이면 SetHan(Handle) 그밖에 SetEng(Handle);

2. 상속 (inherited doEnter;)

// procedure TMyEDIT.KeyDown(Var key : Word; shift : TshiftState)의 구현 //

1. 변수정의 (Var MyForm : TCustomform; )

2. MyForm := GetParentForm(Self);

3. 만약 MyForm <> Nil 이면

Case key of
Vk_Down,
Vk_Return : SendMEssage(PFORM.Handle,WM_NEXTDLGCTL,0,0);
Vk_Up : SendMessage(PFORM.Handle,WM_NEXTDLGCTL,1,0);

그밖에는 Inherited KeyDown(key,shift);

// Constructor TMyEDIT.Create(Aowner : Tcomponent)의 구현 //

1. 상속 ( inherited Create(Aowner); )

2. AutoSize := False;

3. AutoSelect := True;

4. Parentctl3d := False;

5. Maxlength := 10;

6. Ctl3D := TRUE;

7. FONT.Name := '굴림체';

8. Font.Size := 10;

9. Font.Color := ClBlack;

10. TEXT := '';

----------------------------------

// TMediaPlayer 컴포넌트 사용시 주의 할 점 //

* DB 연결 오류, 네트워킹 오류, TMediaPlayer.Path에 절대 경로

상의 재생 파일이 없을 때 mmsystem 오류를 냅니다.

* Mplayer.exe 와 Mplayer2.exe는 다른 특성이 있습니다.

재생시 코덱이 필요한 경우가 있으며 사용 권한을 인증 받아야

재생되는 경우가 있으니 주의하시기 바랍니다.

* Try TMplayer execept ~ end;로 처리하는게 좋습니다.

* Refresh를 해 주어야 합니다.

// 자료 복구 프로젝트 //

DB에서 유일해야 할 레코드가 중복 되었을 경우 레코드를 검사하여

복구해주는 루틴입니다.

1. 관련 컴포넌트 : TDataBase 1개, TQuery2, TDataSource 2개

2. 자료검사 버튼의 처리

3. 레코드 중복검사 질의문

qy1.close;
qy1.sql.clear;
qy1.sql.add('
select code, wdate count(*) cc from MyTable group by code, wdate
having count(*) > 1 ');
qy1.open;
if qy1.recordcount > 0 then button2.enabled := True;
edit1.text := Qy1.recordcount;

// 델파이 환경설정 팁 //

[ Tools - debugger options - OS Exceptions - Access violations ]

Handled By : Debugger 체크,

On Resume : RunHandled 체크

위와 같이 하지 않으면 어떤 경우엔 Stack dump나 시스템 폴트를

일으켜 작업중인 변경된 소스를 저장 할수 없게 될 수도 있읍니다.

메모리가 적은 윈도우 95 운영체제에서 발생 될 소지가 있으나

그외의 사양에서는 문제 될 것이 없다고 생각됩니다.

// 프로로젝트의 관리 //

프로젝트 관리는 개발자 취향에 따라 여러가지가 있습니다.

어떤 개발자는 컴포넌트를 모두 한 디렉토리에 모아서 사용하는

경우도 있습니다.

필자는 프로젝트 하위에 디렉토리를 생성하고 컴포넌트를 위치

시키는 것을 권장합니다.

물론, 컴포넌트 소스 파일이 중복된다는 단점이 있지만

해당 프로젝트에서 어떤 컴포넌트가 사용 되었는지를

명확히 하고 또한 소스 파일을 백업 한 후

백업본을 다시 사용 할 때 컴파일이 쉽다는 장점이

있습니다.

예론, c::myprojectmycomponent

그리고 프로젝트 단위별로 암호를 사용하여 압축한 뒤에

날짜별로 보관합니다.

// 소프트웨어 유지보수 //

소프트웨어 유지 보수의 관건은 비용 문제입니다.

어떤 경우라도 비용이 제한 폭 내에서 지출되어서는 안됩니다.

자동업그레드 기능을 응용프로그램에 추가하는 방법이 있습니다.

자동 업그레드 전에 설치 마법사를 사용한 셋업 프로그램이 준비

되어 있어야 합니다.

1. 고객과 전용선을 통하여 웹으로 연동되어 있는 경우에는

ICS(Internat Component Suite)컴포넌트등을 사용하시면 됩니다.

원격제어 프로그램 노턴의 PCAnyWare를 사용하는 방법도 있습니다.

2. 고객과 순수하게 모뎀으로 연결한다음 원격제어 프로그램을

이용하는 방법이 있습니다.

터미널 제어 프로그램 즉 통신 에뮬레이터를 활용합니다.

3. 고객은 모뎀으로 접속한다음 전화접속 네트워킹을 통하여

웹과 연동한 다음 자동 다운로드하게 만듭니다.

4. 인터넷에 접속 > 버전 검사 > 다운로드 >

실행중인 프로그램 강제 종료 > 이전 버전 프로그램제거 >

업그레드 시작 > 시스템 재시작

// 윈도우 95/98에서 경로 설정이 안될 경우 //

간혹 운영체제에서 경로 설정이 되지 않는 경우가 있는 데 아래와

같이 처리합니다.

* autoexec.bat 에 추가 내용 *

PATH=C:WINDOWS;C:;C:WINDOWSCOMMAND;

SET PATH=%PATH%;C:WINDOWS;C:;C:WINDOWSCOMMAND;


// 주석문 사용법 //

(****************************************************

폼 명칭 : 용도 설명

저작권 : (c) Copyright ~

저자명 : 저자이름(전자우편)

홈페이지 : 홈 페이지 주소

사용법 : 사용법 기술 및 제약사항

--- 각 함수에 대한 주석 방법 ---

명 칭 :

소 속 :

목 적 :

****************************************************)

// 부분 소스연구 //

* Cancel 버튼을 클릭 이벤트의 처리

ModalResult := mrCancel; // Close;의 결과 값을 반환해줌

* Ok 버튼을 클릭 이벤트의 처리

ModalResult := mrOk; // Ok 버튼을 클릭한 결과 값을 반환해줌.

* TEdit.text에디트로 입력 받은 URL을 가지고 기본 브라우저를

실행시켜 사이트에 접속.

ShellExecute(Self.Handle,
PChar('open' + #0),
PChar((Sender as TEdit).Text + #0),
PChar( #0 ),
PChar( #0 ),
SW_SHOW);

* 폼에서 초기화 부분이 많을 때 일괄 초기화 시킴 *

procedure FormCreate(Sender: TObject);
begin
Self.Initialize;
end;

procedure Initialize;
begin
초기화 할 컨트롤 목록들
end; { Initialize }

// 고급 개발자로 출발시 유의 할 점 //

1. 개발 툴이 비쥬얼 베이직, 비쥬얼 시뿔뿔, 파워빌더, 델파이든지

개발 툴의 종류에 상관 없이 각 개발 툴에 대한

자기 고유의 라이브러리를 구축해 나가야 합니다.

2. 라이브러리가 구축되면 각종 환경에 적용 가능한

프로젝트 원형을 만들어 나가야 합니다.

3. 새로운 프로젝트가 발주되면 가장 비슷한 원형을 가지고

구현을 시작하며, 만약 새로운 프로젝트가 기존 원형을 가지고

있지 않을 경우 프로젝트 진행과 더불어 원형을 만드는 작업을

동시에 합니다.

4. 프로젝트 원형을 만들면서 반복되거나 재사용 가능한 함수는

모두 공통 유닛에 라이브러리에 모아둡니다.

5. 모든 구현 코드는 알기 쉽게 편이하게 구현하며 수 십년간을

꾸준히 업그레드합니다.

6. 모두의 코드의 구현이 개발자 혼자하든지 아님 팀으로 하든지

동일한 인터페이스를 가져야 합니다.

7. 각 개발툴의 버전에 따른 소멸된 함수, 생성된 함수에 관한

내용을 공통 유닛에 주석문으로 처리하여 기록합니다.

특히 클래스 계보에 관한 것도 주석문 처리하여 기록합니다.

8. 만약 운영체제 플랫폼의 제약을 받지 않으려면 시언어로

포팅을 합니다.

9. 만약 이미 툴에 존제하는 함수이지만 개발자가 사용자 정의로

새로운 아이디어가 생각 났을 때, 공통 유닛에 사용자 정의함수로

구현하도록 합니다.

// 윈도우 설치시 그림이 동적으로 디스플레이 되는 방법의 구현 //

사용 컴포넌트는 TTimer, TImage, TFileListBox를 사용하여

TFileListBox의 Visible 속성을 False로 한다음

타이머 이벤트에 아래와 같이 구현한다.

procedure Timer1Timer(Sender: TObject);
var
path : string;
begin
path := 'e:'; // 동적으로 뿌려줄 *.bmp 파일이 있는 경로
Image1.Picture.LoadFromFile(Path + FileListBox1.Items[piccount]);
inc(piccount);
if piccount = FileListBox1.items.Count then piccount := 0;
end;


// 미니급 C/S 버전 프로그램의 개발 //

1. 프로젝트 파일의 내용

1) . Y2K의 처리

2). 프로그램 중복실행 방지 루틴

3). 응용프로그램의 동적 타이틀 생성.

4). 로그인 폼을 메인 폼으로 만들 것( 제일 먼저 생성되게 만듬)

5). 스플래쉬 폼의 처리

* 프로그램 중복실행 방지의 구현

if FindWindow( 'TloginFrm', '착한 여자가 조아 Ver 1.0' ) > 0 then
begin
Application.MessageBox(0,'프로그램이 중복 실행 되어
이 프로그램은 종료합니다. ',
'중복실행오류',mb_ok+mb_iconstop) ;
Halt;
end;

* 프로그램 중복실행 방지의 구현2

var
MuxHandle : THandle;

begin

Application.Initialize;

MuxHandle := FindWindow( 'TFrmLogin', PChar('바보프로그램') );

if MuxHandle <> 0 Then
Begin
Application.MessageBox('프로그램이 이미 실행중입니다','확 인',
mb_OK+mb_DefButton1+mb_IconInformation);
Halt;
end;


* 스플래쉬 폼의 구현

Application.Initialize;
SplashFrm :=TSplashFrm.Create(Application);
SplashFrm.Show;
SplashFrm.Update ;
Application.Title := '착한 여자가 조아 Ver 1.0';
Application.CreateForm(TloginFrm, loginFrm);
SplashFrm.Hide ;
SplashFrm.Free ;
Application.Run;

2. 로그인 폼의 설계

1). 폼 생성시에 동적으로 폼 위치를 설정.

2). DB 연결.

3). 사용자 인증.

4). 사용자 인증이 되면 메뉴 폼 배열을 열기.

5). 폼 닫힐 때 DB 연결 해제. 모든 컴포넌트 메모리 해제.

6). 작업일자 입력받기
( 년월일을 가져와 콘트롤에 표시하고 사용자의 수정을
받은 다음에 문자열 전역 변수에 보관함
테이블 필드의 자료형태도 Char형을 사용함 )

* 로그인 폼에서 사용자 인증은 여러가지 방법이 있으나

ini 파일을 이용한 방법과 DB의 사용자 테이블을 이용하는

방법이 있습니다.

* 로그인 폼에서는 만일 자료를 파일 시스템으로 관리 할때는

예론, *.DBF 나 .DB 일 때는 자료 정리 과정을 편이하게 구현합니다.

주로 인덱스 파일을 검색하여 인덱스 파일이 존재하면 루틴을 빠져

나가고 그렇지 않으면 인덱스를 생성한다.

begin
if (fileexists('c:DB1.mdx') = true) and
(fileexists('c:DB2.mdx') = true) and
(fileexists('c:DB3.mdx') = true) Then
exit;
end;

* 작업 진행바는 TGauge를 사용하며

Gauge1.maxvalue := 인덱스 파일 갯수 ; 로 설정한다.

* 메시지 폼의 설계

{**************************************************

메시지 폼 모듈

Copyrights,2001,By ds4byw, All rights reserved.
2001. 5. 10.
유 솔로몬 (ds4byw@hanmail.net Tel 0116459006)

사용법:
사용자에게 알림 메시지를 뿌리고 사러지게함
사용하고자하는 유닛의 use절에 uses message;
를 추가한다음 아래와 같이 호출

smsg := '난 착한여자가 조아!';
frmmessage := tfrmmessage.create(nil);
frmmessage.ShowModal; // 윈도우 NT에서 지원안됨
frmmessage.Gauge.progress := 0;
frmmessage.free;
exit;
***************************************************}

unit message;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, Gauges;

type
TFrmMessage = class(TForm)
pnlmessage: TPanel;
Timer1: TTimer;
gauge: TGauge;
procedure FormActivate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
FrmMessage: TFrmMessage;
smsg: string;

implementation

{$R *.DFM}

procedure Tfrmmessage.FormActivate(Sender: TObject);
begin
pnlmessage.caption := smsg;
timer1.enabled := true;
end;

procedure Tfrmmessage.Timer1Timer(Sender: TObject);
begin
Gauge.progress := Gauge.progress + 1;
if Gauge.progress = Gauge.maxvalue then
begin
timer1.Enabled := false;
close;
end;
end;

end.


* 보통 작업 진행바는 TProgress를 사용하지 않고 TGauge를

많이 사용합니다.


* 폼생성시의 폼의 위치 동적 설정의 구현

top := 278;
left := 286;

* 메뉴 폼의 호출의 구현 : 폼 배열을 응용한 MDI 폼

if MyMenuFrm[0] = Nil then
MyMemenuFrm[0] := TBaboMenuFrm.Create(Application);

공통 유닛에 다음을 사전 정의해야 하고 각 폼의 uses 절에

공통 유닛을 포함 시켜야 한다.

Var
MyMenuFrm : array [0..20] of TForm;

* 폼이 닫힐 때 컴포넌트의 메모리 해제의 구현
" 당근이져? 그쵸?" ^^

Action := CaFree;

// 판넬(TPannel)을 사용하는 이유 //

일반적으로 개발자들은 윈도우 리소스를 최소한으로 잡아 먹도록

고려를 합니다. 그래서 가능한 판넬 사용을 자제하려고 합니다.

판넬은 판넬 자체로 다중 창을 구현 할 수 있고

판넬 위의 컴포넌트들은 판넬 안에서 그 행동을 제약 받게 됩니다.

따라서 폼 디자이너에서 판넬을 이동시키면 판넬 위의 콤포넌트들도

동시에 이동하게 되는 것입니다.

일반 폼위의 콤포넌트 위치 조정은 복수 개를 선택하여 이동 시켜야

합니다.

판넬은 다양한 속성을 가지고 있어서 여러가지 효과를

나타냅니다.

보통 입문자들은 밋밋한 폼에 각종 콘트롤을 올려 놓게 되는 데

이렇게 작업하다보면 폼 디자인에 손질이 많이 가서 귀한 시간을

낭비하게 됩니다.

반복의 최소화 효율적인 코딩을 위해서 판넬을 사용하시기

바랍니다.

// 명령 단추에 대한 고정관념 깨기 //

보통 윈도우에 기본적인 프로그램의 버튼들은 작고 귀엽게 생겼습니다.

이것은 미관상 좋을 뿐이지, 실제로 업무용 프로그램의 버튼들은

큼직하고 투박하게 만듭니다.

다른 개발자에게 구현을 시켜 보았을 때, 만약 그 개발자가

버튼 모양을 크게 만들었다면 그는 고수이거나 재능이 많은 분임에

틀림없습니다.

최종 사용자가 마우스 버튼을 클릭하여 최단시간에 버튼을 조작하며

그 조작함에 있어서 행동에 자연스럽고 피로가 적게 하기 위한

배려가 필요합니다.

업무용 프로그램은 일반적으로 지루한 반복작업의 순환이 되기

때문이지요.

// 사용자 인터페이스 GUI, TUI //

사용자 입력을 받는 부분은 옛날 도스 운영체제의 인터페이스가

많이 적용되고 또한 은행처럼 반복된 입력 작업이 요구되는 곳은

엔터 키를 누르면 탭 키를 눌렀을 때의 효과를 내는 것을

구현하여야 하며 이것은 응용프로그램 중에 많이 사용됩니다.

아래 소스를 비교해 보십시요.

procedure KeyPress(var Key: Char);
var
MYForm: TcustomForm;
begin
if Key = #13 then
begin
MYForm := GetParentForm( Self );
if not (MYForm = nil ) then
SendMessage(MYForm.Handle, WM_NEXTDLGCTL, 0, 0);
Key := #0;
end;

if Key <> #0 then inherited KeyPress(Key);
end;

procedure KeyDown(var Key: Word; Shift: TShiftState);
var
MYForm: TcustomForm;
CtlDir: Word;
begin
if (Key = VK_UP) or (Key = VK_DOWN) then
begin
MYForm := GetParentForm( Self );
if Key = VK_UP then CtlDir := 1
else CtlDir :=0;
if not (MYForm = nil ) then
SendMessage(MYForm.Handle, WM_NEXTDLGCTL, CtlDir, 0);
end
else inherited KeyDown(Key, Shift);
end;

procedure KeyDown(Var key : Word; shift : TshiftState);
Var
MYForm : TCustomform;
begin
MyForm := GetParentForm(Self);
if MyForm <> Nil then begin
Case key of
Vk_Down,
Vk_Return : SendMEssage(MyFORM.Handle,WM_NEXTDLGCTL,0,0);
Vk_Up : SendMessage(MyFORM.Handle,WM_NEXTDLGCTL,1,0);
else Inherited KeyDown(key,shift);
end;
end;
end;


[ 데이터 베이스 설계 ]

업무용으로 사용된 많은 응용프로그램이 데이터 베이스와 연동

되며 최상으로 설계된 데이터 베이스는 프로젝트를 성공으로

이끌며 프로그램 개발을 쉽게합니다.

그러나 잘못된 데이터베이스 설계는 프로젝트 실패와

많은 금전적 시간적으로 손해를 줍니다.

경험이 부족한 프로젝트 메니저는 이런 이유로 인하여 많은

리스크를 감수해야 합니다.

데이터 베이스는 경험이 많은 분이나 특히 개발쪽이 아니라

기업 및 관공서의 실무에 능한 분이 설계하는게 좋습니다.

이런 이유로 몇 년전만해도 테이블 설계만 해주고 고액의

용역 댓가를 받아가는 경우가 많았습니다.

오라클 솔류션에 보면 오라클 특유의 도구와 방법이 있습니다.

특히, 어떤 경우에는 데이터 베이스 설계를 Er-win이라는

프로그램을 사용합니다. 이 프로그램은 테이블 설계를 쉽게하고

자동적으로 테이블을 생성하여 줍니다.

오라클 기반의 질의문 사용시 어떤 결과를 원할 때에

개발자 임의로 질의문을 사용하지 마십시요.

오라클 솔류션에 보면 질의에 대한 결과 값에 대한 비슷한 경우에

사용 될 수 있는 최적화된 질의문을 이미 갖고 있습니다.

최적화된 질의문을 사용하십시요.

만약, 개발자가 최적화된 질의문을 찾았다면 질의문 예제집을

만들어 재활용 하도록 하십시요.

관계형 데이터 베이스에 대한 고정 관념을 버리십시요.

노련한 경우가 아니면 결코 지나친 정규화나 프라이머리 키,

포린 키를 설정하여 제약 사항을 만들지 마십시요.

그렇지 않으면 데이타 베이스와 연동되는 응용프로그램이

에러를 내거나 데이터 베이스를 전면 재설계해야 하는 경우가

생깁니다.

일반적으로 데이터 베이스는 데이터를 통합적으로 관리하기 위해

데이터 중복을 최소화하는 목적으로 사용됩니다.

필요하다면 데이터 중복에 연연하지 마십시요.

실제 코딩시 직관적인 변수는 알기 쉽고 이해하기 쉽게 설정하고

전체적인 알고리즘을 다른 개발자가 이해하기 쉬운 편이하게

구현합니다.시간이 허용하는 한 주석을 많이 첨가 하십시요.

일부 고급 개발자는 주석이 많은 것에 대해 꺼려합니다.

소스가 지저분해진다는 것 때문입니다.

그러나 주석이 많을 수록 그 프로그램에 대한 이해를 도우며

나중에 문서화하는 데 도움이 되며 다른 개발자에게 개발기술

전수라는 효과를 줍니다.

함수 사용에 어려움이 있다면 사용자 정의 함수를 만들어

사용하십시요. 어떤 함수들은 에러를 유발합니다.

이런 함수의 사용을 자제하십시요.

[ 비정규적인 데이타베이스의 설계 ]

이 방법은 불합리한 면도 있지만 기업이나 개발자들이 아직도

사용되고 있습니다.

바로 관계형 데이터베이스를 바로 ISAM 테이블 구조로

설계하는 것입니다.

검색 키로 사용되는 필드는 모두 인덱스 테이블을 생성합니다.

인덱스 테이블이 엄청 많아 지겠지요.

많은 대용량 솔류션 컨설런트들이 비난한점이 있지만 나름대로

이 방법이 사용되고 있습니다.

대용량 솔류션에서 보면 수백만건의 트랜젝션이라 하더라도

제3차 정규화까지하게 되면 응답속도가 3초이네로 단축 시킬 수

있다고 합니다.

이것을 구현하려면 아주 전문적인 설계자가 아니면 실패하기

쉽습니다.

많은 분들이 이런 경지에 오르려고 노력하는 것도 사실입니다.

아래 설명하려는 방법은 표준적인 방법이 아닙니다.

유지 보수의 편의성을 중심으로 아래와 같이 설계를 하는

것입니다.

기존 코볼로 만들어진 응용프로그램이나 이에 연동하는 DB와

호환하려 할 때 사용됩니다.

프라이머리 키와 포린키의 제약을 두지 않습니다.

실제적으로 테이블에서는 레코드 중복을 허용을 하며

많은 부분에서 응용프로그램에서 데이터 중복을 막습니다.

예론 락킹 방법을 사용합니다.

만약, 레코드의 중복을 피할려면 인덱스 테이블을 생성하고

그 인덱스 테이블에서 해당 필드에 대한 프라이머리 키로 제약을

합니다.

먼저 개발하려고 하는 해당 업체의 관련 부서의 모든 결제 서류를

취합한다음 관련 있는 것끼리 모아서 필드명를 정합니다.

데이터 중복이나 정규화에 신경쓰지 말고 한 테이블에 관련있는

필드를 모두 모아둡니다.

응용 프로그램에서 검색창의 조건에서 검색 키로 사용되는

모든 필드는 인덱스 테이블을 생성하고 그 필드를 인덱스 키로

설정합니다.

검색 키로 사용될 필드는 모두 인덱스 테이블이 생성되어야 하며

필드 형태는 CHAR를 사용합니다.

금액이 들어갈 필드는 자료의 표현범위에 유의해야 합니다.

필드 타입이 잘못되면 금액 계산 및 자료가 모두 표현되지

못합니다.

특별한 경우를 제외하고는 필드 형태를 CHAR를 모두 사용하세요.

검색 키 필드로 사용할 때는 CHAR를 사용하세요.

[ 공통 유닛의 설계 ]

공통 유닛은 따로 만들어 둡니다.

여기에는 반복된 사용자 정의 함수나 공통으로 사용된 함수를

모아두며 모든 유닛의 uses 절에 포함시킵니다.

이렇게 함으로 교차 참조 문제를 해결합니다.

보기를 들면

unit1.pas unit2.pas unit3.pas..project.dpr의

내용에 공통적으로 포함시킴.

implementation

{$R *.DFM}

Uses myunit;

식으로 모두 포함시킵니다.IDE에서 포함시키지 말고 직접 타이핑

하세요. 그럼 이제 공통 유닛의 깊은 곳을 들여다 볼까요?

공통유닛의 제일 앞부분으로 와야 될 것이 뭘까요?

바로 전역 또는 광역 변수의 처리입니다.

지역 변수인 경우에는 바로 유닛 내에서 사용하고 해제해버리면

그만이죠.

전역변수에 사용되는 것은 주로 날짜, 사용자 레코드 타입의

자료형태 정의 부분이 사용되고 특별히 응용프로그램 내에서

판별자로 사용되는 변수의 초기화 부분이 정의 됩니다.

자! 그 담에 와야 되고 구현 되어야 할 함수들의 목록입니다.

가. 입력 받는 콘트롤의 영문입력상태로 변경하는 함수

나. 입력 받는 콘트롤의 한글입력상태로 변경하는 함수

다. 메시지 출력처리.

라. 입력 받는 문자열 사이의 스페이스를 제거하는 함수

마. 입력받는 문자열이 특정 길이를 요구 받을 때

입력받는 문자열 다음을 스페이스로 채우는 함수

바. 주민등록 번호를 체크하는 함수

사. 사업자등록번호를 체크하는 함수.

아. 신용카드번호를 체크하는 함수

자. 한글을 완성형으로 변환하는 함수

차. 한글을 조합형으로 변환하는 함수

카. 날짜처리함수

타. 날짜를 문자열로 변환하는 함수

파. 특정 컴포넌트를 찾는 함수

하. 입력 받은 값의 반올림이나 절사처리 함수

그리고 여기에 포함되지 않지만

별도로 공통 프린트 모듈을 만들어야 됩니다.

왜냐하면, 간혹 가다가 옛 날 구형 프린터 혹은 도트형 프린터에

인쇄를 해야하는 경우가 생기구요.

은행등 금융기관인 경우엔 각종 전표나 양식에 보정 작업을

해야하고 바코드 프린터 제
Posted by 나비:D
:
CHAPTER 21 OBJECTS

이번장에서 다룰 부분은 객체에 대한 부분 입니다. 요사이
각 프로그래밍 언어들 사이에서 많이 다루어 지고 있는
부분중의 하나 입니다. 이곳에서는 기본적인 사용 방법을
예를 통해서 알아 보기로 합니다.

델파이에서 객체는 서브 루틴을 포함하는 레코드와 거의
유사하게 사용이 됩니다.  어쨋든 객체의 형식은  CLASS
라는 명령으로 선언이 됩니다.

TYPE
POINT = CLASS
X,Y: LONGINT;
END;

SCREENTHING = CLASS
LOCATION : POINT;
COLOR:WORD;
END;

이제 두개의 클래스가 선언이 되었읍니다. 두개의 클래스중
SCREENTHING 은 POINT라는 객체를 포함 하고 있읍니다.
이 객체의 사용은

VAR
APOINT : POINT;
ATHING : SCREENTHING;

과 같이 선언이 되며 각 클래스의 변수에 대한 사용은

APOINT.X := 100;
APOINT.Y := 100;
ATHING.LOCATION .X :=100;
ATHING.COLOR :=20;

또는

WITH APOINT DO
BEGIN
X:=100;
Y:=100;
END;
와 같이 사용을 할 수가 있읍니다. 또한 객체안에는 프로시듀어를
포함 할 수 있읍니다. 위의 클래스중 하나를 변경해 보면

SCREENTHING = CLASS
LOCATION : POINT;
COLOR:WORD;
PROCDURE DRAW;
END;

PROCEDURE SCREENTHING.DRAW;
VAR X: INTEGER;
    C: WORD;
WITH SCREENTHING DO
BEGIN
X := LOCATION.X;
C:=COLOR;
END;

이와 같이 사용을 할 수가 있읍니다.  이번에는 상속에 대해서 알아 보기로
합니다. 위의 POINT를 이용해 보지요.

TYPE
TPOINT=CLASS(POINT)
Z : LONGINT;
END;

이때의 TPOINT 는 POINT클래스를 그대로 상속 받고 있읍니다.
이번에는 생성자와 소멸자에 대해 알아 보지요. 생성자는 말 그대로
선언해 주는 역활을 하고 소멸자는 메모리에서 제거해 주는 역활을
합니다.

TYPE
TPOINT = CLASS
X,Y,Z : LONGINT;
CONSTRUCTOR INIT;
END;

CONSTRUCTOR TPOINT.INIT;
BEGIN
X:=0; Y:=0; Z:=0;
END;

TYPE
TFILE = CLASS
SOURCEFILE : TEXT;
DESTRUCTOR DONE;
END;

DESTRUCTOR TFILE.DONE;
BEGIN
CLOSE(SOURCEFILE);
END;

생성자와 소멸자는 객체를 선언할때나 끝날때 자동적으로 작동을
하게 됩니다.  즉 정의를 해 놓으면 사용자가 다시 관여할 필요가
없읍니다.

이번에는 클래스가 선언 되어 있을때 필요에 따라 객체중의 일부분을
수정하여 사용할 필요가 있을때입니다. 이때 원래의 객체를 고치면
되겠지만 그 객체가 다른 곳에도 사용을 하고 있다면 문제가 있겠지요.
그럼 변경하는 방법에 대해 살펴 봅시다. 위에서 정의한
SCREEN THING 이라는 객체를 이용해 봅시다. 그안에
DRAW란 프로시듀어가 있는데, 필요에 따라 몇가지 추가
변경을 한다고 했을때 새로운 객체를 만듭니다.

TSCREEN = CLASS(SCREENTHING)
Z : LONGINT;
PROCEDURE DRAW;
END;

PROCEDURE TSCREEN.DRAW;
BEGIN
INHERITED DRAW;
   {필요한 사항을 추가 합니다}
END;

위와 같이 됩니다. 즉  INHERITED DRAW 라고 해서 앞서 정의된
SCREENTHING의 DRAW를 불러 오고 필요한 사항을 추가,변경
함으로서 새로운 TSCREEN.DRAW를 사용을 할 수 있읍니다.

객체는 사용자가 필요에 따라 만들 수 있지만 이미 만들어 진것도
있지요. 델파이에서 사용하는  TFORM과 같이 T로 시작하는 것들
대다수가 객체 입니다. 필요에 따라서는 각 객체의 특성들을
사용자가 쉽게 이용할 수 있게 해 놓은 겁니다. 앞서의 객 버튼들의
제목등을 사용했을때 그저 그런게 있구나 하고 사용하지만 실제로는
각 해당 객체가 사용되고 있는 겁니다.

이런 객체의 사용에서 한가지 알아두면 도움이 되는 것은
WITH SENDER AS 문 입니다. 앞서 버튼등을 두번 클릭하면
PROCEDURE TFORM1.ONECLICK(SENDER: TOBJECT); 와 같은
문장을 볼수가 있읍니다. 여기서 SENDER, 보내주는 부분의
사용입니다. 이 사용법은  WITH SENDER AS TBUTTON DO 와
같이 됩니다. TBUTTON은 버튼을 표시 합니다.

앞서 계산기 프로그램을 만든것을 기억하세요. 그 계산기를
만들기 위해서 1 부터 9 까지 9개의 버튼을 클릭하고 그
프로시듀어 들마다 해당 사항을 적어 넣었읍니다.

PROCEDURE TFORM1.ONECLICK(SENDER:TOBJECT);
begin
if complete then entry.text : = '';
entry.text := entry.text +'1';
end;

위의 프로시듀어중 틀린것은 맨 뒤의 '1' 부분을 '9' 까지 9번 적어 준
겁니다. 이것은 SENDER를 사용해서 다음과 같이 변경을 시킬수 있읍니다.

PROCEDURE TFORM1.NUMBERCLICK(SENDER : TOBJECT);
begin
if complete then entry.text :='';
with sender as tbutton do
entry.text := entry.text + caption;
end;

문장이 상당히 간단해 졌지요. 즉 TBUTTON의 SENDER를 이용해서
CAPTION의 문자를 바로 이용해 주는 겁니다.

앞의 계산기 프로그램은 이 책에 대한 강좌를 끝낸후 다시 만들어
보기로 합니다. 이상으로 기본적인 설명은 거의 끝난것 같은데,
간단하게 몇개의 예제 문장을 살펴 봅시다.


UNIT DECKCARD;

INTERFACE

TYPE
SUITS=(CLUBS, DIAMONDS, HEARTS, SPADES);
RANKS=(BACK, ACE, TWO , THREE, FOUR, FIVE, SIX,
SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING);
CARDS = RECORD
SUIT : SUITS;
RANK: RANKS;
END;
TCARDDECK = CLASS
DEALT : BYTE;
DECK : ARRAY[1..52] OF CARDS;
  CONSTRUCTOR CREAT;
  FUNCTION CARDNAME(R:RANKS; S:SUITS): STRING;
  FUNCTION DEAL: CARDS;
  FUNCTION RANKOFLASTDEALT(DEPTH:BYTE): RANK;
  PROCEDURE SHUFFLE;
  FUNCTION SUITOF LASTDEALT(DEPTH:BYTE):SUITS;
END;

IMPLEMENTATION

CONSTRUCTOR TCARDDECK.CREATE;
VAR I: INTEGER;
RANK:RANKS;
SUIT:SUITS;
BEGIN
INHERITED CREATE;;
I:=1;
FOR SUIT :=CLUBS TO SPADES DO
FOR RANK:=ACE TO KING DO
BEGIN
DECK[I].SUIT:=SUIT;
DECK[I].RANK:=RANK;
INC(I);
END;
END;

FUNCTION TCARDDECK.CARDNAME(R:RANKS; S:SUITS): STRING;
VAR Q,K: STRING;
BEGIN
CASE R OF
ACE : Q:='ACE';
........
KING:Q:='KING';
END;
CASE S OF
SPADES :K:='SPADES';
......
CLUBS : K:='CLUBS';
END;
CARDNAME := Q+ ' OF ' + K;
END;

.........

FUNCTION TCARDDECK.SUITOFLASTDEALT(DEPTH:BYTE): SUITS;
BEGIN
SUITOFLASTDEALT:=DECK[DEALT-DEPTH].SUIT;
END;

BEGIN
RANDOMIZE;
END.


마지막으로 객체의 접근 상태, 즉 PROTECTED 부분을 살펴 보고 마칩니다.
일반적으로 아무런 선언이 없으면 PRIVATE 상태로 데이타의 접근이 가능
합니다. 하지만 프로그램상의 보안등의 이유로 필요시에는 다른 사람의
접근을 막을 필요가 있읍니다. 그럴 경우 PROTECTED 라고 선언을
하면 됩니다. 아래 에제를 비교해 보고 이번 강좌를 마치기로 합니다.

UNIT PROTECT;

INTERFACE

TYPE
T1 = CLASS
PRIVATE
AFIELD: INTEGER;
END;

T2 = CLASS
PROCEDURE DO1(A0: T1);
END;

IMPLEMENTATION

FUNCTION  ZERO(A0:T1) : BOOLEAN;
BEGIN
ZERO:=A0.AFIELD =0 {사용가능}
END;

PROCEDURE  T2.DO1(A0:T1);
BEGIN
A0.AFIELD :=42;   {사용 가능}
END;

END.

이번에는 PROTECTED 로 변경해 봅니다.

UNIT PROTECT;

INTERFACE

TYPE
T1 = CLASS
PROTECTED
AFIELD: INTEGER;
END;

T2 = CLASS
PROCEDURE DO1(A0: T1);
END;

IMPLEMENTATION

FUNCTION  ZERO(A0:T1) : BOOLEAN;
BEGIN
ZERO:=A0.AFIELD =0 {컴파일이 안됨}
END;

PROCEDURE  T2.DO1(A0:T1);
BEGIN
A0.AFIELD :=42;   {사용 가능}
END;

END.

이 처럼 클래스의 계승에서는 사용이 가능 하나 그외의 펑션이나
프로시듀어등 다른 곳에서는 사용이 불 가능 합니다.

이제 '예제로 배우는 델파이'의 책과 한 강좌는 거의 끝났읍니다.
다음 강좌는 앞서 배운것을 정리하는 식으로 하나의 예제를 소개
하는 것으로 끝내려 합니다. 아니 이 책이 그렇게 되어 있군요.
어쨋든 제대로 설명도 못하고 이 책을 마무리 질래니 좀
찜찜은 하지만 할 수 없지요. 앞서 이야기 한 대로 이 책에 대한
강좌가 끝나고 나면 어떻게 할 까 생각 중이예요. 아직 다른
자료들을 구하지 못해서, 우선적으로 델파이에 포함된 예제나
앞서 잠시 짚고 넘어갔던 계산기및 달력, 시계등을 한 번 만들어
볼까 하기도 하고... 어쨋든 가능하면 분석하거나 만들어 나가면서
이곳에 올려 놓도록 해 보지요.  아! 마지막 장은 내일 중에 마저
정리해서 올리도록 하지요. 그동안 조금이라도 도움이 되었기를
바라며.....

Posted by 나비:D
:
델마당 팁란에서 타락천사님의 글을 퍼온 검미다.

[팁] 코딩 표준 문서

안녕하세여..타락임다..^^

이것 역시 기초적인 겁니다. 전 다덜 저같이 하고 있을 거라고 생각했었는데......ㅠㅠ

I. 루틴

1. 루틴명..
루틴 이름을 통해 그 루틴의 기능이나 용도를 알수 있어야 합니다. 다음과 같이 기능에 해당하는 동사를 먼저 쓰고, 목적어를 뒤에 씁니다.
procedure FormatHardDrive;

입력 인자의 값을 설정하는 투틴은 다음과 같이 Set으로 시작해야 함다.
procedure SetUserName;

어떤 값을 가져오는 루틴은 Get으로 시작함다.
function GetUserName: string;

1. 루틴의 파라미터

같은 데이터형의 정규 인자들은 가능한 하나의 문구로 결합함다
procedure SetInfomation(Param1, Param2, Param3 : integer; Param4 : string);

정규인자들에는 기능과 용도에 맞는 이름을 붙이며, 일반적으로 루틴에 넘겨주는 식별자의 이름에 기초해서 이름을 만듬다. 일반적으로 클래스의 속성이나 필드의 이름과 같아서 생기는 혼동을 피하기 위해 A로 시작함다.
procedure SomeProc(AUserName: string; AUserAge : integer);

정규인자 순서는, 프로그램의 수행을 최적화 하는게 목적이다.
가장 자주 호출되는 인자들은 첫번째에 와야 하며, 가장 자주 쓰이지 않는 순으로 오른쪽으로 배치한다.
입력 인자들은 출력 인자들의 왼쪽에 와야 함다.
가장 일반적인 인자를 왼쪽에 놓고, 가장 구체적인 인자를 오른쪽에 놓슴다.
procedure SomeProc(APlanet, AContinet, ACountry, AState, ACitry: string);
단!! TObject 형의 Sender라는 인자가 첫번째인 이벤트 처리 루틴 같은 경우에는 위의 규칙에서 제외한다.

인자가 레코드나 배열, string 형이며, 루틴안에서 그 값이 변하지 않으면, const 지시자를 사용해서 상수 인자로 지정해야 함다. 그러면 컴파일러가 최적화 할수 있슴다.
다른 형의 인자들 이라도, 루틴 안에서 값이 변하지 않는 것이라면 const 지시자를 써주는게 좋슴다. 효율적으로 이득이 없지만, 코드를 읽고 이해하는데 도움이 됨다.

II. 변수
1. 대, 소문자 규칙
델파이 변수형의 경우엔 소문자로만 씀다. Win32 API 변수형들은 모두 대문자로만 쓰는 것이 일반적임다. 그 외의 형들은 첫 글짜를 대문자로 하고, 대, 소문자를 적절히 섞는다.
var
strBuf : string; // 델파이 변수
WindowHandle : HWND; // Win32 API 형

2. 실수형
Double 형은 CPU와 버스에 최적화된 형이며, IEEE가 정의한 표준 데이터형이여서, Win32에선 Double 형에 최적화 된다.
Real 형은 이전 버젼의 델파이 코드와 호환성이 필요할 때만 쓰는게 좋다.

2. 열거형
다른 모든 형들과 같이 열거형 이름도 T로 시작해야 함다. 식별자 이름에는 열거형 이름에서 따온 두세 글자를 소문자로 앞에 붙임다.
TSongType = (stRock, stClassic, stCountry);

3. 배열형
다른 모든 형들과 같이 배열형 이름도 T로 시작해야 함다. 배열형을 가르키는 포인터를 설정할 경우, 그 포인터의 이름을 P로 시작해야 하며, 배열형 선언의 바로 위에서 선언해야 함다.
type
PCycleArray = ^TCycleArray;
TCycleArray = arrary [1..100] of integer;

4. 레코드형
다른 모든 형들과 같이 레코드형 이름도 T로 시작해야 함다. 레코드형을 가르키는 포인터를 설정할 경우, 그 포인터의 이름을 P로 시작해야 하며, 레코드형 선언의 바로 위에서 선언해야 함다. 레코드의 각 필드의 데이터형은 열을 맞춰 주는게 좋슴다.
type
PEmployee = ^TEmployee;
TEmployee = record
EmployeeName : string;
EmployeeRate : Double;
end;

III. 클래스
1. 클래스명
다른 모든 형들과 같이 클래스형 이름도 T로 시작해야 함다.
type
TCustome : class(TObject);

2. 인스턴스명
클래스의 인스턴스 이름은 일반적으로 클래스형 이름에서 T를 뺀것을 사용함다.
var
Custome : TCustome;

3. 속성명
속성은 클래스의 private 필드를 조작하기 위한 것이며, 필드 이름에서 F를 뺀것을 이름으로 씀다.
속성 이름은 명사로 해야 함다. (속성은 데이터를 뜻하며, 메소드는 동작을 뜻함다.)
배열 속성 이름은 복수로 함다. 일반 속성은 단수로 함다.
TCustome : class(TObject);
private
FUserName : string;
FUsers : TStringList;
protected
function GetUserName : string;
procedure SetUserName(AName : string);
function GetUsers: TStringList;
procedure SetUsers(AUsers : TStringList);
public
property UserName: string read GetUserName write SetUserName;
property Users: TStringList read GetUsers write SetUsers;

end;

(ps) write 조작 메소드는 최소한으로 작은 코드로 만드는 것이 좋다.

IV. 파일
1. 폼파일
폼 파일은 폼의 용도를 나타내는 단어 뒤에 Frm을 붙인 이름을 사용함다. 예를 들어 About 폼의 파일 이름은 AboutFrm.pas, 메인폼의 파일 이름은 MainFrm.pas 이 됨다.

2. 데이터모듈
데이터 모듈 파일은 데이터 모듈의 용도를 나타내는 단어 뒤에 DM을 붙인 이름을 사용함다. 예를 들어, 고객 데이터 모듈 파일의 이름은 CustomersDM.pas 로 함다.

V. 컴포넌트
모든 컴포넌트는 자신의 목적에 맞는 이름을 가져야 함다. 델파이가 지정한 기본 이름(예를 들면, Edit1)을 그대로 사용해서는 안됨다. 컴포넌트 이름에는 자신의 형을 뜻하는 소문자 접두어를 붙임다. 그 이유는 Object Inspector나 Code Explorer에서 알파뱃 순서로 나열된 컴포넌트를 찾기 쉽게 하기 위해서 이다.

다음이 델파이 5 의 표준 컴포넌트의 이름으로 사용하는 접두어이다.


Standard 탭

fms Frames
mm TMainMenu
pm TPopupMenu
mmi TMainMenuItem
pmi TPopupMenuItem
lbl TLabel
edt TEdit
mem TMemo
btn TButton
cb TCheckBox
rb TRadioButton
lb TListBox
cb TComboBox
scb TScrollBar
gb TGroupBox
rg TRadioGroup
pnl TPanel
al TActionList


Additional 탭

bbtn TbitBtn
sb TSpeedButton
me TMaskEdit
sg TStringGrid
dg TDrawGrid
img TImage
shp TShape
bvl TBevel
sbx TScrollBox
clb TCheckListbox
spl TSplitter
stx TStaticText
cb TControlBar
aet TApplicationEvent
cht TChart


Win32 탭
tbc TTabControl
pgc TPageControl
il TImageList
re TRichEdit
tbr TTrackBar
prb TProgressBar
ud TUpDown
hk THotKey
ani TAnimate
dtp TDateTimePicker
tv TTreeView
lv TListView
hdr THeaderControl
stb TStatusBar
tlb TToolBar
clb TCoolBar
psr TpageScroller



System 탭
tm TTimer
pb TPaintBox
mp TMediaPlayer
olec TOleContainer
ddcc TDDEClientConv
ddci TDDEClientItem
ddsc TDDEServerConv
ddsi TDDEServerItem



Internet Express 탭
xlb TXMLBroker
mppd TMidasPageProducer


Fastnet 탭
nmdt TNMDayTime
nec TNMEcho
nf TNMFinger
nftp TNMFtp
nhttp TNMHttp
nMsg TNMMsg
nmsg TNMMSGServ
nntp TNMNNTP
npop TNMPop3
nuup TNMUUProcessor
smtp TNMSMTP
nst TNMStrm
nsts TNMStrmServ
ntm TNMTime
nudp TNMUdp
psk TPowerSock
ngs TNMGeneralServer
html THtml
url TNMUrl
sml TsimpleMail

Internet 탭

csk TClientSocket
ssk TServerSocket
wbd TWebDispatcher
pp TPageProducer
tp TQueryTableProducer
dstp TDataSetTableProducer
dspp TDataSetPageProducer
wbs TWebBrowser

Data Access 탭

ds TDataSource
tbl TTable
qry TQuery
sp TStoredProc
db TDataBase
ssn TSession
bm TBatchMove
usql TUpdateSQL
ntdt TNestedTable


Data Controls 탭

dbg TDBGrid
dbn TDBNavigator
dbt TDBText
dbe TDBEdit
dbm TDBMemo
dbi TDBImage
dblb TDBListBox
dbcb TDBComboBox
dbch TDBCheckBox

Decision Cube 탭

dcb TDecisionCube
dcq TDecisionQuery
dcs TDecisionSource
dcp TDecisionPivot
dcg TDecisionGrid
dcgr TDecisionGraph


QReport 탭
qr TQuickReport
qrsd TQRSubDetail
qrb TQRBand
qrcb TQRChildBand
qrg TQRGroup
qrl TQRLabel
qrt TQRText
qre TQRExpr
qrs TQRSysData
qrm TQRMemo
qrrt TQRRichText
qrdr TQRDBRichText
qrsh TQRShape
qri TQRImage
qrdi TQRDBMImage
qrcr TQRCompositeReport
qrp TQRPreview
qrtf TQRTextFilter
qrcf TQRCSVFilter
qrhf TQRHTMLFilter
qrch TQRChart


Dialogs 탭

대화상자 컴포넌트들은 실제 폼을 컴포넌트 형태로 만든 것이다. 따라서, 대화상자 컴포넌트들은 폼의 명명 규칙과 비슷한 규칙을 따른다. 컴포넌트형의 이름은 이미 정의되어 있으며, 인스턴스 이름은 그냥 ‘;’을 뺀 것, 즉 델파이가 붙인 기본 이름 끝의 숫자를 뺀 것을 사용하면 된다. 다음의 예를 참고하기 바란다.

TOpenDialog OpenDialog
TSaveDialog SaveDialog
TOpenPictureDialog OpenPictureDialog
TSavePictureDialog SavePictureDialog
TFontDialog FontDialog
TColorDialog ColorDialog
TPrintDialog PrintDialog
TPrintSetupDialog PrinterSetupDialog
TFindDialog FindDialog
TReplaceDialog ReplaceDialog


Win3.1 탭

dbll TDBLookupList
dblc TDBLookupCombo
ts TTabSet
ol TOutline
tnb TTabbedNoteBook
nb TNoteBook
hdr THeader
flb TFileListBox
dlb TDirectoryListBox
dcb TDriveComboBox
fcb TfilterComboBox

Samples 탭

gg TGauge
cg TColorGrid
spb TSpinButton
spe TSpinEdit
dol TDirectoryOutline
cal TCalendar
ibea TIBEventAlerter

ActiveX 탭

cfx TChartFX
vsp TVSSpell
f1b TF1Book
vtc TVTChart
grp Tgraph


Midas 탭

cds TClientDataSet
dcom TDCOMConnection
sck TSocketConnection
dspv TDataSetProvider
sobk TSimpleObjectBroker
wctn TWebConnection
cctn TcorbaConnection

ADO 탭

adcn TADOConnection
adcm TADOCommand
adds TADODataSet
adtb TADOTable
adqr TADOQuery
adst TADOStoredproc
rdcn TRDSConnection

Interbase 탭

ibds TIBDataSource
ibtb TIBTable
ibqr TIBQuery
ibsp TIBStoredProc
ibdb TIBDatabase
ibts TIBTransaction
ibus TIBUpdateSQL
ibdst TIBDataSet
ibsl TIBSQL
ibsbi TIBDatabaseInfo
ibsmt TIBSqlMonitor
ibets TIBEvents

안녕하세여..타락임다...^^

UI와 프로그램의 전반적인 외양을 설계하는 것이 중요합니다.

그러나 개발환경에선 애플리케이션의 실제 구현 코드, 즉 백 엔드(back-end)를 작성하는게 더 많은 시간을 잡아먹곤 합니다.

물론 직관적이고 비주얼한 UI는 프로그램에 있어서 가장 중요한 부분이긴 하지만, 만약 통신 프로그램에서 데이터를 보내는 부분이 없다면 어떻게 할겁니까?

"기본이 되어야 하느니라!"는 사람에게 뿐만 아니라, 어플리케이션에도 적용되는 말입니다.

명명법이라는 규약은 없지만, 오랜 프로그램 개발기간에 걸쳐, 효율적이고 이해하기 쉬고, 개발기간을 줄여주는 명명법들이 개발되어 왔습니다. 윈도우 어플이 점점 커짐에 따라 여러사람이 공동 작업 함에 따라 공통의 명명법의 더욱 더 중요합니다..

제가 쓰는 명명법을 설명할께여..^^

변수 선언을 할때 변수타입을 변수 앞에 붙입니다.. 그러면 코드익스플로 나

Ctrl-J 치면 나오는 창에서 찾기 편합니다.

string 타입 : strBuf, strTemp, strName, strPath 등등..

boolean 타입 : bRun, bDebug, bSet etc

정수 타입 : nAge, nNumber, nTemp etc

array 타입 : szBuf, szTemp, szName etc ( array [0..100] of char 등으로 설정한거 )

Char 타입 : cTemp, cBuf etc

Set 타입 : 변수를 복수로 함다.

ex) Week = (Sun, Mon, Tue, Wed, Fri, Sat);
Weeks = set of Week;

데이터 저장용 레코드나 클래스의 변수는 m(Member)를 붙임다.
ex)
Person = record
begin
mHeight : integer;
mWeight : integer;
mAge : integer;
mName : string;
mSex : integer;
end;

Person = class
begin
mHeight : integer;
mWeight : integer;
mAge : integer;
mName : string;
mSex : integer;
end;

포인터 형은 변수 앞에 p를 더 붙입니다...

가령.. pcChar, pnNumber etc


함수명의 경우엔 간단한 영작을 합니다..

동사가 제일 앞이고, 그 다음에 간단한 전치사, 마지막이 명사져..

일단 리턴값이 부울린인 경우엔 Is 로 시작합니다..

예) 루프 안에 있는지 리턴하는 함수.. : function IsLoop: Boolean;
또는 function IsInLoop : Boolean;


예) 루프가 돌고 있는지 리턴하는 함수 : funciton IsRunLoop: Boolean;

기타 함수명은 Get 이나 Set 으로 시작하져..

예) function GetSum: integer;
function SetAge(AAge : integer): Boolean <-- 처리 되었는가 리턴하는게 좋져..

특별히 VCl 함수 또는 API 함수 와 비슷한 함수를 만들어 쓸때는 식별자를 붙임다..
(헷갈리기 땜시.--;; 저는 OK로 시작함다..)

function OKTrim(ASrc : string) : string;
function OKIntToStr(ANumber, ASize : integer) : string; // 자리수만큼 0을 붙이는 함수
function OKRound(ANumber : integer): integer; // 일반적으로 쓰는 반올림을 하고 시플때..

함수가 많아질때는 함수 이름에 틀별히 신경을 더 쓰져..

GetNameFromRecord(), SetAgeWithName().. etc

좋은 것 같네요.
특히 이벤트 함수와 유저가 만든 함수의 구별이
잘안됩니다. 전 Apl이라는 접두어를 사용합니다.
위의 분은 OK 를 쓰시는 군요.

또 함수가 일정 부분이 모이면 접두어를 사용합니다.

utlGetApplicationName 과 같지요.
요즘 win32api는 접두어를 사용하지요.
reg계열은 레지스트리 관련 펑션이지요.

아마도 os/2의 api를 보시면 비슷하게 돌아갑니다.
뭐 이런 식죠.

WinCreateWindow 등과 같이 3자를 씁니다.

그리고 User Class인경우에는 UClassName과 같이
유저 클래스를 나타내시면 좋습니다.

MFC는 Class 접두어가 CClassName이고 볼랜드는 TClassName
이죠 IBM 프로덕트는 IClassName입니다.

즉 유저가 만드는 모든 클래스, 펑션은 확연하게 구분이
되도록 코딩하시는 것이 자동화된 비쥬얼 툴류에서
사용하시기 좋습니다.
Posted by 나비:D
:

[델파이 폼 기본글꼴 지정]

 

델파이 프로그램 관련 레지스트리[HKEY_CURRENT_USER\Software\Borland\Delphi\7.0\]에

[FormDesign]이란 키값을 추가하여 글꼴 기본값을 지정해준다.

[Form Design]이란 키값과 혼동하면 안됨.

 

ex) [HKEY_CURRENT_USER\Software\Borland\Delphi\7.0\FormDesign],

 "DefaultFont"="굴림,9" => 7.0 버젼의 경우 예   

 


 

Posted by 나비:D
:
 

함수 레퍼런스 정리 1

 

Abs

 

 

문 법

function Abs(X);

 

 

 

X 의 절대값을 구하는 함수이다.
절대값이란 값은 같으며 부호가 양수인 수를 말한다.
X 는 정수 또는 실수값이다.

 

 

예 제

Abs(-3.14); {결과는 3.14}
Abs(3.14); {결과는 3.14}

 

Addr

 

 

문 법

function Addr(X):Pointer;

 

 

 

X 의 번지를 구할 때 쓴 함수이다.
X 는 변수나 함수의 명칭이며 결과는 X의 메모리 번지를 나타내는 포인터 값이며, Pointer형이다. Addr 함수의 리턴값이 Pointer형이므로 Pointer형의 변수에 곧바고 대입될 수 있지만 이 함수의 리턴값으로 메모리를 직접 참조할 수는 없다.
메모리를 참조하기 위해서는 타입 캐스트를 해 주어야 한다.

 

 

예 제

Var i : Interger;
begin
    P := Addr(i); {i의 번지를 구한다.}
end;

 

Append

 

 

문 법

procedure Append(Var f:Text);

 

 

 

파일을 추가 기록용으로 오픈할 때 쓰는 함수이다.
파일 변수 F 는 Assign으로 외부 파일과 연결되어 있어야 한다.
외부 파일이 없으면 에러가 발생하며 이미 열려 있는 경우는 파일을 닫은 후 다시 연다.
파일을 오픈한 후 에디터라인은 파일의 끝(EOF)에 위치시키므로 추가적인 데이터를 파일 끝에 추가할 수가 있다.
다음 예는 루트 디렉토리의 Autoexec.Bat 파일 끝에 Prompt 문을 추가시키는 예제이다.

 

 

예 제

Var F : Textfile;
begin
    AssignFile(F,'c:/autoexec.bat');
    Append(F); {파일 오픈}
    Writeln(F,'Prompt $p$g');
    CloseFile(F); {파일 닫음}
end;

 

AppendStr

 

 

문 법

procedure AppendStr(Var Dest: String; Const S: String);

 

 

 

두 개의 문자열을 결합하는 함수이다.
Dest 문자열 뒷부분에 Src 문자열이 추가되는 것으로, Dest := Dest + S 와 문법적으로 동일한 기능을 수행한다.

 

 

예 제

Src := 'Apple';
Dest := 'Orange';
AppendStr(Dest, Src);

즉, Dest 문자열은 OrrangeApple 이 된다.

 

AssignFile

 

 

문 법

procedure AssignFile(Var f, String);

 

 

 

텍스트 파일 변수와 외부 파일을 연결시키는 함수이다.
파일 핸들에 파일을 할당하는 것으로 일단 파일과 핸들이 연결되면 핸들에 대한 모든 조작은 파일로 입출력이 된다.
이 프로시져로 핸들에 파일을 할당한 후 Reset이나 Rewrite등을 사용하여 파일을 오픈하며, Writeln이나 Readln으로 파일 입출력을 수행한다.
파일 이름은 문자열 형태로 전달하되 필요한 경우 드라이브명과 디렉토리명을 사용할 수 있다. 주의할 것은 이미 열려져 있는 파일핸들을 재할당해서는 안된다는 점이다.
다음 예는 text.txt파일에서 첫 줄을 읽어 에디트 박스로 출력하는 예이다.

 

 

예 제

Var F: TextFile; S: String;
begin
    AssignFile(F, 'text.txt');
    Reset(F);
    Readln(F,S);
    Edit1.Text := S;
    CloseFile(F);
end;

 

 

 

 

 

 

함수 레퍼런스 정리...(C)

 

ChangeFileExt

 

 

문 법

function ChangeFileExt(Const FileName, ExTension:string):string;

 

 

 

첫번째 인수 FileName으로 주어진 파일의 이름 중 파일의 확장자만 두번째 인수 Extension 으로 변경하는 함수이다.
다음 예는 인수로 주어진 파일의 확장자를 무조건 INI파일로 변경하는 예이다.

 

 

예 제

ChangeFileExt(ParamStr(0),'.INI');

 

Chdir

 

 

문 법

procedure chdir(S:string);

 

 

 

인수 S가 지정하는 경로로 현재 디렉토리를 변경하는 함수이다.
만약 S가 드라이브 문자를 포함하고 있을 경우 현재 드라이브도 변경된다.

 

Chr

 

 

문 법

function Chr(X:Byte):Char;

 

 

 

서수값 X가 지정하는 무자를 구하는 함수이다.
아스키 코드값을 X로 전달하면 해당하는 문자를 얻을 수 있는데 Chr(65)는 알파벳 문자로 A를 뜻한다. 이 함수를 사용하면 키보드로 직접 입력할 수 없는 문자를 입력할 수 있는 쓰임새가 많은 함수이다.

 

CloseFile

 

 

문 법

procedure CloseFile(Var F);

 

 

 

파일 핸들과 외부 파일과의 연결을 끊고 파일 핸들을 닫는 함수이다.
파일 변수 F는 Reset, Rewrite, Append 등에 의하여 오픈된 파일 핸들이며 파일 핸들은 사용 후에 반드시 닫아주어야 하는 함수이다.

 

 

예 제

Var F: TextFile; S: String;
begin
    AssignFile(F, 'text.txt');
    Reset(F);
    Readln(F,S);
    Edit1.Text := S;
    CloseFile(F);
// 파일을 반드시 닫아줘야 한다.
end;

 

CompareStr

 

 

문 법

function CompareStr(Const Si, S2: string):Integer;

 

 

 

두개의 문자열 S1 과 S2 를 비교하되 대소문자를 구분하여 비교하는 함수이다.

S1 과 S2 문자열이 같으면 0 값을 리턴한다.
S1 <S2 이면 음수의 값을 리턴하며, S1 >S2 이면 양수를 리턴한다.

문자열끼리의 비교는 문자열을 이루는 각 문자의 문자 코드를 비교하여 수행되며, 현재 설치된 언어 드라이버에는 영향을 받지 않는다.

 

CompareText

 

 

문 법

function CompareText(Const S1, S2 : String):Integer;

 

 

 

두개의 문자열 S1 과 S2를 비교하되 대소문자를 구분하지 않고 비교하는 함수이다.

S1 과 S2 문자열이 같으면 0을 리턴하며 S1 <S2 이면 음수의 값을 리턴한다.
S1 >S2 이면 양수를 리턴한다.

문자열끼리의 비교는 문자열을 이루는 각 문자의 문자 코드를 비교하여 수행된다.
"Apple" 과 "APPLE" 을 CompareText 함수로 비교하면 결과는 0 이다.
두 문자열이 같은 것으로 비교되지만 CompareStr 함수로 비교하면 결과는 두 문자열이 서로 다른 것으로 비교된다.

 

Concat

 

 

문 법

function Concat(S1 [, S2, ... , Sn]:String):String;

 

 

 

두개 이상의 문자열들을 결합하여 새로운 긴 문자열을 만드는 함수이다.
만약 문자열을 연결한 결과가 255문자 이상일 경우 255번째 이후의 문자는 잘려나간다.
이 함수 대신 + 연산자를 사용하여 문자열을 결합해도 결과는 동일하다.
Concat('Korea','China') 의 경우는 'Korea'+'China'는 같은 결과의 예이다.
다음 예는 Edit1에 입력된 문자열과 Edit2에 입력된 문자열을 한해 Edit3에 대입한다.

 

 

예 제

Edit3.Text := ConCat(Edit1.Text, Edit2.Text);

 

Continue

 

 

문 법

procedure Continue;

 

 

 

For, While, Repeat 등의 반복문에서 사용되며 다음 반복 부분으로 흐름을 옮기도록 하는 함수이다.
루프의 남은 뒷부분은 무시되며 루프의 조건 점검부로 점프한다.
만약 반복 루프 외부에서 이 프로시저가 사용되면 에러가 발생한다.
다음 예는 i가 1~100 까지 증가하며 모종의 처리를 하되 i 가 10인 경우만 특별히 처리가 생략되는 예이다.

 

 

예 제

For i := 1 to 100 do
begin
    If i = 10 then continue;
    ...
end;

 

Copy

 

 

문 법

procedure Copy(S:String; Index, Count:Integer):String;

 

 

 

한 문자열의 부분 문자열을 추출해 내는 함수이다.
S 문자열의 Index 위치에서부터 Count 문자분의 부분 문자열이 추출된다.
Index 가 문자열의 전체 길이보다 길 경우 빈 문자열을 리턴하며 Count가 문자열의 남은 부분보다 클 경우 문자열의 끝까지 추출해 낸다.
Dest 문자열이 'Orange'일 경우 Copy(Dest, 2, 3)은 Dest문자열의 두번째 문자에서부터 3문자분의 부분 문자열인 'ran'을 추출해 낸다.

 

 

 

 

 

 

함수 레퍼런스 정리...(D)

 

Date

 

 

문 법

function Date(Date:TDateTime);

 

 

 

시스템의 시계를 참조하여 오늘 날짜를 구하는 함수이다.
날짜는 TDateTime형이므로 곧바로 문자열로 출력할 수 없으며, DateToStr 함수를 사용하여 문자열로 바꾸어 주어야만 한다.
다음 예는 Label1에 오늘 날짜가 출력되는 예제이다.

 

 

예 제

Label1.Caption := DateToStr(Date);

 

DateTimeToFileDate

 

 

문 법

function DateTimeToFileDate(DateTime: TDateTime):Longint;

 

 

 

TDateTime형의 날짜,시간 값을 DOS형식의 날짜,시간형식으로 바꾸는 함수이다.
도스 형식의 날짜는 4바이트의 정수형이며 각 비트에 날짜,시간 요소를 포함하고 있다.
다음 예는 도스형식의 날짜, 시간 형식을 레이블로 출력하는 예제이다.

 

 

예 제

Label1.Caption := IntToStr(DateTimeToFileDate(Now));

 

DateTimeToStr

 

 

문 법

function DateTimeToStr(DateTime: TDateTime):String;

 

 

 

날짜와 시간을 담은 TDateTime형의 변수를 문자열로 바꾸는 함수이다.
만약 DateTime 인수가 날짜를 포함하지 않으면 날짜는 00/00/00 이 되며, 시간을 포함하지 않으면 00:00:00 AM이 된다.
다음 예는 현재 시간과 날짜를 레이블로 출력하는 예이다.

 

 

예 제

Label1.Caption := DateTimeToStr(Now);

 

DateToStr

 

 

문 법

function DateToStr(Date: TDateTime):String;

 

 

 

날짜를 담는 TDateTime형의 변수에서 날짜를 문자열로 바꾸는 함수이다.
다음 예는 오늘 날짜를 레이블로 출력하는 예이다.

 

 

예 제

Label1.Caption := DateToStr(Date);

 

DayOfWeek

 

 

문 법

function DayOfWeek(Date: TDateTime):Integer;

 

 

 

특정 날짜의 요일을 계산하는 함수이다. 리턴되는 값은 1~7까지의 정수이며, 1이 일요일, 7일 토요일이다. 리턴되는 값이 정수형이므로 월, 화, 수 , 목, 금, 토, 일 로 실제요일 이름으로 바꾸어 주어야 한다.
다음예는 요일이름을 레이블로 출력한다.
오늘이 무슨 요일인지 조사해서 요일 이름을 레이블로 출력하는 예이다.

 

 

예 제

Var
  Yo : String;
  ONUL: TDateTime;
begin
    ONUL := Now;
    Case DayOfWeek(ONUL) of
        1 : Yo := '일';
        2 : Yo := '월';
        3 : Yo := '화';
        4 : Yo := '수';
        5 : Yo := '목';
        6 : Yo := '금';
        7 : Yo := '토';
      end;
    Label1.Caption := '오늘은 ' + YO + '요일입니다.';
end;

 

DecodeDate

 

 

문 법

procedure DecodeDate(Date : TDateTime; Var Year, Month, Day: Word);

 

 

 

날짜를 담는 TDatetime형의 변수에서 년,월,일의 값을 분리시키는 함수이다.
분리된 값들은 각각 Year, Month, Day 등의 정수형 변수에 대입된다.
날짜값은 DateToStr 함수로, 문자열로 바꾼 후 한꺼번에 출력할 수 있지만 개별적인 요소를 가공할 후 한꺼번에 출력할 수 있지만, 개별적인 요소를 가공한 후 출력하고자 할 경우는 이 함수를 사용한다. 이 함수의 반대 함수는 EncodeDate 함수이다.
다음예는 오늘 날ㅉ와 현재 시간을 조사한 후 문자열 조립을 통해 말로 시간과 날짜를 알려준다.

 

 

예 제

Var
  Present: TDateTime;
  Year, Month, Day, Hour, Min, Sec, MSec: Word;
begin
    Present := Now;
    DecodeDate(Present, Year, Month, Day);
    Label1.Caption := '오늘은'+IntToStr(Year)+'년'+IntToStr(Month)+'월'
            +IntToStr(Day)+'일입니다.';
    DecodeTime(Present, Hour, Min, Sec, MSec);
    Label2.Caption := '지금은'+IntToStr(Hour)+'시'+IntToStr(Min)+'분'
            +IntToStr(Sec)+'초입니다.';
end;

 

DecodeTime

 

 

문 법

fun;

 

 

 

시간을 담는 TDateTime형의 변수에서 시, 분, 초의 값을 분리시키는 함수이다.
분리된 값들은 각각 Hour, Min, Sec, MSec 등의 정수형변수에 대입된다.
시간값은 TimeToStr 함수로 문자열로 바꾼후 한꺼번에 출력할 수 있지만 개별적인 요소를 가공한 후 출력하고자 할 경우는 이 함수를 사용한다.
이 함수의 반대 함수는 EncodeTime 함수이다.
DecodeTime 함수의 예제를 참조하기 바란다.

 

Delete

 

 

문 법

procedure Delete(var S:String; Index, Count: Integer);

 

 

 

한 문자열에서 부분 문자열을 삭제하는 함수이다.
S 문자열의 Index위치에서부터 Count 문자분의 부분 문자열이 삭제된다.
Index 가 문자열의 전체 길이보다 길 경우 삭제는 이루어지지 않으며, Count가 문자열의 남은 부분보다 클 경우 문자열이 끝까지 삭제된다.
Dest 문자열이 'Orange'일 경우 Delete(Dest, 2, 3)은 Dest 문자열의 두번째 문자에서부터 3분자분의 부분 문자열인 'ran'을 삭제하며 Dest 문자열은 'Oge'가 된다.

 

DeleteFile

 

 

문 법

function DeleteFile(const FileName: String): Boolean;

 

 

 

디스크 상의 파일을 지우는 함수이다.
파일이 없거나 읽기 전용 속성을 가질 경우 False를 리턴하며 파일은 지워지지 않는다.
그러나 파일을 지울 수 없는 경우라도 예외는 발 생하지 않는다.
파일은 경로를 포함할 수 있으며, 다음 예는 C 드라이브의 루트에 있는 Command.com 파일을 지우는 예이다.
물론, 이 명령을 실행한 후부터 부팅이 되지 않으니 다른 파일로 실험하세요.

 

 

예 제

DeleteFile('C:/Command.Com');

 

DirectoryExists

 

 

문 법

function DirectoryExists(Name: string): Boolean;

 

 

 

인수로 전달된 디렉토리가 존재하는지 검사하며 존재할 경우 True값을 리턴하고 존재하지 않을 경우 False값을 리턴한다.

 

 

 

 

 

 

함수 레퍼런스 정리...(E)

 

EncodeDate

 

 

문 법

function EncodeDate(Year, Month, Day: Word): TDateTime;

 

 

 

정수형으로 주어진 년, 월, 일의 값을 사용하여 날짜를 담은 TDateTime 형의 변수 하나를 만들어 주는 함수이다.
Year 는 1~9999까지의 값을 가지며 Month는 1~12, Day는 1~31까지 가능하다.
단, Day값의 범위는 Month 값의 영향을 받으며 Year는 윤년인 경우의 영향도 받는다.
만약 날짜값이 무효일 경우, 예를 들어 2월30일 등의 값이 주어지면 EConvertError예외가 발생하다.
년,월,일을 개별적으로 입력받아 하나의 날짜값을 만들고자 할 때 이 함수를 사용한다.
이 함수의 반대는 DecodeDate 이다.

 

EncodeTime

 

 

문 법

function EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime;

 

 

 

정수형으로 주어진 시, 분, 초의 값을 사용하여 시간을 담은 TDatetime형의 변수 하나를 만든다.
Hour 는 0~12까지 가능하며, 만약 Time24Hour가 True일 경우 0~23까지의 24시간을 표현할 수 있다.
Min, Sec은 0~59까지 가능하며 MSec은 0~999까지 가능하다.
시간값이 무효일 경우, 예를 들어 8시 86분 등의 값이 주어지면 EConvertError 예외가 발생한다.
시,분,초를 개별적으로 입력받아 하나의 시간값을 만들고자 할 때 이 함수를 사용한다.
이 함수의 반대는 DecodeTime 이다.

 

Eof

 

 

문 법

function Eof[(Var F: Text)]: Boolean;

 

 

 

입력한 값들에 대한 끝인가를 점검하는 함수로서 Eof는 End Of File을 의미한다.
DB 작업을 할때, While문을 많이 쓰게 되는데 이경우 필드의 끝이 아닐때까지 계속 루프를 돌리는 작업때 많이 쓰이게 된다.

 

ExpandFileName

 

 

문 법

function ExpandFileName(const FileName: string): String;

 

 

 

파일 이름에 드라이브명과 디렉토리명을 붙여 완전 경로(Full Path)를 만들어내는 함수이다. 덧붙여지는 경로는 현재 드라이브와 현재 디렉토리이다.

 

ExtractFileExt

 

 

문 법

function ExtractFileExt(const FileName: string): string;

 

 

 

완전 경로에서 파일의 확장자만 분리시키는 함수이다.
특정 파일의 확장자를 알고자 할 때 이 함수를 사용하여 확장자만 분리한 후 문자열 비교를 수행하면 된다.

 

ExtractFileName

 

 

문 법

function ExtractFileName(const FileName: String): String;

 

 

 

완전 경로에서 파일 이름만 분리해 내는 함수이다.
파일의 확장자도 같이 분리된다.
즉, 완전 경로에서 드라이브명과 디렉토리명이 제외된다.

 

ExtractFilePath

 

 

문 법

function ExtractFilePath(const FileName: String): String;

 

 

 

완전 경로에서 파일 이름을 제외하고 드라이브명과 디렉토리명만 분리해 내는 함수이다.
다음 예는 완전 경로를 가진 FileName 으로부터 경로만 분리해낸 후 파일이 있는 디렉토리로 이동한다.

 

 

예 제

Chdir(ExtractFilePath(FileName));

 

 

 

 

 

 

함수 레퍼런스 정리...(F)

 

FileExists

 

 

문 법

function FileExists(const FileName: String): Boolean;

 

 

 

파일이 디스크상에 존재하는지를 조사하는 함수로서, 파일이 없을 경우 False를 리턴한다. 존재하지 않는 파일을 사용하고자 할 경우 예외가 발생하므로 먼저 이 함수를 사용하여 파일이 있는지를 먼저 확인해 보아야 한다.
다음 예는 파일의 존재 여부를 점검해 본 후 파일을 삭제하는 예이다.

 

 

예 제

If FileExists(FileName) Then DeleteFile(FileName);

 

FileOpen

 

 

문 법

function FileOpen(const FileName: String; Mode: Word): Integer;

 

 

 

델파이가 사용하는 내부적인 함수로서 사용자가 직접 사용하는 경우는 드문 함수이다. 파일을 오픈할 때는 델파이가 제공하는 Reset, Rewrite, Append등의 프로시저를 사용한다.

 

FileSearch

 

 

문 법

function FileSearch(const Name, DirList: String): String;

 

 

 

DirList에 주어진 디렉토리의 경로에 Name파일이 있는지를 조사해주는 함수로서, DirList는 도스의 Path문에서와 같이 여러개의 디렉토리명을 세미콜론으로 끊어 기입한다. 파일을 찾을 경우 파일의 완전경로를 리턴하며 파일을 찾지 못할 경우 널스트리을 리턴한다.

 

FindClose

 

 

문 법

procedure FindClose(var SearchRec: TSearchRec);

 

 

 

FindFirst, FindNext 함수를 사용한 파일검색을 종료하는 함수로서, 굳이 파일 검색 작업을 종료해 주어야 할 필요는 없으며, 실제로 16비트 버젼의 윈도우에서 이 함수는 아무런 일도 하지 않지만, 32비트 버젼의 윈도우에서는 반드시 검색 종료를 해 주어야 하므로 호환성을 위해 검색 후 종료해 주는 것이 좋다.

 

FindFirst

 

 

문 법

function FindFirst(const Path: String; Attr: Word; Var F: TSearchRec): Integer;

 

 

 

주어진 검색조건과 파일의 속성을 사용하여 첫 번째 일치하는 파일을 검색해 내는 함수로서, Path는 검색하고자 하는 디렉토리와 파일의 조건이며 와일드 카드식으로 표현이 된다.
예를 들어 'c:/windows/*.exe'는 windows 디렉토리의 확장자가 EXE 인 첫번째 파일을 검색한다. Attr인수는 검색대상이 되는 파일의 속성을 지정하며 아래와 같은 속성 상수를 사용한다.
여러가지 속성을 사용할 경우에는 'Or' 연산자로 속성을 연결하면 된다. 예를 들어 읽기전용이면서 숨은 파일을 검색하고 싶다면(faReadOnly + faHidden)과 같이 Attr인수를 설정하면 되는 것이다.

 

 

 

상 수

의 미

faReadOnly

$01

읽기 전용

faHidden

$02

숨은 파일

faSysFile

$04

시스템 파일

faVolumeID

$08

디스크 볼륨

faDirectory

$10

디렉토리

faArchive

$20

기록 속성

faAnyFile

$3F

모든 속성

 

FindNext

 

 

문 법

function FindNext(var F:TSearchRec): Integer;

 

 

 

FindFirst에 이어 계속 검색을 수행하는 함수이다. FIndFirst가 첫번째 검색한 결과를 저장한 F를 다시 인수로 넘겨주면 계속해서 일치하는 조건을 가진 파일을 검색해 내며, 검색한 결과는 역시 F로 저장된다.
검색이 계속 이루어지고 있다면 0을 기턴하며 검색중 에러가 발생했거나 더 이상 조건이 일치하는 파일이 없으면 음수의 에러코드를 리턴한다.
FindFirst와 FindNext는 조건에 맞는 모든 파일을 검색해 낼 때 사용한다.

 

Format

 

 

문 법

function Format(const Format: String; const Args: Array of const): String;

 

 

 

서식 문자열과 뒤따라오는 변수에 의해 문자열을 포맷하는 함수이다. 계산식이나 회계분야에서는 가끔씩 써먹는 함수로서, 이러한 포맷도 지원하는구나하는 정도로 가볍게 받아두고 필요시 다시 살펴보는 방법이 가장 좋은 방법인것 같다.

C의 pintf함수와 사용방법이 유사하며 문자열 내부에 변수값을 삽입할 수 있는 아주 편리한 방법을 제공한다.
서식 문자열에는 일반 문자열과 서식이 삽입되며 일반 문자열은 그대로 출력되지만 서식은 대응되는 인수값으로 채워진다.

서식은 % 기호와 변수의 타입으로 이루어지며 % 와 타입 사이에 인덱스, 좌측 정렬 지정, 폭, 정밀도 지정이 삽입된다.

%[인덱스:][-][폭][.정밀도]타입 일단 Format함수를 사용하는 예를 들어보자...

Var A : Integer; S,
    St : String;
Begin
    A := 29;
    B := 'Lyon, Kim';
    St := Format('My age is %d, My Name is %s', [A,S]);
End;

서식 문자열에 포함된 %d 자리에는 정수형 변수인 A의 값인 29 가 삽입되며, %s 의 자리에는 문자열 변수인 S의 값 Lyon, Kim 이 삽입되는 방식이다.
그럼, 당연히 St 의 문자열은 My age is 29, My Name is Lyon, Kim 이 되는 것이다.

서식 문자열 내의 서식은 인수 리스트의 변수들과 순서대로 대응되며 서식의 개수와 인수의 개수가 일치해야 할뿐만 아니라 대응되는 서식과 변수의 타입도 일치해야만 한다.

만약 개수나 타입이 일치하지 않을 경우 컴파일은 가능하지만 실행중에 에러가 발생하게 된다. 폭 지정이란 변수값이 문자열 내부에서 차지하는 자리수를 지정하며 생략시는 변수값의 길이만큼만 자리를 차지한다. 강제로 자리를 늘리고자 할 경우 서식과 타입사이에 폭을 정수로 지정한다. 예를 들어 %5d 라고 하면 이 서식에 대입되는 정수가 5자리가 안되더라도 5자리를 강제로 차지한다.

단, 여기서 지정하는 폭 지정은 최소한의 폭을 의미할 뿐이며 폭값이 실제값보다도 작더라고 강제로 폭에 맞추지는 않는다. 예를 들어 I가 12345라는 다섯자리 값을 가지는데 %2d와 대응될 경우 폭지정 2를 지키기 위해 45만 출력하지 않으며 이경우는 폭 지정이 무시된다. 즉, I의 12만이 대응된다고 볼 수 있다.

정밀도 지정이란 실수에 사용되며 소수점 이하 몇 자리까지를 문자열로 바꿀 것인가를 지정한다. %10.5f 서식은 10자리를 차지하며 소수점 이하 5자리까지 문자열로 출력한다. 좌측 정력 지정은 폭이 변수값보다 길 경우 공백을 우측에 배치하도록 하며 폭 지정 앞에 '-' 기호를 붙여 표현한다.
%5d 에 대응되는 정수값이 만약 12일 경우 출력은 'bbb12' 가 되지만, 서식을 %-5d 로 변경하면 '12bbb'가 된다. 여기서 b 표시는 공백을 의미한다.

인덱스 지정자는 인수 리스트의 몇 번째 인수를 사용할 것인가를 지정하며 정수 하나와 ':' 을 사용한다. 인덱스 지정자가 없으면 인수 리스트에 나타나는 순서대로 서식과 대응되지만 인덱스를 밝힘으로써 중복되는 인수 리스트를 재사용할 수 있다.

예를 들어 '%d%d%d,1,2,3'은 앞쪽 서식부터 순서대로 정수 1,2,3로 대응되지만 '%d%d%0:d'는 앞쪽 둘은 순서대로 1,2에 대응되고 세번째 서식은 인덱스 지정에 의해 첫 번째 인수 1에 대응된다.

타입 문자는 아래와 같으며 대문자와 소문자를 구분하지는 않는다.

 

 

 

문 자

의 미

d

정수값 하나에 대응된다.
대응되는 변수는 반드시 정수이어야 한다.

e

실수값을 공학적 표기법, 즉 부동 소수점 형식으로 변환된다.

f

실수값을 부동 소수점 형식으로 변환한다.

g

실수값과 대응하되 고정 소수점 형식과 부동 소수점 형식 중 길이가 짧은쪽으로 변환한다.

n

실수값에 대응하며, 천단위로 콤마를 삽입해 준다.

p

포인터 값에 대응된다.
출력되는 문자열은 SSSS:0000 형태의 세그먼트, 오프셋 형태를 띄며 이때, 세그먼트, 오프셋은 모두 네 자리의 16진수를 사용한다.

m

실수값에 대응되며, 화폐 형태의 문자열로 변환한다.

s

문자열 변수, 문자 변수에 대응된다.

x

정수에 대응되며, 16진수 형태의 문자열로 변환된다.

 

FormatDateTime

 

 

문 법

function FormatDateTime(const Format: String; DateTime: TDateTime): String;

 

 

 

TDateTime형의 변수에 저장된 시간과 날짜 정보를 특정한 형태의 문자열 포맷으로 변환하는 함수이다.
이 함수는 시스템의 날짜와 시간을 받아 사용하므로 Y2K 문제를 해결해 나갈 수 있는 아주 유용한 함수임을 알았으면 한다.

문자열로 출력되는 형식은 다음과 같은 지정자에 의해 결정되며 각 지정자는 한 칸 이상의 공백으로 구분되어야 한다. 포맷을 지정하는 Format 인수에는 지정자와 일반 문자열들이 올 수 있으며 일반 문자열들은 겹 따옴표로 싸 주어야 한다.
지정자의 대소문자는 구분하지 않는다.

아래는 FormatDateTime함수내에서 사용하는 문자들이다.

 

 

 

지 정 자

의 미

c

전역변수 ShortDateFormat, LongTimeFormat이 지정하는 형식대로 출력되며 지정자가 생략될 경우의 디폴트 지정자이다.

d

날짜값을 출력하되 선행 제로를 생략한다. (1~31)

dd

날짜값을 출력하되 선행 제로를 출력한다. (01~31)

ddd

요일을 생략형으로 출력한다. Sun, Mon, Sat 등과 같이 출력된다.
이 생략형 요일 이름은 ShortDayNames 변수에 의해 지정된다.

dddd

요일이름은 완전한 형식으로 출력한다.
Sunday, Monday 등과 같이 출력된다. 완전한 요일 이름은 LongDayNames변수에 의해 지정된다.

ddddd

ShortDateFormat 전역 변수가 지정하는 형식으로 날짜가 출력된다.

dddddd

LongDateFormat 전역 변수가 지정하는 형식으로 날짜가 출력된다.

m

월을 출력하되 선행 제로를 생략한다. (1~12)

mm

월을 출력하되 선행 제로를 출력한다. (01~12)

mmm

월 이름을 생략형으로 출력한다. Jan, Dec 등과 같이 출력한다.
이 생략형 월 이름은 ShortMonthName 변수에 의해 지정된다.

mmmm

월 이름은 완전한 형식으로 출력한다.
January, December 등과 같이 출력된다.
완전한 월 이름은 LongMonthName 변수에 의해 지정된다.

yy

년도를 두자리 숫자로 출력한다. (00~99)

yyyy

년도를 네자리 숫자로 출력한다. (0000~9999)

h

시간을 출력하되 선행 제로를 생략한다. (1~12)

hh

시간을 출력하되 선행 제로를 출력한다. (01~12)

n

분을 출력하되 선행 제로를 생략한다. (1~59)

nn

분을 출력하되 선행 제로를 출력한다. (01~59)

s

초를 출력하되 선행 제로를 생략한다. (1~59)

ss

초를 출력하되 선행 제로를 출력한다. (01~59)

t

시간값을 ShortTimeFormat 전역 변수가 지정하는 형식으로 출력한다.

tt

시간값을 LongtimeFormat 전역 변수가 지정하는 형식으로 출력한다.

am/pm

오전과 오후를 출력하며 h 나 hh 지정자의 시간을 12간제로 출력한다.
오전이면 am 이 출력되며 오후면 pm 이 출력된다.
대문자 소문자 모두 쓸 수 있으며, 혼합해서 쓸 수도 있다.
출력되는 결과는 이 지정자의 대소문자 구성을 따른다.
즉, Am/Pm 지정자를 쓰면 Am 이나 Pm 이 출력되며,
AM/PM 지정자를 쓰면 AM 이나 PM 이 출력된다.

a/p

오전과 오후를 출력하며 h 나 hh 지정자의 시간을 12시간제로 출력한다.
오전이면 a 가 출력되며 오후면 p 가 출력된다.
대문자 소문자 모두 쓸 수 있으며 혼합해서 쓸 수도 있다.
출력되는 결과는 이 지정자의 대소문자 구성을 따른다.

ampm

12시간제로 시간을 출력하며 오전일 경우 전역 변수 TimeAmString에 저장된 문자열을 출력하며 오후일 경우 TimePmString에 저장된 문자열을 출력한다.

/

DataSeparator 지정자가 지정하는 날짜 구분 기호를 출력한다.

:

TimeSeparator 지정자가 지정하는 시간 구분 기호를 출력한다.

 

 

예 제

FormatDateTime('dddd mmmm d yyyy hh:mm AM/PM', Now);
FirDay December 24 1999 12:25 PM

FormatDateTime(' "지금시간은" ddd mmm d yyyy hh:mm AM/PM', Now);
지금시간은 Fri Dec 24 1999 12:26 PM

 

 

 

 

 


 


 

함수 레퍼런스 정리...(G)

 

GetDir

 

 

문 법

procedure GetDir(D: Byte; Var S: String);

 

 

 

지정한 드라이브의 현재 드렉토리를 조사하는 함수이다.

D로 드라이브의 번호를 지정하면 현재 디렉토리가 문자열 S 에 대입되며, 드라이브 번호 D 는 0 일 경우, 디폴트 드라이브 1일 경우 A, 2일 경우 B등과 같이 지정한다.
이 프로시져는 일체의 에러 체크를 하지 않는다.
만약 드라이브 번호로 주어진 D 가 존재하지 않을 경우 조사되는 디렉토리는 'X:/' 가 된다.

다음 예는 현재 드라이브의 디렉토리를 조사하여 레이블에 출력하는 예이다.

 

 

예 제

Var
    dir: String;
begin
    GetDir(0, dir);
    Label1.Caption := Dir;
end;

 

GetMem

 

 

문 법

procedure GetMem(Var P: Pointer; Size: Word);

 

 

 

동적으로 메모리를 할당하며 할당된 번지를 포인터형의 변수 P 에 대입하는 함수이다. Size 는 동적으로 할당할 메모리의 크기를 바이트 수로 나타내며, 할당된 메모리의 변수는 P^ 로 읽거나 쓸 수 있다.

 

 

 

 

 

 

 

 

 

 

함수 레퍼런스 정리...(H)

 

Halt

 

 

문 법

procedure Halt[ (ExitCode: Word)];

 

 

 

프로그램을 강제로 종료하고 운영체제로 제어권을 넘기는 함수이다.
Exitcode 는 프로그램의 탈출코드이다.

 

High

 

 

문 법

function High(X);

 

 

 

인수로 주어진 X 의 값 중 가장 큰값을 찾는다.
X 가 integer형이라면 결과는 32767이 되며 LongInt형이라면 결과는 2147483647이 된다. 결과값은 인수로 주어진 X와 동일한 형태이다.
다음 예는 열거형 중 가장 큰 값을 찾아내는 예제이다.
레이블로 출력되는 값은 6이다.

 

 

예 제

type
    Day = (sun, mon, tue, wed, thu, fri, sat);
Var
    i : Integer;
begin
    i := integer(High(Day));
    label1.Caption := IntToStr(i);
end;

 

 

 

 

 

 

 

 

 

 

함수 레퍼런스 정리...(I)

 

Inc

 

 

문 법

procedure Inc(Var X[N: Longint];

 

 

 

변수의 값을 1 증가시키는 함수이다. Inc(X)는 X := X + 1 과 동일한 동작을 한다.
두 번째 인수를 사용하면 1 이상의 값을 증가시킬 수도 있다.
Inc(X, 5)는 X := X + 5 와 동일한 동작을 한다.
첫 번재 인수는 서수형의 변수이며 확장 문법이 적용될 경우 PChar형도 가능하다.
N 은 정수형의 상수 또는 변수여야 한다.
Inc 함수는 가장 최적화된 코드를 생성해 내므로 루프 내부에서 사용하기에 적합하다.

 

Include

 

 

문 법

procedure include(Var S: Set of T; I: T);

 

 

 

집합형 S 에 요소 I 를 추가하는 함수이다.
Include(S, I) 는 S := S + (1) 와 동일한 동작을 하지만 좀 더 효율적인 코드를 생성해 낸다.

 

InputBox

 

 

문 법

function InputBox(Const ACaption, APrompt, ADefault: String): String;

 

 

 

문자열을 입력할 수 있는 대화상자를 보여주고 사용자에게 문자열을 입력받아 리턴한다. 인수의 의미는 인수의 이름을 참조하기 바란다.
아래의 예제는 사용자가 문자열을 입력후 Cancle 버튼을 누르면 디폴트 문자열이 리턴되며 OK 버튼을 누르면 에디트 박스에 입력된 문자열이 입력된다.

 

 

예 제

Var
    Str : String;
begin
    Str := InputBox('함수레퍼런스정리[I]','잘되죠?','Oh ! Yes');
end;

 

 

그 림

 

 

InputQuery

 

 

문 법

function InputQuery(const ACaption, APrompt: String; Var Value: String): Boolean;

 

 

 

문자열을 입력할 수 있는 대화상자를 보여주고 사용자에게 문자열을 입력받아 리턴한다. 대화상자가 열리면 아무것도 입력되어 있지 않은 빈 에디트를 보여주며 이 에디트에 사용자가 문자열을 입력한다.
입력된 결과는 리턴값으로 전달되며는 것이 아니라 참조호출로 전달된 Value로 전달되며 리턴값은 사용자가 누른 버튼의 종류이다.
아래의 예제는 사용자가 대화상자에서 어떤 버튼을 눌렀는가를 꼭 알아야 할 경우는 InputQuery 를 사용하며 단순히 문자열만 입력받고자 할 경우는 InputBox 를 사용하면 된다.

 

 

예 제

Var
    Str : String;
    Ans : Boolean;
begin
    Ans := InputQuery('함수레퍼런스정리[I]','이것도 잘되죠?',Str);
end;

 

 

그 림

 

 

Insert

 

 

문 법

procedure Insert(Source: String; Var S: String; Index: Integer);

 

 

 

한 문자열의 중간에 다른 문자열을 삽입하는 함수이다.
삽입되는 위치는 Index 인수가 지정하는 위치이다.
문자열을 삽입한 후의 문자열 길이가 255 자를 넘을 경우 255 문자 이후의 문자는 잘려진다.
Dest 문자열이 'Orange' 이고, Src 문자열이 'Apple' 인 경우 Insert(Src, Dest, 3); 는 Dest 문자열의 3번째 문자인 a 위치에 Src 문자열을 삽입하며 Dest 문자열은 'OrAppleange' 가 된다.
아래 예제는 레이블로 abcdhotdogefghijkl 문자열이 출력된다.

 

 

예 제

Var
    S : String;
begin
    S := 'abcdefghijkl'; Insert('hotdog', S , 5);
    label1.Caption := S;
end;

 

Int

 

 

문 법

function Int(X: Real): Real;

 

 

 

실수 X의 정수부를 구하는 함수이다.
소수부는 반올림되지 않으며 버려진다.
Int(3.14) 는 3 의 값을 반납한다.
주의할 것은 Int 함수의 리턴값은 정수값을 담지만 데이터형은 여전히 실수형이라는 점이다.

 

IntToHex

 

 

문 법

function IntToHex(Value: Longint; Digits: Integer): String;

 

 

 

10 진 정수값을 16진수 형태의 문자열로 바꾸어 문자열을 리턴하는 함수이다.
예를 들어 IntToHex(100, 2) 명령에 의해 십진수 100을 16진수로 바꾼 문자열 '64'가 리턴된다. Digits 인수는 만들어질 16진수의 자리수를 지정한다.
그러나 이 값은 최소한의 자리수를 지정할 뿐이며 자리수보다 16진수의 크기가 더 많을 경우는 이 인수값은 무시된다.
즉, IntToHex(100, 3)에 의해 최소한 세 자리를 할당하여 '064'가 리턴되지만 IntToHex(100, 1)로 한다고 하면 두 자리의 16진수를 강제로 한 자리 숫자로 만들지는 않는다는 것이다.

 

IntToStr

 

 

문 법

function IntToStr(Value: LongInt): String;

 

 

 

정수를 문자열로 바꾸어 리턴하는 함수이다.
정수값을 레이블이나 에디트박스에 출력하고자 할 경우 직접 그 값을 출력할 수는 없다.
왜냐하면 레이블의 Caption 속성이나 에디트의 Text 속성은 문자열형이므로 정수형 값을 대입받을 수 없기 때문이다.
정수값을 문자열로 바꾸고자 할 경우에는 이 함수를 사용한다.

 

IOResult

 

 

문 법

function IOResult: Integer;

 

 

 

마지막 입출력 동작에서 발생한 상태값을 조사한다.
이 함수를 사용하여 입출력 에러를 검사하려면 {$I-} 옵션을 반드시 꺼 주어야 한다.
IOResult 함수를 호출하면 내부적인 에러값은 리셋된다.
이 함수가 리턴하는 값이 0 이면 에러가 없다는 것이다.

 

 

 

 

 

 

함수 레퍼런스 정리...(K)

 

KeyPressed

 

 

문 법

function KeyPressed: Boolean;

 

 

 

키보드에서 키가 눌러지면 True 를 리턴하며, 키가 눌러져 있지 않으면 False 를 리턴하는 함수이다.
ReadKey 함수로 키 값을 읽기 전에 키가 눌러져 있는지 점검해 볼 때 사용한다.

 

 

 

 

 

 

 

 

 

 

함수 레퍼런스 정리...(L)

 

Length

 

 

문 법

function Length(S: String): Integer;

 

 

 

주어진 문자열의 길이를 구하는 함수이다.
Length('Korea') 는 5의 값을 리턴한다.

 

LowerCase

 

 

문 법

function LowerCase(Const S: String): String;

 

 

 

문자열 내부의 대문자를 모두 소문자로 바꾸어주는 함수이다.
문자 변환은 7비트의 아스키 코드 내에서 이루어지며 문자 'A' ~ 'Z' 까지가 변환의 영향을 받는다.
나머지 기호나 숫자, 한글은 변환되지 않는다.

 

 

 

 

 

 




 

함수 레퍼런스 정리...(M)

 

MessageDlg

 

 

문 법

function MessageDlg(Const msg: String; AType: TMsgDlgType;
         AButtons: TMsgDlgButtons; HelpCtx: LongInt): Word;

 

 

 

Message를 전달하는 대화상자를 보여주며 사용자로부터 응답을 받아들여 리턴하는 함수이다.
Msg 문자열이 Message의 내요이며 AType에 의해 Message 상자의 형태와 캡션에 출력된 문자열이 결정된다.

 

 

 

형 태

mtWarning

노란색 느낌표 비트맵이 나타난다. [그림참조]

mtError

빨간색의 엑스 비트맵이 나타난다. [그림참조]

mtInformation

파란색의 i 자 비트맵이 나타난다. [그림참조]

mtConfirmation

물음표 비트맵이 나타난다. [그림참조]

mtCustom

비트맵을 사용하지 않는다. [그림참조]

 

 

 

 

 

 

 

 

 

 

 

ABotton 인수는 Message 상자에 나타날 버튼의 종류를 지정하며 여러개의 버튼을 집합형으로 전달한다.
리턴값은 사용자가 대화상자에 나타난 버튼 중 어떤 버튼을 눌렀는가를 나타내는 값이다.

 

 

 

버튼

기턴 값

mbYes

mrYes

mbNo

mrNo

mbOK

mrOK

mbCancel

mrCancel

mbHelp

 

mbAbort

mrAbort

mbRetry

mrRetry

mbIgnore

mrIgnore

mbAll

mrAll

 

 

 

버튼 이름을 일일이 지정해 주는 것이 번거로우면 미리 정의 되어 있는 다음과 같은 집합명을 사용해도 무방하다.

 

 

 

 

 

 

 

mbYesNoCancel 은 Yes, No, Cancle 버튼을 한꺼번에 보여주고,
mbOkCancel 은 Ok, Cancle 버튼을 한꺼번에 보여준다.
mbAbortRetryIgnore 는 Abort, Retry, Ignore 버튼을 한꺼번에 보여준다.

이 집합명은 그 자체가 집합형이므로 [] 괄호를 쓰지 않아도 된다.

 

 

 

 

 

 

예 제

If MessageDlg(('Ok 누르면 실행합니다.'), MtInformation, mbOkCancel, 0) = mrOk Then
    label1.caption := 'Ok 를 눌렀군요...'
else
    label1.caption := 'Cancel 을 눌렸군요...';

위의 예제는 MessageDlg를 사용하는 방법에 대해 간단히 알아볼 수가 있다.
만약, ABotton인수에 현재는 mbOkCancel 을 넣었지만, 여러개의 버튼을 넣는다면,
[mbOk, mbCancel] 을 입력해도 똑같은 결과를 나타낸다.
여러개를 한꺼번에 쓸 때는 '[ ]' 안에 넣어야만 하고 집합형일 경우는 그냥 쓰면 된다는 아주 간단한 예제이다.
아래 그림은 실행한 화면의 MessageDlg 예제였다.

 

 

그 림

 

 

MessageDlgPos

 

 

문 법

function MessageDlgPos(Const Msg: String; AType: TMsgDlgType; AButtons:
         TMsgDlgButtons; HelpCtx: LongInt; X, Y: Integer): Word;

 

 

 

MessageDlg 함수와 동일한 동작을 하는 함수이다.
단 MessageDlg는 대화상자를 무조건 화면 중앙에 열어주지만 이 함수는 X, Y 인수를 사용하여 대화상자가 출력된 화면 좌표를 지정할 수 있다.

 

MkDir

 

 

문 법

procedure MkDir(S: String);

 

 

 

새로운 서브 디렉토리를 생성한다.
문자열 S에 생성하고자 하는 서브 디렉토리의 경로를 준다.
디렉토리를 생성하는 규칙은 도스에서와 동일하다.
즉, 같은 이름의 디렉토리나 화일이 있어서는 안된다.

 

 

 

 

 

 

 

 

함수 레퍼런스 정리...(N)

 

Now

 

 

문 법

function Now: TDateTime;

 

 

 

현재 날짜와 시간을 한꺼번에 구하는 함수이다.
날짜와 시간은 TDateTime형이므로 곧바로 문자열로 출력할 수 없으며 DateTimeToStr함수를 사용하여 문자열로 바꾸어 주어야 한다.
Label1.Caption := DateTimeToStr(Now); 명령에 의해 Label1에 오늘 날짜와 시간이 출력된다. StrToDate 문자열을 날짜 형태로 바꾸어 TDateTime형의 변수에 저장해 준다.
문자열에 저장된 날짜는 반드시 유효한 날짜 정보를 가지고 있어야 하며 만약 날짜가 무효할 경우 EConverError 예외를 발생시킨다.
문자열은 년, 월, 일을 나타내는 두 개 또는 세 개의 숫자를 담고 있어야 하며 각 요소는 DataSeparator 변수가 지정하는 구분문자(보통 슬래시 기호)에 의해 구분되어 있어야 한다. 년, 월, 일의 순서는 ShortDateTime 변수에 따라 달라지며 mm/dd/yy 또는 dd/mm/yy 또는 yy/mm/dd 중 하나가 된다.
만약 문자열에 두 개의 숫자만 있으면 이는 각각 월, 일의 정보로 인식되며 년은 올해의 년도가 된다.

 

 

 

 

 

 

함수 레퍼런스 정리...(O)

 

Odd

 

 

문 법

function Odd(X: LongInt): Boolean;

 

 

 

인수로 주어진 정수가 홀수인지를 검사하는 함수이다.
만약, 홀수이면 True값을 리턴하며, 짝수이면 False값을 리턴한다.
다음예는 인수로 주어진 정수값 I 가 홀수인지 짝수인지를 검사하여 레이블로 출력하는 예제로서 I에 3을 대입하면 '홀수입니다.'라는 메세지를 레이블로 출력하는 예제이다.

 

 

예 제

Var
    I : Integer;
begin
    I := 3;
    If Odd(I) Then
        Label1.Caption := '홀수입니다.'
    Else
        Label1.Caption := '홀수가 아닙니다.';
end;

 

Ord

 

 

문 법

function Ord(X): LongInt;

 

 

 

순서형값의 순서값을 조사하는 함수로서, 다음예제는 열거형의 열거요소중 Soo가 몇번째 값인지를 조사하는 예제이다. 여기서의 순서값은 2가 출력된다.

 

 

예 제

Type
    Yoil = (Wol,Hwa,Soo,Mok,Gum,TTo,Il);
begin
    Label1.Caption := 'Soo Member Is ' + IntToStr(Ord(Soo));
end;

 

 

 

 

 

 

함수 레퍼런스 정리...(P)

 

Pi

 

 

문 법

function Pi: Real;

 

 

 

원주율을 구하는 함수이다.
원주율은 3.1415926535897932385...로 정의되어 있으며 이값은 부동 소수점 연산 보조 프로세서가 있는지 없는지에 따라 정확도가 달라질 수 있다.

 

Pos

 

 

문 법

function Pos(SubStr: String; S: String): Byte;

 

 

 

문자열내의 부분 문자열을 검색하는 함수이다.
부분 문자열이 검색된 위치를 리턴해 주며, 만약 부분 문자열이 발견되지 않으면 리턴값은 0 이다. 이 함수는 문자열 검색에서 탁월한 성능을 발휘한다.
자세한 사항은 도움말을 참고하기 바란다.

 

 

 

 

 

 

함수 레퍼런스 정리...(R)

 

ReadKey

 

 

문 법

function ReadKey(Buffer: PChar; Count: Word): Word;

 

 

 

키보드로부터 문자값을 읽는 함수이다.
단, 이 함수는 표준 ASCII 코드만을 읽을뿐 기능키나 커서 이동키 등의 확장키 코드는 읽지 못한다.

 

Readln

 

 

문 법

procedure Readln([Var F; Text;] V1[V2,...,Vn]);

 

 

 

파일로부터 문장 한 줄을 읽어 변수 V1이하에 대입하며 다음 문장으로 이동하는 함수이다. Readln(F)와 같이 읽어들일 변수를 지정하지 않으면 다음 줄로 이동하기만 한다.
파일 변수가 생략될 경우는 표준 입력 장치인 키보드로부터 문자열을 입력받아 V1이하의 변수에 대입한다.
인수없이 Readln만 사용되면 Enter키가 입력될 때까지 대기한다.
다음 예는 키보드로부터 문장을 입력받아 다시 레이블로 출력하는 예제이다.

 

 

예 제

Var
    S : String;
begin
    Write('문장을 입력하세요');
    Readln(S);
    Label1.Caption := S;
end;

 

Rename

 

 

문 법

procedure Rename(Var F: Newname);

 

 

 

파일의 이름을 변경하는 함수이다.
변경하고자 하는 이름을 문자열로 전달해 주면 된다.
파일명을 변경하려면 AssignFile 함수로 파일 핸들에 외부 파일명을 할당해 주고 이 함수를 호출하면 되는데, 파일을 오픈할 필요까지는 없다.

 

ReWrite

 

 

문 법

procedure ReWrite(Var F; File [;Recsize: Word]);

 

 

 

파일을 쓰기 전용으로 오픈하는 함수이다.
F는 AssignFile함수로 외부파일과 연결된 파일 핸들이며 RecSize는 F가 untyped 파일일 경우 한번에 출력할 레코드의 크기를 지정한다.
RecSize가 생략될 경우 이 값은 128바이트로 간주된다.
파일이 없을 경우에는 파일을 생성하고 파일이 이미 열려져 있으면 파일을 닫은 후에 다시 생성하며 파일 위치는 파일의 선두에 맞추어 진다.
이 함수로 파일을 오픈할 후에 Writeln등의 함수로 데이터를 파일로 출력하게 된다.
다음 예는 Test.txt라는 간단한 파일을 만든후 문자열 하나를 출력하는 예제이다.
파일 입출력이 끝난 후에 파일 핸들은 반드시 Closefile 프로시져로 닫아 주어야 한다.

 

 

예 제

Var
    F : TextFile;
begin
    AssignFile(F, 'Test.txt');
    ReWrite(F);
    Writeln(F, '출력할 내용을 쓴다.');
    CloseFile(F);
end;

 

RmDir

 

 

문 법

procedure RmDir(S : String);

 

 

 

서브 디렉토리를 삭제하는 함수이다.
삭제할 디렉토리명을 문자열로 넘겨주는데, 도스의 RM 명령과 거의 동일한 규칙을 사용하며 디렉토리가 비어 있지않을 경우, 현재 디렉토리인 경우, 루트 디렉토리인 경우는 디렉토리를 삭제할 수 없다.

 

Round

 

 

문 법

function Round(X : Real): LongInt;

 

 

 

실수값 X 를 정수값으로 만들어주는 함수이다.
즉, 실수의 소수부분을 버리고 정수 부분만 결과로 취한다.
이때 소수부 첫째 자리에서 반올림이 일어나며 반올림의 결과는 부호와 상관없이 일어난다. 반올림의 결과와 LongInt형의 범위를 벗어날 경우는 실행시 에러가 발생한다.
다음 예제는 실수 3.1415 를 반올림하여 정수로 만드는 예제로서 레이블의 출력결과는 소수부가 잘려나간 3이되며, 만약 실수의 값이 3.6415일 경우는 반올림에 의해 4가 출력된다.

 

 

예 제

Var
    F : Double;
begin
    F := 3.1415;
    Label1.Caption := IntToStr(Round(F));
end;

 

RunError

 

 

문 법

procedure RunError[(ErrorCode: Byte)];

 

 

 

실행시 에러를 발생시키고 프로그램을 종료하는 함수이다.
치명적인 에러가 발생했을 경우 이 함수를 이용한다.

 

 

 

 

 

 




 

함수 레퍼런스 정리...(S)

 

Seek

 

 

문 법

procedure Seek(Var F; N: LongInt);

 

 

 

파일의 현재 위치(FP)를 N위치로 옮긴다.
Untyped 파일일 경우 N의 의미는 파일 선두에서의 바이트 단위 거리이지만 Typed파일일 경우 N은 N번째 요소의 위치를 의미한다.
예를 들어 레코드형 파일일 경우 N이 5이면 여섯 번재의 레코드의 위치로 이동한다. 첫번째 레코드의 번호가 0번이다.
Seek(F,FileSize(F))는 파일의 끝으로 현재위치를 이동시킨다.

 

SeekEof

 

 

문 법

function SeekEof[(Var F: Text)]: Boolean;

 

 

 

파일의 현재위치가 끝(EOF)인지 점검한다.

 

SeekEoln

 

 

문 법

function SeekEoln[(Var F: Text)]: Boolean;

 

 

 

파일의 현재위치가 줄의 끝(EOL)인지 점검한다.

 

SelectDirectory

 

 

문 법

function SelectDirectory(Var Directory: String; Options: TSelectDirOpts; HelpCtx:
LongInt): Boolean;

 

 

 

디렉토리 선택 대화상자를 보여주고 사용자로 하여금 디렉토리를 선택하도록 한다.
드라이브 콤보박스와 디렉토리 리스트 박스를 사용하여 디렉토리를 선택하며 파일 리스트 박스는 어떤 파일이 있는지만 보여준다.
디렉토리를 선택하는 것뿐만 아니라 에디트박스에 디렉토리명을 입력하여 없는 디렉토리를 직접 생성할 수도 있다.
인수로 주어지는 Directory문자열은 대화상자가 처음 열릴때 선택될 디렉토리이며 사용자가 대화상자에서 선택한 디렉토리명이 인수로 리턴된다.
사용자가 OK버튼을 누르면 True를 리턴하고 Cancle버튼을 누르면 False를 리턴한다.
두번째 인수 Options는 대화상자의 모양과 기능을 정의하는 옵션이며 다음과 같은 값의 집합형이다.

 

옵 션

의 미

 

[]

사용자는 존재하는 디렉토리를 선택할 수 있을 뿐이며 없는 디렉토리를 만들 수 없다.

 

sdAllowCreate

에디트 박스에 사용자가 직접 존재하지 않는 디렉토리를 입력하는 것을 허용한다.
그러나 이 옵션을 사용한다고 해서 디렉토리를 생성해 주는 것은 아니며 사용자가 직접 Directory 인수를 참조하여 생성해 주어야 한다.

 

sdPerformCreate

이 옵션을 sdAllowCreate 옵션과 함께 사용할 경우 존재하지 않는 디렉토리가 입력되면 직접 디렉토리를 만들어 준다.

 

sdPrompt

디렉토리를 새로 만들기 전에 사용자로부터 디렉토리를 정말로 만들 것인가를 물어본다.

 

 

예 제

Uses 절에 FileCtrl 를 추가해야만 한다.

Var
    Dir: String;
begin
    Dir := 'C:/DELPHI';
    If SelectDirectory(Dir, [sdAllowCreate, sdPerformCreate, sdPrompt], 0) then
        Label1.Caption := Dir;
end;

디렉토리 선택 대화상자의 모습은 아래와 같다.

 

 

그 림

 

 

SizeOf

 

 

문 법

function SizeOf(X): Word;

 

 

 

X의 크기를 바이트 단위로 리턴하는 함수이다. X는 변수이거나 데이터 타입이다. SizeOf(Integer)는 2이며, SizeOf(Double)은 8 이다.
주로 레코드나 오브젝트 등 크기가 큰 데이터의 크기를 계산할 때 사용한다. 가상 메소드 테이블을 가진 오브젝트의 인스턴스크기를 조사하면 VMT에 저장된 크기가 리턴된다.

 

Sqr

 

 

문 법

function Sqr(X: Real): Read;

 

 

 

X의 제곱값을 구하는 함수이다. Sqr(X)는 X*X와 동일한 결과를 계산해 낸다.

 

Sqrt

 

 

문 법

function Sqrt(X: Real): Real;

 

 

 

X의 제곱근을 구하는 함수이다. Sqrt(2)는 1.414213이다.
이때 계산되는 제곱근은 양의 제곱근이다.

 

Str

 

 

문 법

procedure Str(X[: Width [: Decimals]]; Var S);

 

 

 

숫자값 X를 문자열 S로 출력하는 함수이다. 이때 출력되는 값의 폭은 Width 인수가 지정하는 폭을 사용하며 Decimals인수가 지정하는 정밀도를 사용한다. 숫자값 X는 정수형이거나 실수형 모두 가능하다. 다음예는 3.1415를 폭 5, 정밀도 3으로 문자열로 변환하는 예제이다. 이때, 레이블로 출력되는 문자열은 3.142이다.

 

 

예 제

Var
    F : Double;
    S : String;
begin
    F := 3.1415;
    Str(F:5:3, S);
    Label1.Caption := S;
end;

 

StrCat

 

 

문 법

function StrCat(Dest, Source: PChar): PChar;

 

 

 

두개의 문자열을 연결하는 함수이다.
Source문자열을 Dest문자열에 추가하며 연결된 문자열을 리턴한다.
문자열의 길이 점검은 하지 않으므로 Dest문자열이 Source의 문자열을 충분히 수용할만한 크기를 가지도록 해야한다. 다음 예제는 두개의 문자열을 결합하는 예제로서 레이블로 출력되는 결과는 Made In Korea 이다.

 

 

예 제

Var
    S1 : Arrary[0..128] of Char;
    S2 : Arrary[0..128] of Char;
begin
    StrCopy(S1,'Made In ');
    StrCopy(S2.'Korea');
    trCat(S1,S2);
    Label1.Caption := StrPas(S1);
end;

 

StrComp

 

 

문 법

function StrComp(Str1, Str2: PChar): Integer;

 

 

 

두개의 문자열을 비교하는 함수이다.
S1과 S2문자열이 같으면 0을 리턴하며, S1S2이면 양수를 리턴한다.
문자열끼리의 비교는 문자열을 이루는 각 문자의 문자코드를 비교하여 수행한다.

 

StrCopy

 

 

문 법

function StrCopy(Dest, Source: PChar): PChar;

 

 

 

널 종료 문자열을 복사하는 함수이다.
Source문자열을 Dest문자열에 복사하며 Dest문자열을 리턴한다.
이 함수는 문자열의 길이점검을 하지 않으므로 Dest문자열의 길이가 Source문자열의 길이보다 짧지 않도록 주의해야 한다. 만약 Dest문자열의 길이가 Source문자열을 충분히 수용하지 못할 경우 Dest 뒷부분의 다른 변수값이 파괴된다.
널 종료 문자열끼리는 := 연산자에 의해 직접 대입할 수 없으므로 이 함수를 사용하여 문자열끼리 복사해 주어야 한다.
예를 들어 Source가 'Korea'이고 이 값을 Dest문자열로 대입하고 싶다고 해서
Dest := Source와 같은 문장을 쓸수는 없다.
이때는 StrCopy(Dest, Source)와 같이 StrCopy함수를 사용하여야 한다.

 

ShowMessage

 

 

문 법

procedure ShowMessage(Const Msg: String);

 

 

 

대화상자를 열어 Msg 문자열을 보여주기만 하며 OK버튼을 누르면 대화상자를 닫는다.
캡션에는 이 대화상자를 호출한 프로그램의 실행파일이름을 출력한다. 간단한 메세지만을 전달하고 사용자의 입력을 받아야 할 필요가 없을 때 이 함수를 자주 사용한다.

 

 

예 제

ShowMessage('ShowMessage 함수의 실행화면입니다.');

 

 

그 림

 

 

ShowMessagePos

 

 

문 법

procedure ShowMessagePos(Const Msg: String; X, Y: Integer);

 

 

 

ShowMessage프로시져와 동일한 동작을 하는 함수이다.
하지만 ShowMessage는 대화상자를 무조건 화면 중앙에 열어주지만 이 ShowMessagePos함수는 X, Y인수를 사용하여 대화상자를 출력될 화면좌표를 지정할 수 있다.

 

StrLower

 

 

문 법

function StrLower(Str: PChar): PChar;

 

 

 

주어진 문자열을 소문자로 바꾼다.

 

StrToDate

 

 

문 법

function StrToDate(Const S: String): TDateTime;

 

 

 

문자열을 날짜 형식으로 바꿔어주는 함수이다.
문자열은 날짜 형식으로 되어 있어야 한다. 즉, 문자열 안에는 날짜를 이루는 세가지 요소가 순서에 맞게 배치되어 있어야 하며 각 요소는 날짜 구분 문자(/)로 분리되어 있어야 한다.
문자열에 날짜로 변경할 수 없는 문자가 있을 경우 EConvertError 예외가 발생한다.

 

StrToDateTime

 

 

문 법

function StrToDateTime(Const S: String): TDateTime;

 

 

 

문자열은 날짜와 시간을 담는 TDateTime형의 변수로 바꿔어주는 함수이다. 문자열에는 MM/DD/YY HH:MM:SS 형태로 날짜와 시간이 담겨 있어야 하며 시간값은 24시간제로 표현하거나 AM, PM을 추가로 뒤에 붙여주어야 한다.

 

StrToFloat

 

 

문 법

function StrToFloat(Const S: String): Extended;

 

 

 

문자열을 실수값으로 변환하는 함수이다. 문자열에는 부호를 나타내는 +/- 와 숫자, 그리고 소수점만 있어야 하며 지수를 나타내는 E가 올 수 있다.
그 외의 문자가 있을 경우는 EConvertError예외가 발생한다.

 

StrToInt

 

 

문 법

function StrToInt(Const S: String): LongInt;

 

 

 

문자열을 정수값으로 변환하는 함수이다. 이때 문자열에는 숫자로 바꿀 수 없는 문자가 있어서는 안되며, 만약 무효한 문자가 있을 경우 EConvertError예외를 발생시킨다.
에디트박스에 사용자가 입력한 값을 정수형 변수에 대입하고자 할 때 에디트 박스의 Text속성과 정수형 변수의 데이터형이 일치하지 않아 대입이 불가능하다.
문자열에 입력된 정수를 정수형 값으로 바꾸어 주어야 정수형 변수에 대입할 수 있다.

 

StrToTime

 

 

문 법

function StrToTime(Const S: String): TDateTime;

 

 

 

문자열을 시간 형태로 바꾸어 TDateTime형의 변수에 저장해 두는 함수이다. 문자열에는 HH:MM:SS 형태로 시, 분, 초가 담겨 있어야 하며, AM,PM은 있어도 되고 없어도 된다.
시간은 반드시 24시간 형태로 표시해 주어야 한다.
예를 들어 오후 8:30 은 20:30으로 표현하는데, 만약 문자열에 무효한 시간값이 들어있을 경우에는 EConvertError예외를 발생한다.

 

StrUpper

 

 

문 법

function StrUpper(Str: PChar): PChar;

 

 

 

주어진 문자열을 대문자로 바꿔주는 함수이다.

 

 

 

 

 

 

함수 레퍼런스 정리...(T)

 

Time

 

 

문 법

function Time: TDateTime;

 

 

 

시스템의 시계를 참조하여 현재 시간을 구하는 함수이다.
시간은 TDateTime형이므로 곧바로 문자열로 출력할 수 없으며 TimeToStr함수를 사용하여 문자열로 바꾸어 주여야 한다. Label1.Caption := TimeToStr(Time) 명령에 의해 Label1에 현재시간이 출력된다.

 

TimeToStr

 

 

문 법

function TimeToStr(Time: TDateTime): String;

 

 

 

시간을 나타내는 Time을 문자열 형태로 변경하는 함수이다.
시간값을 곧바로 레이블이나 에디트등으로 출력할 수 없기 때문에 이 함수를 사용하여 문자열로 변경해 주어야 한다.

 

Trunc

 

 

문 법

function Trunc(X: Real): LongInt;

 

 

 

실수의 소수점 이하를 버리고 정수부만 취하는 함수이다. Round함수는 소수점 첫째자리에서 반올림을 하지만 이 Trunc함수는 반올림없이 무조건 소수점을 버린다.
다음 예는 3.6415를 정수부분만을 취하여 레이블에 3을 출력하는 예제이다.

 

 

예 제

Var
    F : Double;
begin
    F := 3.6415;
    Label1.Caption := IntToStr(Trunc(F));
end;

 

 

 

 

 

 

함수 레퍼런스 정리...(U)

 

UpCase

 

 

문 법

function UpCase(Ch: Char): Char;

 

 

 

문자 Ch를 대문자로 바꿔주는 함수이다.
소문자 a 에서 대문자 Z 까지의 문자가 대문자 A ~ Z 로 변경되며 그 외 나머지 문자일 경우는 전혀 영향을 받지 않는다.

 

UpperCase

 

 

문 법

function UpperCase(const S: string): string;

 

 

 

문자열 내부의 소무낮를 모두 대문자로 바꾸어 주는 함수이다.
문자 변환은 7 비트의 아스키코드내에서 이루어지며 문자 'A' ~ 'Z' 까지가 변환의 영향을 받는다. 나머지 기호나 숫자, 한글은 변환되지 않는다.

 

 

 

 

 

 

함수 레퍼런스 정리...(V)

 

Val

 

 

문 법

procedure Val(S; var V; var Code: Integer);

 

 

 

문자열 변수 S 를 숫자형 변수로 바꾸어 주는 함수이다.
문자열 변수 S 에는 숫자가 담겨 있어야 한다.
문자열을 바꾼 결과를 받기위한 인수 V는 정수형이거나 실수형 변수 모두 가능하다.
S에 숫자로 바꿀 수 없는 무효 문자가 없다면 Code 값은 0 가 된다.
널 종료 문자열의 경우 Code에 리턴되는 에러 위치는 실제문자의 위치보다 하나가 더 많은 값이 된다.

 

 

 

 

 

 

함수 레퍼런스 정리...(W)

 

Write

 

 

문 법

procedure Write([Var F: Text;] P1[,P2,...,Pn]);

 

 

 

변수값을 파일로 출력하는 함수이다.
F 는 출력용으로 오픈된 텍스트파일이어야 하며 파일이 생략될 경우 표준 출력 장치인 화면으로 출력된다.
파일 변수 다음의 이수 P1 이하는 파일로 실제 출력될 값들이며, 이 값에 필드 폭, 정밀도를 지정할 수 있다.
출력할 수 있는 타입은 문자형, 정수형, 실수형, 문자열, 진위형 등이 있다.
타입도 파일일 경우 출력되는 변수 V1 이하는 파일의 요소와 같은 형이어야 한다.
즉, 레코드형 파일이라면 출력되는 값도 같은 형의 레코드이여야 한다. 파일의 현재 위치가 파일의 끝이라면 파일의 크기는 출력된 데이터의 길이만큼 늘어난다.

 

Writeln

 

 

문 법

procedure Writeln([Var F: Text;] P1[,P2,...,Pn]);

 

 

 

write 함수의 기능을 확장한 함수이다.
Write 를 호출하여 변수를 파일로 출력하되 변수 값 다음에 EOL (End Of Line)을 출력하여 자동으로 개행되도록 한다.

Posted by 나비:D
:

13장

데이터베이스 프로그래밍 기초

초고


 

 

 이장에서는 델파이에서 지원하는 기본적인 Data aware컴포넌트를 이용하여 프로그래밍하는 방법과 SQL문장을 사용하여 데이터를 조작하는 방법에 대하여 알아보겠다. 필자는 Data aware컴포넌트를 그다지 좋아하지는 않는다.

 

 필자가 아는 몇몇 프로그래머들은 기본적으로 델파이에서 지원하는 DBLable이나 DBEdit 사용하는 조차도 부담스러워하는 경우가 종종있다.

 

 델파이로 DB프로그래밍을 하는 방법에는 1, 2, 3, Multi-tier환경의 DB프로그래밍을 있다. 환경의 차이는 DB 어떤 프로토콜과 어떤 방법으로 접근하느냐에 달려있다. 하지만, 기본적인 Business Rule 적용하는 방법은 동일하다. 그러한 방법을 다음의 6가지 형태로 나누어 알아보도록 하자.

 

1)    자료를 DB에서 읽어오는 방법

2)    기본 데이터베이스 과련 유틸리티 사용방법

3)    자료처리시의 에러처리방법

4)    자료를 화면에 제시하는 방법

5)    사용자의 요구에 따라 DB 변경하는 방법

6)    마지막으로 사용자의 요구에 따라 프린터로 출력하는 방법

 

이상의 4가지 방법으로 알아보자.

 

1)    자료를 DB에서 읽어오는 방법

 

기본적으로 TDataSet이라는 구조를 살펴보면 쉽게 있다. TDataSet 구조는 다음과 같다.

 

) TDataSet

DataSet이란 델파이에서 지원하는 관계형데이타베이스의 테이블(열과 행으로 구분되는) 지칭합니다. 델파이의 Data access팔레트에 존재하는 다양한 DataSet컴포넌트를 만날 있습니다. 이러한 컴포넌트들은 관계형데이타베이스의 테이블을 읽어오기 위한 것이고 RDB 접근하는 방법으로 분리되어 있을뿐, 특별한 차이는 없습니다.

 

TDataSet -> TClientDataSet

->TBDEDataSet -> TDBDataSet -> TTable, TQuery, TStoredProc

 

위의 계층도를 살펴보면 TDataSet 모든 테이블의 상위에 존재하며 기본적으로 다음과 같은 기능을 지원합니다. 델파이에서 사용되는 모든 DataSet관련 컴포넌트는 다음과 같은 기능을 지원합니다.

 

구분

지원 프로퍼티/메소드

기본기능

Active, Open, Close

검색기능

First, Last, Next, Prior, MoveBy, Refresh, EOF, BOF, and, IsEmpty

편집기능

Edit, Insert, InsertRecord, Append, AppendRecord, Delete, Post, Cancel, Midufied, State, ChechBrowseMode, SetFields

북마크기능

BookmarkValid, CompareBookmarks, GotoBookmark, FreeBookmark, GetBookmark, Bookmark

Data-aware지원기능

ControlsDisabled, DIsableControls, EnableControls, ISLinkedTo

이벤트

BeforeOpen, AfterOpen, BeforeClose, AfterClose, BeforsInsert, AfterInsert, BeforeEdit, AfterEdit, BeforePost, AfterPost, BeforeCancel, AfterCancel, BeforeDelete, AfterDelete, BeforsScroll, AfterScroll, onCalcFiels, onDeleteError, onEditError, onNewRecord, onPostError

필드지원기능

FieldByname, FieldByNumber, FieldDefs, FieldCount, Fields, FIeldValue, DefaultFields, FindField, GetFieldList, GetFieldNames, UpdateRecord, ClearFields

하위레벨지원기능

ActiveBuffer, CursorPosChanged, GetCurrenRecord, Translate, RecordSize

 

 

 

이러한 TDataSet TClientDataSet 일반적인 BDE 사용할 TTable, TQuery, TStoredProc에게 파생됩니다.

-          TClientDataSet : 전장에서 자세히 설명하였지만 multi-tier 환경에서 사용하며 간단한 1-tier환경에도 사용할 LoadFromFile, SaveToFile 지원되며 ClientPC에는 DBCLient.dll이라는 파일 하나만 지원되면 됩니다.

-          TTable, TQuery, TStoredProc : 델파이에서 지원되는 BDE 사용하여 데이터베이스에 접근하는 방법을 지원하며 보통 2-tier환경으로 C/S환경에 적용됩니다.

 

) TDataSet 기본적인 기능

 

대다수의 기능은 위에서 보여준 표를 참조하면 무방하며 델파이 1, 2, 3에서의 구조와 거의 동일하다 다만 몇가지 참고하여야 내용을 살펴보자.

 

1)  Active, Open, Close

실제로 Active := True, Open 동일한 동작을 수행한다. 이러한 구분을 만들어 놓은 이유는 Design Time Run Time환경에서 동일한 동작을 수행하기 위한 하나의 방편이며, TQuery 형태인 경우 Open문으로 수행하지 못하는 몇가지 작업이 있다. TQuery 경우 ExecSQL이라는 메소드가 있는데 메소드는 데이터를 조작하는 작업으로 Inser문이나 Delete, Update문인경우에 ExecSQL 사용한다. 이경우 수행되는 내용을 Active 통하여 검사할 있다.

 

2)  TDataSet 상태

현재 DataSet 작업상태를 표시하는 것으로 State프로퍼티를 참조하면 현재 상태를 있다.


실제 델파이의 Help화면을 참조한 부분이다.

 

3)  TDataSet 조작

데이터를 검색하고 환경을 조절하는 방법을 알아보자.

 

First, Next, Prior, MoveBy(수치) 레코드의 행을 이동하는 방법이다. 그리고 BOF EOF 레코드의 처음과 끝을 참조하기 위한 Boolean형태의 프로퍼티이다.

 

해당 레코드의 필드를 조작하기위해서 사용하는 프로퍼티는 다음과 같다.

 

테이블.FIelds[ 0 ].asString

테이블.FIeldByName( ‘필드명’ ).asString

테이블.FIeldValues[‘필드명’]

테이블필드명.value <- 필드에디터에서 필요한 필드를 추가하여 주어야 사용할 있다.

 

위의 4가지 표현방식은 모두 동일하다. 개발자는 어떠한 방식을 사용하여도 좋으나 가장 무난한 방법은 FieldByName 무난하게 사용하기 편하다.

 

Insert, Edit, Post, Delete, Cancel등은 데이터를 추가하거나 삭제하고 취소하는 방법이다.

table1.insert;

table1.fieldByname(‘필드명’).asString := ‘’;

table1.fieldByname(‘필드명’).asString := ‘’;

table1.post;

 

table1.edit;

tabel1.fieldByname(‘필드명’).asString := ‘’;

tabel1.fieldByname(‘필드명’).asString := ‘’;

table1.post or table1.cancel;

 

table1.delete

 

이상은 DataSet 사용하여 자료를 추가하고 자료를 변경하고 자료를 지우는 방법이다. 다만, 이러한 작업은 DataSet DB Cursor 위치한 위치에서 작업되며, DB Cursor 이동하는 방법은 위에서 설명한 레코드 행을 이용하는 방법(Insert, Edit, Post, Delete, Cancel) 사용하면 된다.

 

) 자료를 읽어오는 방법

 

이제 DataSet 기본적인 내용을 살펴보았다. 이제 DataSet에서 파생된 TTable TQuery 기능을 살펴보자.

 

크게 TQuery TStoredProc 거의 동일한 기능을 수행하며 TQuery TTable 차이점은 테이블을 보는 관점의 차이이다. TQuery에서는 테이블을 바라보는 정의를 SQL문장으로 기술하며 사용자가 원할 경우에 사용자가 원하는 시점을 사용하기 위해 SQL문장의 다양한 기능을 이용하여 Join이나 View등을 통하여 2차원적인 테이블을 바로보는 시점을 만들어 내는 형태의 테이블이 많은 경우에 사용한다.

 

TTable 경우에는 테이블의 형태가 고정되어 있는 경우가 많거나 델파이의 기본적인 기능중에 하나인 Master-detail기능을 이용할 경우에 사용한다.

 

1)개발자가 테이블을 바라보는 방법

(1) SQL문장으로 원하는 테이블을 지정하는 방법

(2) TTable 컴포넌트에서 원하는 테이블을 지정하는 방법

select * from 테이블명

 

l       참고

 델파이에서 Alias기능에 대하여 델파이의 별명기능은 다른 RDB 기능에서 유래된다. 다른 RDB 경우에 DataBase 불리우는 데이터 공간을 만들어 고유의 명칭을 부여한 다음 해당 데이터공간에 원하는 테이블을 생성하는 방법으로 데이터를 관리한다.

  방식은 하나의 목표로 사용되는 테이블들의 구분과 물리적은 위치를 고정함으로써 데이터베이스의 성능을 향상하는 경우에 사용되었다. MS-SQL 경우에는 데이터베이스의 크기를 고정하고 단일의 파일을 생성하여 사용한다. InterBase 경우에도 단일 파일로 만들어진 데이터베이스를 사용한다.

 Paradox DBase, Fox 경우(델파이 바라보았을떄) 많은 테이블이 존재할 있고 이러한 테이블을 단일 형태로 관리할 있는 방법으로 이러한 별명(Alias) 사용할 있다. Access 경우 하나의 Alias 하나의 파일로 존재한다.

 델파이에서는 이러한 데이터베이스를 관리하기 위한 방법으로 TDataBase컴포넌트와 TSession컴포넌트를 지원한다. 두컴포넌트는 Alias 관리하며 해당 데이터베이스의 접근을 위한 username이나 password 같은 지원기능도 부여한다. 일반적으로 TDataBase컴포넌트를 통하여 Alias 접근하고 가상 Database 이름을 부여한다음 가상 DataBase컴포넌트의 이름을 통하여 필요한 DataSet컴포넌트를 통하여 원하는 데이터베이스의 테이블에 접근한다.

 

) 검색하는 방법

 

테이블은 방대한 자료를 가지고 있으며 기본적인 이동명령어인 First, Next, Prior, MoveBy문장을 사용하여 자료를 이동하며 각각의 필드에 있는 값을 읽어 있다.  하지만 테이블에 많은 데이터가 쌓이므로 이러한 이동명령어로만 차례로 IF문장으로 비교하는 방법을 사용하면 비효율적이 아닐 없다.

 

해서 각각의 테이블에 인덱스를 사용하는데 다음의 방법은 인덱스가 존재한다면 델파이 내에서 가장 빠른 방법이다.

 

table1.setRangerStart;

table1.fieldByname(‘필드명’).AsString := ‘검색값’;

table1.setRengeEnd;

table1.fieldByname(‘필드명’).AsStrign := ‘검색값’;

table1.ApplyRange;

 

이문장은 필드명의 시작값과 끝값을 지정하므로써 해당 테이블의 인덱스를 참조하여 빠르게 원하는 레코드들을 배열한다. 인덱스가 존재한다면 가장 빠른 방법이다. 문제는 TTable에만 적용되는 방법이다.

 

아니면 TTable(Tquery 지원한다.) Filter기능을 사용할 있다. Filter기능은 자주 사용되지 않는 필드의 찾는 방법이 있다.

 

table1.filtered := true;

table1.filter := ‘(필드명 >= ) and ( 필드명 <= )’;

 

이렇게 필터기능을 사용한다음 FindFirst, FIndLast, FindNext, FIndPrior 사용할 있다.

 

혹은 인덱스가 지원되는 TTable이나 TClientDataSet 같은 컴포넌트에서는 다음과 같은 방법을 사용할 있다.

 

EditKey, FindKey, FindNearest, GotoKey, GotoNearest, SetKey 사용하여 TQuery TClientDataSet에서 사용할 있다. 사용방법은 다음과 같다.

 

table1.SetKey;

table1.FieldByname(‘필드명’).asString := ‘검색값’;

통하여 검색하고자 하는 필드에 검색값을 넣은다음

 

if not table1.gotokey then showmessage(‘찾지못함’);

 

table1.gotokey 사용하면 해당 값으로 이동하며 값이 존재하지 않는다면 False 리턴되어 온다.

 

table1.Nearest 사용하면 해당 값과 가장 근사치인 값의 레코드로 이동한다.

 

FindKet FindNearest Setkey GotoKey, Nearest 합쳐놓은 것과 동일하다.

 

TQuery컴포넌트를 사용할 경우에는 생각외로 간단하다. 해당 SQL문장을 다음과 같이 기술하면 된다.

 

with Query1 do

beign

                   active := false;

                   sql.clear;

                   sql.add( ‘select * from 테이블명 where 필드명 조건 ’ );

                   active := true 또는 open 또는 execSQL

end;

 

l       참고

TQuery 기타 SQL 사용하는 컴포넌트를 사용할 경우 Active Open/Close ExecSQL 차이점은 단순히 데이터를 View하는가, 데이터를 조작한후에 데이터를 리턴받느냐에 달렸다. SQL문장중에 데이터를 조작하는 INSERT,DELETE, UPDATE문장의 경우 execSQL 사용하여야 한다. 그리고 SELECT문장의 경우 원하는 데이터를 리턴받아야 하므로 일반적인 TTable 동일하게 Active, Open/CLose 사용한다.

 

) 자세한 SQL문장 사용방법

 

세부적인 SQL문장을 사용하기전에 델파이에서 지원하는 Local Interbase 살펴보자, 델파이C/S버전에서는 C/S프로그램을 제작하기 편하도록 테스트용 Local Interbase 같이 지원된다. 기본적인 C/S작업은 Local Interbase 사용하여 작성하여 보자.

 

l       참고

Interbase 다른 RDB와는 다르게 Remote Local DB 접근할 경우 Alias에서 해당 DataBase 지정할 경우에 컴퓨터이름과 해당 디렉토리를 모두 기술 하여 주어야 한다. 와같은 형태가 불편할 있으나,  물리적인 데이터베이스를 관리하기가 편하므로 Unix WindowsNT 경우 하드가 모자라서 확장할 경우 간단하게 이동을 한뒤에 해당 BDE세팅에서 위치만 변경하여 주면 간단하게 변경할 있는 장점도 있다.

 

LocalInterbase 기본 ID

UserName : SYSDBA

Password : masterkey

 

기타 InterBase 기본적인 사용방법

 

(1)  InterBase Server Manager

InterBase그룹의 Interbase Server Manager프로그램은 Interbase 전반적인 데이터베이스를 다루는 DBA 입장에서 Interbase 다룰 있다. 프로그램은 local Remote모두 동일하다.

-          File/Server Login잡업에서는 Remote local Interbase 데이터베이스에 접근할 있도록 한다. (SYSDBA/masterkey 접근한다)

-          Tasks/User Security에서 새로운 사용자를 추가한다. ( 사용자명을 사용하여 프로그램에서 Interbase 접근한다.)

(2)  Windows ISQL

-          Console SQL 지원하는 프로그램으로 Interbase 데이터베이스나 테이블을 추가/수정/삭제할 있는 SQL문장으로 Interbase 조작할 있다.

-          File/Create DataBase 선택하면 원하는 위치에 DataBase 생성할 있다.

-          File/Drop Database 선택하면 DataBase 삭제할 있습니다.

 

l       참고

Interbase 기본적으로 gdb라는 확장자명을 사용합니다.

l       참고

모든 SQL문장으로 이루어진 작업은 Commit이라는 명령어로 push하여주어야만 작업이

 

이제 SQL문장을 사용하여 DataBase 생성하고 테이블을 만들고 조작하는 방법을 알아보자.

 

(3)  테이블 생성

 

create table 테이블명 ( 필드명 속성 형태 키형태, … ) 으로 기술하면 되는데 하단의 예를 살펴보자.

 

create table data ( code char(5) not null primary key, name varchar(20), age integer )

 

예제는 data라는 테이블을 생성하는데 기본키는 code라는 char(5)형태의 (null)값이 존재하지 않는 필드와 name이라는 varchar 20자리, age라는 수형 필드를 가지는 테이블을 만들려는 SQL문장입니다.

 

이러한 작업은 SQL문장을 사용할 수도 있고, DataBase DeskTop에서 테이블을 만들어 사용할 있습니다.

 

(4)  레코드 추가

 

insert into 테이블명 ( 필드값 ) values ( 넣는 )

 

(5)  레코드 수정

 

update from 테이블명 set 필드명 = where 조건

 

(6)  레코드 삭제

 

delete from 테이블명 where 조건

 

이상으로 기본적인 SQL문의 사용방법을 알아 보았습니다.

 

(7)  Stored Procedure 사용방법

 

Stored Procedure 일련의 SQL문장으로 이루어진 서브루틴과 동일합니다. 2-tier이상의 프로그램을 제작하는 경우에 많은 테이블을 Open하여 반복적인 작업을 수행하는 경우가 빈번하다면 해당 테이블마다 SQL문장을 통하여 Open한다음 Client에서 작업을 하게 되면 비효율적인 네트웤트래픽을 비롯하여 여러가지 자원의 낭비가 발생합니다.

 

이떄에 Stored Procedure 사용하여 해당 문장을 기술할 있습니다. 또는 고정된 SQL문장으로 Client 요구를 파라메터로 받아들여서 일반적인 서브루틴처럼 작동하는 모듈을 구성할 경우에도 이와같은 Stored Procedure 사용할 있습니다.

 

다음의 예는 Stored Procedure 만드는 내용입니다.

 

Create Procedure Insert_data ( PCode varchar(4), pname varchar(20), pag smallint )

as

begin

                   begin

                                      insert into data values ( :pcode, :pname, :page );

                   end

suspend;

end

 

이런 문장을 수행하면 해당 데이터베이스에 Insert_data라는 Stored Procedure 생성됩니다. 이제 델파이에서 StoredPricedure컴포넌트를 사용하여 위의 Stored Procedure 호출하여 사용할 있습니다.

 

with StoredProc1 do

begin

                   StoredProcName := ‘insert_data’;

                   paramByname( ‘Pcode’ ).asString := ‘’;

                   paramByname( ‘Pname’ ).asString := ‘’;

                   paramByname( ‘PAge’ ).asInteger := ;

                   ExecProc;

end;

 

(8)  자세한 TDataBase 컴포넌트의 사용

 


(1)동적인 Alias생성

DataBase컴포넌트를 사용하면 존재하는 Alias 사용하여 접근할 있으며, 또는 실행환경에서 하나씩 BDE Alias 생성시켜주는 불편을 사용하지 않고 DataBase컴포넌트를 통하여 수행중에만 존재하는 Alias 생성하여 사용할 있게 하여 줍니다. (가장 많이 쓰이는 용도)

 

위의 다이얼로그중에 Parameter overrides부분에는 해당 데이터베이스에 접근하기 위한 다양한 값들을 세팅할 있게 합니다. Defaules 누르면 기본적인 정보가 나타납니다. LoginPrompt 세팅하므로써 사용자에게 userName Password 물어보는 다이얼로그르 생략할 있습니다.

 

keepConnection 데이터베이스를 열떄마다 사용자명과 암호의 입력작업을 중복입력할 필요가 없게 줍니다.

 

그러나~~~

 

DataBase컴포넌트를 사용하는 가장 이유는 다음의 이유때문입니다.

 

(3) 트랜잭션의 관리

 

보통 C/S프로그램을 제작하는 경우에 초보자들이 가장 곤란해 여기는 부분이 바로 트랜잭션의 관리입니다.  트랜잭션이란 SQL문장으로 기술된 논리적인 하나의 작업단위를 뜻하는데, Remote DB 사용하는 경우 중간의 네트웍 때문에 자료의 비정상적인 전송이나 오류가 발생하는 경우가 빈번합니다. 특히나, 테이블이 하나가 아닌, 2~3 이상의 테이블의 값을 수정하거나 추가하는 경우에 테이타의 무결성에 치명적인 문제가 발생할 있습니다.

 

3개의 테이블을 수정하는데 2개의 테이블만 수정되고 1개의 테이블에 값이 수정되지 않는다면 데이터는 나중에 치명적인 문제를 발생할 있습니다. 이떄에 이러한 테이블의 수정작업을 하나로 묶은 작업단위가 트랜잭션이라합니다.

 

트랜잭션은 데이터의 하드웨어적인 문제의 Consistency(일관성) 다중 사용자 접근에서의Integrity(무결성) 보장해 줍니다.

 

(4) 트랜잭션의 관리방법

 

-기본제어

델파이는 기본적으로 트랜잭션을 기초적인 단계에서 수행합니다. 바로,  Post AppendRecord등과 같은 메소드에서 자동작으로 해당 트랜잭션을 수행하고 commit하게 됩니다. 문제는 이런 기본적인 제어방법은 추가/수정/삭제작업의 트랜잭션시의 문제발생은 막을 있으나, 네트웤트래픽이나 여러 개의 작업단위로 이루어진 문장에서는 보장할 업세 됩니다. 이경우에는 다음에 설명할 방법으로 개발자가 일일히 기술해 주어야 합니다.

 

-개발자가 지정하는 제어방법

메소드

설명

StartTransation

트랜잭션의 시작 포인트를 설정한다.

Commit

진행된 트랜잭션을 물리적인 데이터베이스에 적용한다.

RollBack

현재 진행된 트랜잭션을 원상태로 복귀시킨다.

l       참고

델파이4에서는 Local DB Paradox에서도 이러한 트랜잭션을 지원합니다.

 

(5) 트랜잭션의 종류

전장에서 델파이에서 지원되는 트랜잭션의 옵션과 지원되는 DB에서의 동작에 대해 설명하였습니다. 밖에도 BDE세팅에 해당 데이터베이스의 트랜잭션의 동작에 대한 기본설정을 있습니다.

바로 SQLPASSTHRU MODE인데, 다음의 3가지로 지원됩니다.

 

MODE

설명

SHARED AUTOCOMMIT

기본적인 설정으로 레코드()단위의  모든 작업에 Commit 자동 작동시킵니다. SQL BDE메소드가 동일하게 동작합니다.

SHARED NOAUTOCOMMIT

프로그램내부에서 정확하게 트랜잭션이 기술된 시점에서 트랜잭션을 수행합니다. SQL BDE메소드가 동일하게 동작합니다.

NOT SHARED

완전히 별개의 트랜잭션을 기술하며 SQL BDE 다른 연결방법을 사용합니다.

 

(6) 트랜잭션의 Trnaslsolation형태

설명

tiDirtyRead

가장 낮은 방법

데이터 수정시에 다른 User 접근을 허용한다. 읽기/쓰기의 락이 걸려있지 않는다.

tiReadCommitted

보통

데이터의 수정시에 읽기가 시작되고 종료되는 EOT시점까지 Lock 유지한다.

tiRepeatableRead

가장 높은 방법

일기/쓰기시에 EOT시점까지 Lock 유지한다.

l       참고

델파이에서 지원되는 DB Translsolation 값은 각각의 DB마다 동작을 지원하는 방법이 모두 틀리다, 예는 전장에 기술되어 있다.

 

) LocalDB RDB 이동

 

일반적으로 작성된 Paraodx DBase형태의 DB RDB 데이터로 전송하는 경우에 해당 프로그램을 작성할 필요없이 간단한 방법으로 이러한 데이터를 전송할 있다. 이경우에 개발자는 Alias 두개 준비하여 Source에서 Target으로 데이터를 전송하면 그만이다.

 

Data Migration Wizard 사용하여 데이터 이전작업을 수행하면 된다.

 

다만 주의할 것은 데이터베이스의 형태가 바뀌므로 전송시에 살펴볼 내용은 다음과 같다.

(1) 각각의 필드의 속성이 Target에서 지원되는지 살펴보아야 한다.

(2) 필드명중에 해당 DB 예약어인경우가 있다. 필드명을 살펴보아야 한다.

l       참고

필자의 경험상 자료를 올리는 경우에 Index 모두 삭제한 다음 Upsize하는 것이 성공확률이 높다.


) DataSource 사용방법

DataSource 단순히 DataSet컴포넌트와 Data-aware컴포넌트를 연결하는 연결방법으로 사용하지만은 않는다. 여기서는 DataSource 몇가지 유용한 기능에 대하여 알아보자.

 

(1)  Master Detail기능

Master Detail기능을 사용할 경우에 Master Sub 경우 Sub TTable 사용하여야 한다. 이경우는 DataSet Sub DataSet 조작하는 경우이다.

 

(2)  다양한 이벤트의 사용

 

이벤트

설명

onDataChange

해당 DataSet 변경될 경우에 발생한다.

onStateChange

해당 DataSet 작업형태가 변경될 경우에 발생한다.

onUpdateData

물리적인 데이터가 변경될 경우에 발생한다.

 

) Cashed Updates

이것은 트랜잭션과 유사한 개념입니다. 개발자가 원하는 테이블에 변경작업(추가/수정/삭제)작업을 취할 경우에 다중 레코드를 처리하는 것을 허용하여 중간 버퍼에 이러한 작업을 유지한다음 원하는 시점에 작업을 물리적인 데이터베이스에 영향을 주는 방법을 말합니다.

 

기능은 DataSet 컴포넌트에 모두 해당되며 해당 CachedUpdates 프로퍼티에 True 설정되어 있어야만 동작이 가능합니다.

 

동작코드는 다음과 같습니다.

 

메소드

설명

ApplyUpdates

버퍼의 내용을 물리적인 DB 저장합니다.

CancelUpdates

현재 버퍼에 저장된 변경내용을 삭제합니다.

RevertRecord

현재 레코드만 원래의 레코드로 변경합니다.

 

l       참고

DataBase1.ApplyUpdates( [테이블, 테이블] ) 사용하면 여러 개의 테이블에 있는 Cashed Updates 하나의 코드로 동작시킬 있습니다. 다만, CancelUpdates DataBase컴포넌트에서 지원하지 않습니다.

 

) TUpdateSQL

TQuery, TStoredProce컴포넌트 이외에 기본적으로 TUpdateSQL이라는 컴포넌트가 지원됩니다. TQuery컴포넌트에서는 Select, Insert, Delete, Update등의 모든 SQL문장을 사용할 있습니다. 심지어는 Stored Procedure Trigger 만들 있습니다. 하지만, 실제 SQL문장을 사용하다 보면 자그마한 리소스나 속도문제에 민감해집니다.

 

TQuery 모든 SQL문장을 동작시키는 많은 내부코드를 가지고 있습니다. 그렇지만 일반적인 SQL문장을 사용하는 경우에는 Insert, Update, Delete 3가지 기본적인 작업이 많이 쓰입니다. 이경우에 보다 빠른 작업과 관리의 편리성을 위하여 TUpdateSQL컴포넌트를 사용합니다.

 

단순화된 컴포넌트는 필요한 3가지의 행동코드를 가질 있어서 간단한 Stored Procedure처럼 사용할 있습니다. 매번 추가/수정/삭제할 때마다 SQL프로퍼티의 내용을 지웠다 추가했다하는 코드도 줄일 있으니까요.

 

일반적인 코드는 TQuery 동일합니다.

 

) Gloval Session 기능사용하기

 

델파이에서 현재 사용하고 있는 데이터베이스의 정보나 테이블정보를 검색하는 경우가 있습니다. 보통 이경우에는 Session 사용되는데 델파이를 서보면 아시겠지만 기본적으로 Session 하나 Global 선언되어 있고 Default Session으로 사용됩니다.

 

Session.GetDriveNames( Strings객체 ) 사용하면 현재 사용되는 데이터베이스 드라이브정보를 얻을 있습니다.

Session.GetDataBaseNames( Strings객체 ) 사용하면 현재 사용되는 데이터베이스명을 얻을 있습니다.

Session.GetTableNames('데이터베이스명', 형태('*.db'),False, False, Strings객체);

 

l       참고

String객체를 보기위해서는 ListBox Items Memo Items 사용할 있습니다.

 

) Bookmark사용하기

 

북마크는 책갈피라고 생각하시면 간단합니다. 원하는 위치를 지정해 놓고 해당위치로 빠르게 이동할 있게 하여 줍니다.

 

북마크 := Table1.GetBookMark; // 현재의 위치를 저장합니다.

Table1.GotoBookmark( 북마크 ); // 해당 북마크로 이동합니다.

table1.FreeBookmark( 북마크 ); // 해당 북마크를 삭제합니다.

 

 


2)    기본 데이터베이스 관련 유틸리티 사용방법

 

)DataBase Desktop


DataBase Desktop 델파이1에서부터 크게 변한 것이 없습니다. DeskTop 가장 유용하게 사용되는 경우는 개발자가 Paradox형태의 DB 개발하는 경우 Paradox내부의 참조무결성 연결과 DB자체의 입력값제한과 같은 기능을 지원하기 위한 경우에 주로 사용합니다. 자세한 설명은 생략하도록 하겠습니다.

 

) SQL Explorer


프로그램은 델파이1 포함되어 있던 DeskTop 발전된 형태로 본격적인 SQL문장의 테스트와 델파이 내부 IDE 연결되어 IDE에서 TTable이나 TQuery등에서 바로 연결하여 사용하거나 원하는 테이블의 필드를 IDE 드래그하면 해당 DBEdit이나 DBlabel 바로 얻을 있다.

그리고 가장 강력한 기능은 사전(DIctionary)기능과 속성집합(Attribute Sets)이다. (자세한 설명은 전장에서 설명하였으므로 간단하게만 서술한다.)

 

기능은 델파이로 개발하는 과정에서 필요한 테이블의 구조와 데이터사전을 구축할 있는 것으로 상당한 분량의 업무를 줄여주는데 유용하게 사용된다. 만들어진 데이터사전을 바로바로 추가하고나 보관하여 델파이 자체만 가지고도 실시간으로 프로그램을 구축할 있는 간단한 DB업무도구로 사용할 있다.

 

) SQL Monitor


프로그램은 C/S프로그램을 작성하거나 수행중인 RDB SQL문을 주고받는 동안 이루어지는 작업을 모니터할 있게 해준다. 실제 수행시간과 전달되는 문장으로 프로그램의 퍼포먼스를 높이거나 문제해결에 도움을 주는 도구입니다.

 

메뉴중에 Trace Options 대해 알아보겠습니다.


내용

Prepared Query Statements

RDB 보내지는 문장

Executed Query Statements

RDB 보내어져 수행되는 문장

Statements Oprations

수행되는 모든 작업(Fetch, Execure)

Connect/Disconnect

연결과 해제에 대한 내용

Transations

트랜잭션작업(Begin, Commit, Rollback)

Blob I/O

Blob데이타작업

Miscellaneous

위에 서술된 내용이외의 작업

Vendor Errors

RDB에서 반환된 에러번호

Vendor Calls

RDB에서 호출되는 API함수

 

 

 

 


3)    데이터베이스처리스의 에러처리 방법

) EDatabaseError

EDatabaseError 대한 클래스를 분석한다. 실제 DB프로그래밍시에 부딧히게 되는 대다수의 문제점은 EDatabaseError클래스를 사용함으로써 문제를 해결할 있다.

 

보통

 

try

                   … DB작업

except

                   on EDatabaseError do

                  

                   raise;

end;

 

DB작업중에 문제가 발생하는 부분을 try..excpet문장으로 감싸고 해당 부분에서 EDataBaseError객체로 발생한 에러를 추적하여 대처할 있다.

 

그러나, EDatabaseError에서는 직접적으로 어떤 오류가 발생하였는지는 없고 실제 내용은 파생된 EDBEngineError 참조하면 가능하다.

 

보통은 DataSet OnPostError, OnEditError, OnDeleteError 이벤트를 참조하면 대다수 문제가 해결됩니다.

 

해당 이벤트에는 문제가 발생된 DataSet EDatabaseError객체가 전달되며 문제를 해결하기 위해 TDataAction 지정하게 됩니다. 지정되는 값은 다음과 같습니다.

 

daFail : 실패, daAbort : 중단,  daRetry : 재시도

 

) EDBEngineError

EDBEngineError Errors배열에 BDE에서 발생되는 모든 오류의 값과 내용을 가지고 있습니다.

 

ErrorsCount 발생한 에러의 개수

Errors에는 발생된 에러의 내용이 TDBError 배열형태로 들어있습니다. TDBErrors 내용은 다음과 같습니다.

 

속성

내용

Category

오류코드범주

ErrorCode

오류코드숫자(DBIResult형태)

Message

서버에 연결되어 있으면 서버에서 리턴된 에러메시지, 보통은 BDE 에러메시지

NativeError

RDB에서 발생한 에러인지 체크, 0 리턴되면 서버오류가 아닌 BDE오류입니다.

SubCode

하위 오류코드

l       참고

Category SubCode Byte형태로 코드는 상위와 하위의 에러코드를 지칭합니다.

 

리턴되는 에러코드는 BDE.INT화일을 참조하면 다양하게 존재하는 에러의 코드를 참조할 있습니다. 해당 BDE.INT에는 Delphi4 DOC디렉토리에 333kB 파일로 존재합니다. 실제 에러는 Byte형태로 존재하며 DBI상에서의 에러는 ErrorCode Word타입의 자료를 참조하면 에러를 찾을 있습니다.

 


 

4)    자료를 화면에 제시하는 방법

 

 


5)    사용자의 요구에 따라 DB 변경하는 방법

 

사용자는 데이터를 조작하기 위해 개발자가 만들어 놓은 EditBox 값을 채워놓고 해당 버튼을 Click하였을 것이다. 이때에 개발자는 해당 내용으로 자료를 변경하여야 한다. 전에도 설명하였지만 다시한번 살펴보자.

 

그중에 SQL( Structured Query Language ) 자세히 살펴보자. SQL DDL( Data Defination Language) DML( Data management Language ) 나뉜다. 델파이는 이러한 SQL 완벽하게 지원한다.

 

SQL문장을 자세히 살펴보자.

 

) Select

 

Select 선택필드 into 변수명 또는 레코드명 from 테이블 where 조건;

 

형식으로 기술된다. 

선택필드에는 * 기술되면 전체 필드를 지칭하며 필요한 필드명을 나열하면 해당 필드로 구성된 테이블 뷰를 만들게 된다. 이때에 필드의 개수가 적을수록 해당 SQL문장의 동작속도는 빨라지게 된다.

 

l       참고

TQuery컴포넌트에는 prepare라는 메소드가 존재한다. 메소드는 SQL문장을 수행하기전에 해당 문장을 최적으로 수행할 있는 환경을 구성한다. 문장은 사용하는 것이 좋다.

 

테이블절에는 여러 개의 테이블을 기술할 있다.

 

select 테이블명A.필드명, 테이블명B.필드명 from 테이블명A, 테이블명B

 

두개이상의 파일을 Join하여 하나의 View 있도록 하여 준다.

 

) Delete

 

Delete from 테이블명 where 조건;

 

해당 테이블에 해당 조건에 맞는 레코드를 삭제한다.

 

) Insert

 

Insert into 테이블명 (필드명, … ) values (, … );

 

) Update

 

update 테이블명 set 필드 = , … where 조건

 

) Like연산자

 

위에서 언급한 SQL문장의 조건절에는 다음의 Like연산자를 사용할 있다. Like연산자는 해당 필드에 속해있는 값들 중에 비슷한 값을 찾아내는 연산자로 DOS Command *(와일드카드) 동일하다.

 

SQL문장네에 % 사용하게되면 Like연산자가 동작하게 된다.

 

select * from 테이블 where 필드 like ‘%’;

 

해당 필드에 속해있는 값들중에 으로 시작되는 데이터를 찾을 것이다.

 

) Order By

 

레코드를 정렬하는 경우에 사용한다.

 

select * from 테이블 order by 필드명

 

오름차순과 내림차순은 Asce Desc 해당 필드명 뒤에 붙여주면 해당 형식으로 정렬된다.

 

) Group By

 

선택된 필드를 그룹단위로 묶어서 중복된 것만 보여준다.

 

select 필드값, sum( 필드값 ) “합계”, avg( 필드값 ) “평균” from 테이블명 group by 테이블명

 

해당 테이블명이 중복된 값의 합계와 평균을 출력한다.

 

 


 

6)    마지막으로 사용자의 요구에 따라 프린터로 출력하는 방법

 

프린터로 출력하는 방법에는 여러가지 방법이 있습니다.

) 일반적인 프린터 메소드를 사용하는 방법

) QuickReprot 사용하는 방법

) 다른 서드파티를 사용하는 방법

 

) 일반적인 프린터 메소드를 사용하는 방법

WriteLn Canvas 사용하여 원하는 출력물을 만들어 있습니다.  WriteLn 사용방법은 다음과 같다.

 

WriteLn( 텍스트화일, 문자열, … );

 

사용하여 원하는 텍스트 문자열을 출력할 있다.

 

l      

보통 Table이나 Query Open하여 놓은 상태, 특히나 DBAware 사용한 경우에는 화면에는 작업하다가 프린팅과 같은 전체 자료를 사용하여 출력하는 경우에는 Bookmark 사용하여 작업하던 장소를 저장한다음 테이블이나 Query문을 다시 동작하여 사용하면 간단하게 작업할 있다. 또한 Data-aware 사용할 경우 전체 내용을 검색할 경우 DataSource 연결된 경우에는 해당 데이터의 Refresh 때문에 수행이 느려진다.

 

때문에 DisableControls EnableControls 활용하여 활성을 조절하면 프로그램의 수행이 빨라진다.

 

Canvas사용방법

 

일반적인 문자열을 출력하는 경우에는 WriteLn 무방하지만, 색을 지정하거나 그림이나 도형을 출력하는 경우에는 Canvas 사용하여 출력하여야 한다.

 

printer.BeginDoc;

printer.Canvas.TextOut( x, y, 문자열 );

printer.EndDoc;

 

주의할 점은 x, y 해당 좌표값을 지정하는 것과 좌표값은 Pixel단위이므로 해당 Font Height Width 알아서 계산해 주어야 한다는 점과, , EndDoc 호출하여 끝을 맺어야 한다. 이부분이 빠지게 되면 무한루프를 돌우려가 있으니 첨가하여야 한다. 이외에도 newPage, Abort, PageNumber등의 프로퍼티로 새페이지, 출력중단, 페이지번호알기등의 프로퍼티등이 지원된다. 자세한 것은 델파이 Help 참조하자.

 

다음의 코드는 Delphi Help Printer Example 나와있는 코드로써 위의 WriteLn으로 해당 내용을 출력하는 방법을 보여주고 있다.

 

var

  Line: Integer;

PrintText: TextFile;

begin

  if PrintDialog1.Execute then // 프린터 다이얼로그에서 원하는 프린터를 선택하도록 한다.

  begin

    AssignPrn(PrintText);   {PrintText 프린터정보를 연결한다.}

    Rewrite(PrintText);     {출력할 있도록 한다.}

    Printer.Canvas.Font := Memo1.Font;  {사용할 폰트를 지정한다. 여기서는 memo 내용을 출력하는 코드이므로 memo 폰트를 사용한다.}

    for Line := 0 to Memo1.Lines.Count - 1 do

      Writeln(PrintText, Memo1.Lines[Line]);            {메모에 있는 내용을 출력한다.}

    CloseFile(PrintText); {출력이 끝나면 해당 정보를 닫는다.}

  end;

 

l       참고

PrimaryKey 없는 RDB 사용할 있습니다. 하지만Primary Key 없으면 관계형 DB라고 없습니다. 왜냐구요? 관계형DB 테이블과 테이블과의 연관관계를 가질 있는 DB 형태를 가진 DB 관계형DB라고 합니다. Primary Key 없다면 NDB ISAM이라 부를 있겠지요?


) Quick Report 사용

 


QuickReport 델파이 3에서부터 기본적인 컴포넌트로 제공되는 컴포넌트로써 상당히 강력한 레포팅기능을 지원한다. 간단한 한페이지의 문서부터 다양한 형태의 그래프를 출력하는 레포트까지 쓰임새가 다양하다.

 

l       QuickReport컴포넌트

해당 Report 출력하려면 다음과 같습니다.

.QuickRep.Print;

.QuickRep.PreView; // 미리보기

 


컴포넌트는 Qreport 가장 기본적인 컴포넌트로 델파이의 폼을 레포트로 전환하여 줍니다. Report Setting 살펴보면 여러가지 기본적인 정보와 읽어낼 있는 프로퍼티를 확인할 있습니다.

 

l       참고

델파이의 QReport 도트프린터나 A4이외의 종이인경우 오동작하는 경우가 많았습니다. 해당 기종의 테스트를확인하신후에 출력이 정상적으로 이루어질 경우에 QReport 사용하시는 것이 좋습니다.

 

퀵레포트에서 자주사용되는 프로퍼티는 다음과 같다.

 

프로퍼티

내용

PageCount

출력되는 전체 페이지수

PageNumber

현재 출력되는 페이지번호

RecordNo

사용중인 레코드 번호

PageFrame

페이지의 여백

PaperSize

용지의 크기

ReportTitle

레포트의 제목

Orientation

출력방향 poPortait(세로), poLandscape(가로)

ShowProgress

출력진행상태 Progreee표시유무

PaperWidth

용지의

PaperLength

용지의 길이

Columns

컬럼의

 

이외에 Band 프로퍼티는 다음과 같다.

프로퍼티

내용

HasColumnHeader

각페이지에 Column부분을 사용한다

HasDetail

테이블의 정보를 모두 출력

HasPageFooter

아래 출력내용 설정

HasPageHeader

출력내용 설정

HasSummery

리포트끝에 한번만 출력

HasTime

보고서 시작부에 한번만 출력

 

l       QRBand

 

QRBand QReport에서 가장 많이 사용되는 Band 프로퍼티중에 BendType부분의 값을 조절함으로써 출력되는 곳의 위치를 지정할 있도록 한다.

 

프로퍼티

내용

ForceNewColumn

출력전에 새로운 열을 만든다

ForceNewPage

출력전에 새로운 페이지를 만든다

LinkBand

여러 개의 밴드를 페이지에 출력시에 일정한 여백을 갖도록 하고, 공간이 충분하면 링크된 밴드가 이어서 출력되게 한다. , 공간이 부족하면 새로운 라인에 출력한다.

hasChild

True시에 자동으로 Child 나타난다.

Frame

테두리의 사각형의 선을 그릴것인지 결정한다.

 

BandType

속성

내용

rbChild

다른밴드가 연결되어 있으면 연결된 밴드를 먼저출력하고 나중에 출력

rbColumnHeader

페이지의 윗부분에 나오게 한다

rbDetail

테이블 정보가 모두 출력

rbGroupFooter

테이블 정보 맨끝에 한번 출력

rbGroupHeader

테이블 정보 처음 한번 출력

rbOverlay

페이지 왼쪽 상단부터 출력

rbPageFooter

페이지 아래 출력

rbPageHeader

페이지 위에 출력

rbSubDatail

master/detail부분의 detail부분에 사용

rbSummary

마지막에 한번 합계 경우에 사용

rbTitle

시작부분에 한번 수행

 

 

 

l       QRSysData 컴포넌트

보통 레포트 출력시에 시간, 날짜등의 내용을 출력하는 컴포넌트. Data프로퍼티를 조절하면 다양한 속성을 사용할 있습니다.


qrsDate( 시스템 날짜, yy-mm-dd ), qrsDateTime( 날짜+시간출력 ), qrsDetailNo( 현재의 레코드번호 ), qrsPageNumber( 현재 출력 페이지 번호 ), qrsDetailCount( 출력될 레코드수 ), qrsReportTitle( 리포트의 제목으로 Qrerport ReportTitle 프로퍼티사용), qrsTime( 출력시의 시간설정 )

 

Text 들어 있는 내용은 Data에서 정의된 내용을 출력하기 전에 먼저 찍고, Data 프로퍼티에서 설정된 내용을 출력합니다.

 

l       QRGroup 컴포넌트

Report에서 마스터/디테일 형태의 레포트를 만드는 경우에 사용하는데

해당 프로퍼티를 참고하여 보면 FooterBand, HasChild, Master등의 프로퍼티가 눈에 띈다.  Master 프로퍼티의 내용을 받아와서 Footerband 만들어준다. 이때에 Expression 프로퍼
티를 참고하여 보면,

원하는 DataSet 필드에서 Function 거쳐서 값을 산출할 있다.

 

l       QRDB, QRLABEL 컴포넌트

 

QRLABEL 프린트되는 QReport 원하는 내용을 입력할 있는 Label이라고 생각하면 된다, QRDB DBLabel 동일하다, 해당 Band위에 올려놓고 DataSet Fields 연결하면 해당 내용을 보여준다.

 

l      
QRPreview

QReport 기본적인 Preview화면을 지원한다, 하지만 영문으로 나오고 모양이 그리 이쁘지 않다 이러한 Preview화면을 조정할 있다. 이런 지원은 QRPreview컴포넌트를 사용한다. 만들어진 Preview화면을 사용하려면 QRPreview Form으로 만들어진 화면을 등록하면 사용할 있다.

Posted by 나비:D
:

Java Applet이란?

 Java Applet은 HTML 문서 내에 포함되어 Java호환 웹 브라우저 상에서 수행되는 Java프로그램을 의미합니다. C나 JAVA로 만들어진 프로그램을 Application이라 하는데 이들을 웹 브라우저 상에서 실행되도록 만든 형태를 Applet이라고 보면 됩니다.


Java Servlet이란?

 Java Servlet은 웹 서버에서 실행되는 Binary 파일입니다. 즉, Java Applet이 웹 서벗에서 사용되는 형태를 Java Servlet이라고 보면 됩니다. 보다 정확하게 말하면 Java Servlet도 일종의 CGI이며, 기존 CGI의 여러 단점들을 보완하여 Java로 만든 것이 바로 Java Servlet입니다.



===> Java Applet은 Client의 웹 브라우저를 통해서 실행되므로 웹 브라우저가 Java를 지원해야 하며, 지원하는 웹 브라우저라도 Java를 얼마만큼 지원하느냐에 따라서 사용의 제한이 있습니다. 하지만 Java Servlet은 서버에서 실행되므로 Client의 웹 브라우저가 Java를 지원하는지, 또 얼마만큼 지원하는지 고려하지 않아도 됩니다.

 Java Servlet은 모든걸 실행하고나서 결과값만 HTML 형식으로 Client의 컴퓨터로 전송하므로 실행시킬 Binary 파일까지 다운로드 받아야 하는 Java Applet보다 상대적으로 속도가 더 빠릅니다.


** CGI [common gateway interface] : 사용자가 서버에게 웹페이지를 통한 요청이 있었을 때, 그것이 응용프로그램에 의해 처리 될 필요가 있다면 서버가 응용프로그램을 실행시키고 필요한 메시지를 받는다. 이 때 서버와 응용프로그램 사이에 데이터를 주고 받기 위한 표준화된 방법을 CGI라고 한다.

 공통 게이트웨이 인터페이스(common gateway interface)의 약어로, 웹서버와 외부 프로그램 사이에서 정보를 주고받는 방법이나 규약들을 말한다. 브라우저가 서버를 경유하여 데이터베이스 서버에 질의를 내는 등 대화형 웹페이지를 작성할 때 이용된다. 게이트웨이의 개발 언어로는 유닉스에서는 문자열 처리가 간단한 펄(perl), 윈도NT에서는 비주얼베이식(visual basic) 등이 사용되는 경우가 많다.
 외부 프로그램을 실행하는 표준 방식으로 자리잡았으며 사용이 편리하다는 장점이 있지만, 서버에서 많은 프로그램을 수행하므로 서버에 무리를 준다는 단점도 지니고 있다.

 

 

결론 : Java Applet , Java Servlet 모두 자바 프로그램들이다. 단지 전자는 Client에서 실행되고 후자는 Server에서 실행될 뿐이다.

Posted by 나비:D
:

BLOG main image
by 나비:D

공지사항

카테고리

분류 전체보기 (278)
Programming? (0)
---------------------------.. (0)
나비의삽질 (5)
Application (177)
SQL (51)
Web (27)
etc. (14)
Omnia (0)
---------------------------.. (0)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

달력

«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Total :
Today : Yesterday :