이 자료는 지적재산권 보호를 받습니다.

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

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

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

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

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

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

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

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

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

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

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

이용 불가함을 알립니다.

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

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
:
델마당 팁란에서 타락천사님의 글을 퍼온 검미다.

[팁] 코딩 표준 문서

안녕하세여..타락임다..^^

이것 역시 기초적인 겁니다. 전 다덜 저같이 하고 있을 거라고 생각했었는데......ㅠㅠ

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
:

BLOG main image
by 나비:D

공지사항

카테고리

분류 전체보기 (278)
Programming? (0)
---------------------------.. (0)
나비의삽질 (5)
Application (177)
SQL (51)
Web (27)
etc. (14)
Omnia (0)
---------------------------.. (0)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

달력

«   2024/03   »
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
31
Total :
Today : Yesterday :