XnView 설치환경#

OS : Microsoft Windows XP Professional Service Pack 3

XnView : Windows용 XnView 버전 1.94.2 (http://www.xnview.com / http://www.xnview.org)

※본 페이에서는 한글 버전 위주로 설명

 

XnView를 이용한 다중 TIFF 만들기#

 

다중 페이지 제작 방법#

  1. XnView를 실행하여 [도구]-[만들기]-[다중 페이지 파일]을 실행      
    XnView-MakeTIF_01.gif
  2. "다중 페이지 만들기"창에서 <더하기...>버튼 클릭
    XnView-MakeTIF_02.gif
  3.  "파일을 선택"창에서 해당 파일 선택후 <더하기> 또는 <확인>을 눌러 추가 완료
    XnView-MakeTIF_03.gif
  4. "다중페이지 만들기" 창에서 <디렉토리> 선택
    XnView-MakeTIF_04.gif
  5.  "폴더 찾아보기" 창에서 해당 폴더 선택 또는 <새 폴더 만들기>를 이용하여 폴더 생성후 <확인>을 눌러 선택 완료
    XnView-MakeTIF_05.gif
  6.  "다중 페이지 만들기" 창에서 해당 <파일명> 입력후 <만들기> 클릭하여 생성 완료
    XnView-MakeTIF_06.gif
  7. 확인
    XnView-MakeTIF_07.gif

 

XnView를 이용한 다중 TIFF 자동 분할#

 

다중 페이지 자동 분할 방법#

  1. 해당 파일 로딩후 [도구]-[다중 페이지]-[지정하여 모두 추출...]을 선택
    XnView-SplitTIF_01.gif
  2. "다중 페이지 파일에서 페이지 추출" 창에서 디렉토리 선택
    XnView-SplitTIF_02.gif
  3. "폴더 찾아보기" 창에서 해당 폴더 선택 또는 <새 폴더 만들기> 후 <확인>을 눌러 선택
    XnView-SplitTIF_03.gif
  4. 다시 "다중 페이지 파일에서 페이지 추출" 창에서 파일형식 선택후 <확인>을 눌러 작업 완료
    XnView-SplitTIF_04.gif
  5. 결과
      XnView-SplitTIF_05.gif
  6.  

이 글은 스프링노트에서 작성되었습니다.



ORA-01991 에러 발생시#


발생조건#

 OraData\{SID}폴더만 복사해서 복구할경우


장애내용#

Startup 시 ORA-01991: invalid password file '...PWD{SID}.ora' 이러면서 해당 파일 경로가 나타남.

해결 방법#

>orapwd file={경로}\PWD{SID}.ora password={패스워드}


기타 참고사항#

관리자 모드 접근 방법#

ORACLE_SID 지정#

Windows

>SET ORACLE_SID={SID}

or

UNIX

>export ORACLE_SID={SID}

관리자 모드#

>SQLPLUS "/as sysdba"
or
-----------------------------------------------
>SQLPLUS /nolog
SQL>conn sys/{패스워드} as sysdba
----------------------------------------------
or
-----------------------------------------------
>SQLPLUS /nolog
SQL>conn as sysdba
사용자명 입력 : sys/{패스워드}


이 글은 스프링노트에서 작성되었습니다.

'DBMS > Oracle' 카테고리의 다른 글

ODP.NET 설치 안하고 클라이언트 배포  (0) 2012.07.13
Oracle XML 쿼리  (0) 2012.06.11
정렬 조건 부여  (0) 2008.07.16
오라클 접속 포트 고정시키기  (0) 2008.07.16
로그마이너  (0) 2008.07.16

 

MS-SQL 2005 관련 관리 툴들의 메뉴 한글 깨짐 현상#

 

설치환경#

OS : Microsoft Windows 2008 Standard Server with ServicePack 1 한글 x86 64Bit

DBMS : Microsoft SQL Server 2008 Standard 한글 x86 64Bit

H/W : HP DL380 G5

OS 설치 방법 : HP SmartStart v8.00으로 설치

 

오류사항#

 SQL Server 2005 설치 후 관리 툴인 Microsoft Server Management Studio와 SQL Server Business Intelligence Development Studio를 실행 시 한글 메뉴들의 깨짐 현상

SQLManagement_Error.jpg VisualStudio_Font_Error.jpg

 

장애 발생 요인#

 HP서버 구매시 OS설치 용도로 제공되는 HP SmartStart v8.0으로 설치시 초기 설치 모드는 한글이 지원되지 않아 영어로 설치한후 설치 완료후 한글로 설치를 마무리를 하는데 여기서 장애 발생 요인이 생긴다.

Windows2008Error_UTF8Charset_Eng.jpg

 

해결 방법#

 [시작]-[제어판]-[국가 및 언어 옵션]-<관리자 옵션>에서 "유니코드를 지원하지 않는 프로그램용 언어" 설정을 한국어(대한민국)으로 변경

Windows2008Modify_UTF8Charset_Eng2Kor.jpg 

 

 

결과#

해당 관리 툴들을 실행시켜보면 메뉴들이 정상적으로 보임(화면 캡쳐 이미지 첨부 생략)

 

 

이 글은 스프링노트에서 작성되었습니다.

 

MS-SQL 2008 설치시 Microsoft Windows 유니코드 언어 설정#

 

설치환경#

OS : Microsoft Windows 2008 Standard Server with ServicePack 1 한글 x86 64Bit

DBMS : Microsoft SQL Server 2008 Standard 한글 x86 64Bit

H/W : HP DL380 G5

OS 설치 방법 : HP SmartStart v8.00으로 설치

 

오류사항#

SQL Server 2008 설치시 설치 지원 규칙 체크중 성능 카운터 레지스트리 하이브 일관성 검사 실패

 

 MSSQL2008SetupError_PerfMonCounterNotCorruptedCheck.jpg

 MSSQL2008SetupErrorReport_PerfMonCounterNotCorruptedCheck.jpg

 

장애 발생 요인#

 HP서버 구매시 OS설치 용도로 제공되는 HP SmartStart v8.0으로 설치시 초기 설치 모드는 한글이 지원되지 않아 영어로 설치한후 설치 완료후 한글로 설치를 마무리를 하는데 여기서 장애 발생 요인이 생긴다.

MSSQL2008SetupError_UTF8Charset_Eng.jpg

 

해결 방법#

 [시작]-[제어판]-[국가 및 언어 옵션]-<관리자 옵션>에서 "유니코드를 지원하지 않는 프로그램용 언어" 설정을 한국어(대한민국)으로 변경

 MSSQL2008SetupModify_UTF8Charset_Eng2Kor.jpg

 

결과#

 MSSQL2008SetupResult_PerfMonCounterNotCorruptedCheck.jpg

이 글은 스프링노트에서 작성되었습니다.

  • IPConfig : 로컬 PC의 TCP/IP 관련 IP구성 점검
  • Ping [IP주소]: 네트워크 연결 여부 체크
  • net diag gui : NIC 진단도구 (Microsoft XP 이상)
  • tracert [IP주소] : IP 패킷이 목적지까지 도달하기 위해 거쳐가게되는 각 홉(hop)을 보여줌

이 글은 스프링노트에서 작성되었습니다.

 RPC 1918에서 라우팅 불가능 주소

  • 10.0.0.0 ~ 10.255.255.255
  • 172.16.0.0 ~ 172.31.255.255
  • 192.168.0.0 ~ 192.168.255.255

 

루프백 주소 : 127.0.0.1 

이 글은 스프링노트에서 작성되었습니다.

284의 약수의 합은 220

220의 약수의 합은 284

우애수

 

220 : 1 + 2 + 4 +5 + 10 + 11 + 20 + 22 + 44 + 55 + 110 = 284

220 = 142 + 71 + 4 + 2 + 1

 

천생연분이라는게 이런걸까 ^^;; 

이 글은 스프링노트에서 작성되었습니다.

'잡답' 카테고리의 다른 글

맘에 드는 게시판이 없는것 같다...  (3) 2009.01.06
강좌 만들기가 너무 귀찮아  (1) 2008.09.26
MS Project를 활용한 프로젝트 관리 실무  (0) 2008.07.23
구글 애드센스를 달아봤다  (0) 2008.07.18
자동차 수리  (0) 2008.07.17

아래 표처럼 테이블A과 테이블B의 C1의 값이 같을경우 테이블A의 C2값을 테이블B의 C2에 그대로 넣을 경우

구분 테이블A 테이블B
 C1 A A
 C2 StringValue NULL

UPDATE {테이블A} a,{테이블B} b SET b.C2 = a.C2 WHERE a.C1 = b.C1


이용 방법은 이외에도 무지 많을 것입니다.


※MySQL 4.0.4(?) 이상 버전에서 지원

이 글은 스프링노트에서 작성되었습니다.

  • 훈련과정 : MS Project를 활용한 프로젝트 관리 실무
  • 훈련기간 : 2008년 7월 21일 ~ 7월 22일 (2일 16시간)
  • 장      소 : 수원 아주대학교 중소기업인력개발센타
  • 강      사 : PM Office 남웅찬 대표이사(http://www.pmoffice.co.kr

양일간 교육을 받기 위해서 일요일날 23:15 기차를 타고 수원까지 올라갔다
도착해보니 새벽 4:30
(KTX 환승도 없고 해서 그냥 무궁화호 계속 타고갔다, 참고로 여긴 전남 여수)
일단 숙소를 잡아야 했다 9시부터 교육인데 지방에서 올라오다보니
짐이 있어서 짐이나 풀어놓고 갈려고 했다
역앞에 몇개의 모텔이 보였다...그런데 대학교 근처에 가면 모텔이 있겠지 하는 마음에
택시를 타고 대학교 앞으로 가서 숙소 잡을데 있냐고 기사분한테 여쭤봤더니
없단다 ^^;;
수원 택시기사님들은 목적지에 도착해야 말을 하더라 첨부터 없다고 하던지 타기 전에 애기했건만 ^^;;(후에 다시 한번 목적지 근처 모텔로 가자고 했더니 갤러리아(?) 백화점 근처 모텔있는데로 가자고 했더니 이분 역시 백화점에 다와서는 백화점 근처에는 모텔이 없단다... 건너편에 있다나 그러다가 다시 돌기위해서 백화점 뒤로 갔는데 모텔 2개 보이길레 거기 세워주라고 해서 들어갔다 하여간 수원 택시 기사들은 이상하다 촌놈들 왔다고 돈 좀 더 받을려고 그러나 ^^;;)
여기서 느낀건 우리 애들 아주대 간다고 하면 환영해야겠구나 하고 느꼈다 ㅋㅋ
주변에 모텔이 없는 학교라 ^^ 왠지 이미지가 업된것같다...나로써는 좀 황당하게 고생했지만...
우쨌거나 근처 찜질방 가서 시간때우고 잠좀 청했다(잠은 안왔다 ^^;;)

교육은 만족할 수준...^^ 이제 Project Server(EPM) 도입만 남은것 같다
돈도 많이들고 그럴것 같지만 툴에 대한 기대치가 상당히 높아졌다
해당 작업파트에도 강력추천했는데 도입후 맘에 안든다고 하면 어쩔지 두려움이 앞선다

여하튼 강사님 잘부탁합니다....^^ 저희 구축할때~

'잡답' 카테고리의 다른 글

강좌 만들기가 너무 귀찮아  (1) 2008.09.26
우애수  (0) 2008.08.13
구글 애드센스를 달아봤다  (0) 2008.07.18
자동차 수리  (0) 2008.07.17
처음으로 써보는 티스토리  (0) 2008.07.15

array_walk를 이용한 배열 함수


제가 사용하는 class로 만든 일부분 입니다. 그냥 봐보세요 ^^ 전 array_walk(php3,4,5지원/array_map는 php4.0.6이상)를 이용했습니다
아래 여기저기 조합한 것들이라 출처는 저도 기억이 나지 않습니다.
필요에 따라서는 수정한 부분도 있었던것 같고요 ^^

<?php
class Fun {
    /**
     * 배열값들의 앞뒤 공백 없애기
     * @Call $this->trimAll() : 재귀호출(자기자신 호출)
     * @Param &$array {array}
     * @Return $array {array} : &변수이므로 그값을 그대로 가짐(C의 포인터(?))
     */
    function trimAll(&$array) {
          if( is_array($array) ) {
              // class 일경우 array_walk ($array, array($this, 'trimAll'));
            array_walk ($array, array($this, 'trimAll'));
          } else {
            $array = trim($array);
          }
    }
    /**
     * 배열값 전체에 addslashes
     * @Call $this->addslashesAll() : 재귀호출(자기자신 호출)
     * @Param &$array {array}
     * @Return $array {array} : &변수이므로 그값을 그대로 가짐(C의 포인터(?))
     */
    function addslashesAll(&$array) {
        if (get_magic_quotes_gpc() == false){
            if(is_array($array)) {
                array_walk ($array, array($this, 'addslashesAll'));
            } else {
                $array = addslashes($array);
            }
        }
    }
     /**
     * 배열값 전체에 stripslashes
     * @Call $this->stripslashesAll() : 재귀호출(자기자신 호출)
     * @Param &$array {array}
     * @Return $array {array} : &변수이므로 그값을 그대로 가짐(C의 포인터(?))
     */
    function stripslashesAll(&$array) {
        if(is_array($array)) {
            array_walk ($array, array($this, 'stripslashesAll'));
        } else {
              $array = stripslashes($array);
        }
    }
    //EUC-KR(한글 코드페이지[949])을 UTF-8로
    function iconv_utf8All(&$array){
        if( is_array($array) ) {
              // class 일경우 array_walk ($array, array($this, 'trimAll'));
            array_walk ($array, array($this, 'iconv_utf8All'));
          } else {
            //$array = iconv($slang,$tlang,$array);
            if (iconv("UTF-8","UTF-8",$array) == $array) {
                $array = $array;
              } else {
                $array = iconv("CP949","UTF-8",$array);
              }

          }
    }
    //UTF-8을 EUC-KR(한글 코드페이지[949])로
    function iconv_CP949All(&$array){
        if( is_array($array) ) {
              // class 일경우 array_walk ($array, array($this, 'trimAll'));
            array_walk ($array, array($this, 'iconv_CP949All'));
          } else {
            //$array = iconv($slang,$tlang,$array);
            if (iconv("CP949","CP949",$array) == $array) {
                $array = $array;
              } else {
                $array = iconv("UTF-8","CP949",$array);
              }

          }
    }
}
?>

이 글은 스프링노트에서 작성되었습니다.

DBMS(OLE DB 공급자)별 Ado 데이터 연결 Provider

  •  Microsoft Jet 4.0 OLE DB Provider
    - Provider : Microsoft.Jet.OLEDB.4.0
  • Microsoft OLE DB Provider for ODBC Drivers
    - Provider : MSDASQL
  •  Microsoft OLE DB Provider for Oracle
    - Provider : MSDAORA
  •  Microsoft OLE DB Provider for SQL Server
    - Provider : SQLOLEDB
  •  Oracle Provider for OLE DB
    - Provider : OraOLEDB.Oracle

     

ex)

Provider={Provider};

User ID={UserID};

Password={UserPassword};

Data Source={Source or Database Host Name or Database Host IP};

Initial Catalog={Database Name};

Persist Security Info={True or False};

 

※ MS-SQL 2005 Express : Provider=SQLNCLI;Server=localhost\SQLExpress;Database=데이터베이스이름;UID=사용자아이디;PWD=비밀번호;

 

※ 내가 현재 쓰고 있는것만 넣었음... 추후 더 넣겠음

 

기타참조

이 글은 스프링노트에서 작성되었습니다.

구글 애드센스 일단은 맛배기 형식으로 달아봤는데
이게 수익 창출에 도움이 될려는지 모르겠다
과연 돈이 될까?
조금 지켜본뒤에 돈 되면 확대(?) 해볼까 생각만 한다 ㅎㅎ
방문자수가 많아야겠지만 적으면 접어버려야겠다...
돈 벌려면 컨텐츠를 잘 만들어갸 할것같기도 하고 ^^;;
돈벌기 힘들다

'잡답' 카테고리의 다른 글

강좌 만들기가 너무 귀찮아  (1) 2008.09.26
우애수  (0) 2008.08.13
MS Project를 활용한 프로젝트 관리 실무  (0) 2008.07.23
자동차 수리  (0) 2008.07.17
처음으로 써보는 티스토리  (0) 2008.07.15

어제 문제점 또하나 발견되었다. ^^;; 이런
그제 라디에이터가 깨져서 교체를 받았는데
냉각 팬이 안돈다 어제 보니 이런 X라질
라디에이터 갈때 봤으면 공임비와 시간 아낄수 있었잔아 ^^;;
교체 받았던데가 몇 안돼는 기술사 집이었다...
거리도 엄청 멀어서 택시타면 5,000원 나온다
(여긴 지방이라서 이정도면 먼 편이다 ^^;;)
그런데 가보니 이제막 대학생이나 고등학교 졸업했을만한 애들이
실습을 나왔는지 신참들인지 그애들이 보고 있었다
왠지 믿음이 안갔지만 사장님이 이것저것 보고 체크해준다고 하길레
믿었는데 ^^;;
여하튼 거기 안가고 집옆에서 고칠란다...만원 택시비라 생각하지뭐 ^^;;
여하튼 차에 너무 돈이 들어간다
이젠 타이어 교체다 ^^;;


애물단지 스펙

  • 차종 : 트라제 XG
  • 엔진 : LPG 2.7 V6
  • 년식 : 2000년
  • 연비 : 5.5L/Km(연비가 죽음이다) / 9.5L/Km(고속도로)

차 바꾸고 싶어도 돈이 없다 ^^;;

'잡답' 카테고리의 다른 글

강좌 만들기가 너무 귀찮아  (1) 2008.09.26
우애수  (0) 2008.08.13
MS Project를 활용한 프로젝트 관리 실무  (0) 2008.07.23
구글 애드센스를 달아봤다  (0) 2008.07.18
처음으로 써보는 티스토리  (0) 2008.07.15

 

INFO: Visual Basic용 Microsoft Consulting Services 명명 규칙

기술 자료 ID : 110264
마지막 검토 : 2007년 12월 26일 수요일
수정 : 1.1

요약

Visual Basic 코드에 대한 명명 규칙을 만드는 것이 좋습니다. 이 문서에서는 Microsoft Consulting Services(MCS)에 사용되는 명명 규칙을 제공합니다.

이 문서에 나오는 규칙은 Visual Basic "Programmer's Guide"에 있는 Visual Basic 코드 규칙의 상위 집합입니다.

참고: 이 문서에 나와 있는 타사 컨트롤은 Microsoft와 무관한 공급업체에서 제조한 것입니다. Microsoft는 이러한 컨트롤의 성능이나 신뢰성에 관하여 명시적이든 묵시적이든 어떠한 보증도 하지 않습니다.

위로 가기

추가 정보

명명 규칙은 Visual Basic 프로그래머가 다음과 같은 작업을 수행하는 데 도움이 됩니다.

응용 프로그램의 구조, 코딩 스타일 및 논리 표준화
정확하고 읽을 수 있으며 모호하지 않은 소스 코드 작성
다른 언어 규칙(특히, Visual Basic Programmers Guide 및 표준 Windows C 헝가리어 표기법)과의 일관성 유지
효율적인 문자열 크기 및 작업 관리를 통해 보다 길고 완전한 개체 이름 작성
위의 작업을 수행하는 데 필요한 최소 요구 사항 정의

위로 가기

환경 옵션 설정

Option Explicit를 사용합니다. 입력 오류(예: aUserNameTmp, sUserNameTmp, sUserNameTemp)를 줄여 프로그래밍 시간을 절약할 수 있도록 모든 변수를 선언합니다. 환경 옵션 대화 상자에서 변수 선언 요구를 예로 설정합니다. Option Explicit 문을 사용하려면 Visual Basic 프로그램에 있는 모든 변수를 선언해야 합니다. 파일을 ASCII 텍스트로 저장합니다. 폼(.FRM) 및 모듈(.BAS) 파일을 ASCII 텍스트로 저장하여 버전 제어 시스템의 사용을 용이하게 하고 디스크 손상으로 인해 발생할 수 있는 피해를 최소화합니다. 또한 다음을 수행할 수 있습니다.

사용자 고유의 편집기 사용
grep와 같은 자동화된 도구 사용
Visual Basic용 코드 생성 또는 CASE 도구 만들기
Visual Basic 코드의 외부 분석 수행
Visual Basic에서 파일을 항상 ASCII 텍스트로 저장하려면 환경 옵션 대화 상자에서 기본 저장 형식 옵션을 텍스트로 설정합니다.

위로 가기

표준 개체에 대한 개체 명명 규칙

다음 표에는 MCS 표준 개체 이름 접두사에 대한 정의가 나와 있습니다. 이러한 접두사는 Visual Basic Programmer's Guide에서 설명하는 접두사와 동일합니다.
접두사 개체 유형
ani 애니메이션 단추 aniMailBox
bed 펜 Bedit bedFirstName
cbo 콤보 상자 및 드롭다운 목록 상자 cboEnglish
chk 확인란 chkReadOnly
clp 그림 클립 clpToolbar
cmd(3d) 명령 단추(3D) cmdOk(cmd3dOk)
com 통신 comFax
ctr 컨트롤(해당 유형을 알 수 없는 경우) ctrCurrent
dat Data 컨트롤 datBiblio
dir 디렉터리 목록 상자 dirSource
dlg Common dialog 컨트롤 dlgFileOpen
drv 드라이브 목록 상자 drvTarget
fil 파일 목록 상자 filSource
frm frmEntry
fra(3d) 프레임(3d) fraStyle(fra3dStyle)
gau 계기 gauStatus
gpb 그룹 누름 단추 gpbChannel
gra 그래프 graRevenue
grd grdPrices
hed 펜 Hedit hedSignature
hsb 수평 스크롤 막대 hsbVolume
img 이미지 imgIcon
ink 펜 잉크 inkMap
key 키보드 키 상태 keyCaps
lbl 레이블 lblHelpMessage
lin linVertical
lst 목록 상자 lstPolicyCodes
mdi MDI 자식 폼 mdiNote
mpm MAPI 메시지 mpmSentMessage
mps MAPI 세션 mpsSession
mci MCI mciVideo
mnu 메뉴 mnuFileOpen
opt(3d) 옵션 단추(3d) optRed(opt3dRed)
ole OLE 컨트롤 oleWorksheet
out Outline 컨트롤 outOrgChart
pic 그림 picVGA
pnl3d 3d 패널 pnl3d
rpt Report 컨트롤 rptQtr1Earnings
shp Shape 컨트롤 shpCircle
spn Spin 컨트롤 spnPages
txt 입력란 txtLastName
tmr 타이머 tmrAlarm
vsb 수직 스크롤 막대 vsbRate

위로 가기

데이터베이스 개체에 대한 개체 명명 규칙

접두사 개체 유형
db ODBC 데이터베이스 dbAccounts
ds ODBC Dynaset 개체 dsSalesByRegion
fdc 필드 컬렉션 fdcCustomer
fd 필드 개체 fdAddress
ix 인덱스 개체 ixAge
ixc 인덱스 컬렉션 ixcNewAge
qd QueryDef 개체 qdSalesByRegion
qry(suffix) 쿼리(참고 참조) SalesByRegionQry
ss 스냅숏 개체 ssForecast
tb 테이블 개체 tbCustomer
td TableDef 개체 tdCustomers
참고: 쿼리에 접미사를 사용하면 Microsoft Access 대화 상자(예: 테이블 추가, 테이블 목록 표시 스냅숏)에서 각 쿼리를 관련 테이블과 정렬시킬 수 있습니다.

위로 가기

메뉴 명명 규칙

응용 프로그램은 종종 여러 개의 메뉴 컨트롤을 사용합니다. 따라서 이러한 컨트롤마다 각기 다른 명명 규칙 집합이 필요합니다. 메뉴 컨트롤 접두사는 mnu 레이블로 시작되고 각 중첩 수준에 부가 접두사가 추가되며 이름 문자열의 끝에는 최종 메뉴 캡션을 붙여서 확장됩니다. 예를 들면 다음과 같습니다.
메뉴 캡션 시퀀스 메뉴 처리기 이름
Help.Contents mnuHelpContents
File.Open mnuFileOpen
Format.Character mnuFormatCharacter
File.Send.Fax mnuFileSendFax
File.Send.Email mnuFileSendEmail
이 규칙을 사용하면 특정 메뉴 그룹의 모든 구성원이 코드 창과 속성 창의 개체 드롭다운 목록 상자에서 서로 옆에 표시됩니다. 또한 메뉴 컨트롤 이름에 자신과 연결된 메뉴 항목이 명시됩니다.

위로 가기

기타 컨트롤에 대한 명명 규칙

위에 나열되지 않은 새로운 컨트롤에는 3자의 고유한 접두사를 사용하는 것이 좋지만 분명하지 않을 경우 3자 이상의 접두사를 사용할 수 있습니다.

고급 목록 상자와 같은 파생 컨트롤은 실제로 사용 중인 컨트롤이 혼동되지 않도록 위의 접두사를 확장합니다. 일반적으로 제조업체를 나타내는 소문자 약어가 접두사에 추가됩니다. 예를 들어, Visual Basic Professional 3D 프레임에서 만든 컨트롤 인스턴스는 fra3d 접두사를 사용하여 실제로 사용 중인 컨트롤을 명확하게 나타낼 수 있으며, MicroHelp의 명령 단추는 cmdm을 사용하여 자신과 표준 명령 단추(cmd)가 구별되도록 할 수 있습니다.

위로 가기

타사 컨트롤

응용 프로그램에서 사용하는 각 타사 컨트롤은 다음과 같이 컨트롤에 사용된 접두사, 컨트롤의 전체 이름 및 소프트웨어 공급업체의 이름과 함께 응용 프로그램의 개요 주석 구역에 표시되어야 합니다.
접두사 컨트롤 유형 공급업체
cmdm 명령 단추 MicroHelp

위로 가기

변수 및 루틴 명명 규칙

변수 및 함수 이름은 <접두사><본문><수식어><접미사>와 같은 구조로 되어 있습니다.
부분 설명
<접두사> 변수의 사용법과 범위를 나타냅니다. iGetRecordNext
<본문> 변수를 나타냅니다. iGetNameFirst
<수식어> 변수의 파생물을 나타냅니다. iGetNameLast
<접미사> 선택적 Visual Basic 형식 문자입니다. iGetRecordNext%
접두사:

다음 표에는 Windows C 헝가리어 표기법을 기반으로 하는 변수 및 함수 이름 접두사에 대한 정의가 나와 있습니다. 이러한 접두사는 모든 변수 및 함수 이름과 함께 사용되어야 합니다. %, &, #, etc. 등의 이전 Basic 접미사는 사용하지 않는 것이 좋습니다.

변수 및 함수 이름 접두사:
접두사 수렴된 형태 변수 사용법 데이터 형식 접미사
b bln 부울 정수 %
c cur 통화 - 64비트 통화 @
d dbl Double - 64비트 Double #
    부호 있는 수량    
dt dat 날짜 및 시간 Variant
e err 오류    
f sng Float/Single - 32비트 Single !
    부호 있는    
    부동 소수점    
h   핸들 정수 %
i   인덱스 정수 %
l lng Long - 32비트 Long &
    부호 있는 수량    
n int 숫자/카운터 정수 %
s str 문자열 문자열 $
u   Unsigned - 16비트 Long &
    부호 없는 수량    
  udt 사용자 정의 형식    
vnt vnt Variant Variant  
a   배열    
참고: 수렴된 형태 열에 있는 값은 Visual Basic, Visual Basic for Applications 및 Access Basic에 대한 명명 표준을 가급적 모두 충족하도록 되어 있습니다. 이러한 접두사는 곧 Microsoft 표준이 될 예정입니다.

범위 및 사용법 접두사:
접두사 설명
g 전역
m 모듈 또는 폼에 로컬
st 정적 변수
(접두사 없음) 프로시저에 로컬인 비정적 변수, 접두사
v 값별로 전달되는 변수(루틴에 로컬)
r 참조별로 전달되는 변수(루틴에 로컬)
헝가리어 표기법은 C에서뿐만 아니라 Visual Basic에서도 중요합니다. Visual Basic 형식 접미사는 변수의 데이터 형식은 나타내지만 변수 또는 함수의 용도나 액세스 방법은 나타내지 않습니다. 예를 들면 다음과 같습니다.
iSend - 전송된 메시지 수를 나타냅니다.
bSend - 마지막 전송 작업의 성공을 나타내는 부울 플래그입니다.
hSend - Comm 인터페이스에 대한 핸들입니다.
이러한 각 변수 이름은 프로그래머에게 무언가 매우 다른 것을 알려줍니다. 이 정보는 변수 이름이 Send%로 줄어들면 손실됩니다. 또한 g와 m 같은 범위 접두사는 특히, 개발자가 여러 명 있는 환경에서 이름 경합 문제를 줄이는 데 도움이 됩니다.

헝가리어 표기법은 Windows C 프로그래머에 의해 널리 사용되고 있으며, Microsoft 제품 설명서와 업계 프로그래밍 서적에서 지속적으로 참조되고 있습니다. 또한 Visual C++ 개발 시스템이 널리 사용되기 시작하면서 C 프로그래머와 Visual Basic 프로그래머 간의 관계는 더욱 견고해질 전망입니다. 따라서 처음에는 많은 Visual Basic 프로그래머가 C로 이동하지만 나중에는 두 환경 사이를 빈번하게 왕래하는 프로그래머가 많아질 것입니다.

위로 가기

변수 및 루틴 이름의 본문

변수 또는 루틴 이름의 본문은 대/소문자를 혼용해야 하며 그 용도를 설명할 수 있을 만큼 길어야 합니다. 또한 함수 이름은 InitNameArray 또는 CloseDialog와 같이 동사로 시작되어야 합니다.

자주 사용되거나 긴 용어의 경우 표준 약어를 사용하여 이름 길이를 적절하게 유지하는 것이 좋습니다. 일반적으로 32자 이상의 변수 이름은 VGA 디스플레이에서 읽기 어려울 수 있습니다.

약어를 사용할 때는 전체 응용 프로그램에서 일관성을 유지해야 합니다. 예를 들어, 한 프로젝트 내에서 Cnt와 Count 사이를 임의로 전환하면 불필요한 혼동을 일으킬 수 있습니다.

위로 가기

변수 및 루틴 이름에 대한 수식어

관련 변수와 루틴은 종종 공통 개체를 관리하고 조작하는 데 사용됩니다. 이러한 경우 표준 수식어를 사용하여 파생 변수 및 루틴을 나타냅니다. sGetFirstName, sGetLastName 대신 sGetNameFirst, sGetNameLast를 사용하는 경우와 같이 이름 본문 뒤에 수식어를 붙이면 약간 어색하게 보이지만 Visual Basic 편집기 루틴 목록에서 이러한 이름을 정렬하는 데 도움이 됩니다. 따라서 응용 프로그램의 논리와 구조를 보다 쉽게 이해할 수 있습니다. 다음 표에는 일반 수식어 해당 표준 의미에 대한 정의가 나와 있습니다.
수식어 설명(본문 뒤에 나옴)
First 집합의 첫 번째 요소입니다.
Last 집합의 마지막 요소입니다.
Next 집합에 있는 다음 요소입니다.
Prev 집합에 있는 이전 요소입니다.
Cur 집합에 있는 현재 요소입니다.
Min 집합에 있는 최소값입니다.
Max 집합에 있는 최대값입니다.
Save 나중에 다시 설정해야 하는 또 다른 변수를 보관하는 데 사용됩니다.
Tmp 코드 내에서 해당 범위가 고도로 지역화된
  "스크래치" 변수입니다. 일반적으로 Tmp 변수의 값은 단일 프로시저 내에 있는
  일련의 인접 문에서만 유효합니다.
Src 원본입니다. 주로 루틴을 비교하고 전송하는 데 사용됩니다.
Dst 대상입니다. 주소 원본과 함께 사용됩니다.

위로 가기

사용자 정의 형식

기호 이름 뒤에 추가된 _TYPE을 사용하여 사용자 정의 형식을 모두 대문자로 선언합니다. 예를 들면 다음과 같습니다.
Type CUSTOMER_TYPE
      sName As String
      sState As String * 2
      lID as Long
   End Type
                                
사용자 정의 함수의 인스턴스 변수를 선언할 때는 변수 이름에 접두사를 추가하여 형식을 나타냅니다. 예를 들면 다음과 같습니다.
   Dim custNew as CUSTOMER_TYPE
                                

위로 가기

상수 명명 규칙

상수 이름의 본문은 단어 사이에 밑줄(_)이 있는 UPPER_CASE여야 합니다. 표준 Visual Basic 상수에는 헝가리어 정보가 포함되지 않지만 i, s, g 및 m과 같은 접두사는 상수의 값의 범위를 이해하는 데 매우 유용할 수 있습니다. 상수 이름은 변수와 동일한 규칙을 사용하여 지정합니다. 예를 들면 다음과 같습니다.
<mnUSER_LIST_MAX   ' Max entry limit for User list (integer value,
                     ' local to module)
   gsNEW_LINE        ' New Line character string (global to entire
                     ' application)
                                

위로 가기

Variant 데이터 형식

변수가 항상 특정 형식의 데이터를 저장한다는 것을 알고 있는 경우 해당 형식의 변수를 선언하면 Visual Basic에서 해당 데이터를 보다 효율적으로 처리할 수 있습니다.

그러나 데이터베이스, 메시지, DDE 또는 OLE 관련 작업을 수행할 때는 Variant 데이터 형식이 매우 유용할 수 있습니다. 대부분의 데이터베이스에서는 NULL을 유효한 필드 값으로 허용하므로 코드에서 NULL, 0(영) 및 ""(빈 문자열)을 구분해야 합니다. 일반적으로 이러한 작업에는 수신하는 데이터의 형식을 몰라도 해당 데이터의 처리 또는 전달이 가능한 일반 서비스 루틴이 사용될 수 있습니다. 예를 들면 다음과 같습니다.
   Sub ConvertNulls(rvntOrg As Variant, rvntSub As Variant)
      ' If rvntOrg = Null, replace the Null with rvntSub
      If IsNull(rvntOrg) Then rvntOrg = rvntSub
   End Sub
                                
그러나 Variant를 사용할 경우 몇 가지 단점이 있습니다. Variant를 사용하는 코드 문은 종종 프로그래머가 명확하게 이해하기 어려울 수 있습니다. 예를 들면 다음과 같습니다.
   vnt1 = "10.01" : vnt2 = 11 : vnt3 = "11" : vnt4 = "x4"
   vntResult = vnt1 + vnt2  ' Does vntResult = 21.01 or 10.0111?
   vntResult = vnt2 + vnt1  ' Does vntResult = 21.01 or 1110.01?
   vntResult = vnt1 + vnt3  ' Does vntResult = 21.01 or 10.0111?
   vntResult = vnt3 + vnt1  ' Does vntResult = 21.01 or 1110.01?
   vntResult = vnt2 + vnt4  ' Does vntResult = 11x4 or ERROR?
   vntResult = vnt3 + vnt4  ' Does vntResult = 11x4 or ERROR?
                                
위의 예에서 Visual Basic 형식 변환 루틴을 사용했다면 훨씬 덜 모호하고, 읽고 디버깅하고 유지 관리하기가 훨씬 더 쉬웠을 겁니다. 예를 들면 다음과 같습니다.
   iVar1 = 5 + val(sVar2)   ' use this (explicit conversion)
   vntVar1 = 5 + vntVar2    ' not this (implicit conversion)
                                

위로 가기

코드 주석 달기

모든 프로시저와 함수는 루틴의 기능적 특성(역할)을 설명하는 간단한 주석으로 시작되어야 합니다. 여기에는 구현 정보(작동 원리)가 포함되면 안 됩니다. 이것은 일반적으로 구현 정보가 시간이 지나면서 변하므로 불필요한 주석 유지 관리 작업을 유발하거나 심지어 주석이 잘못될 수도 있기 때문입니다. 구현에 대한 설명은 코드 자체와 필요한 경우 인라인 또는 로컬 주석에 나옵니다.

루틴에 전달되는 매개 변수에 대한 설명은 해당 함수가 분명하지 않고 매개 변수가 특정 범위에 위치해야 하는 경우에 필요합니다. 또한 각 루틴의 시작 부분에는 해당 루틴에 의해 변경되는(특히, 참조 함수를 통해 변경되는) 함수 반환 값과 전역 변수에 대한 설명이 나와 있어야 합니다.

루틴 헤더 주석 블록은 다음과 같아야 합니다(해당 예는 "코드 서식 지정" 절 참조).
구역 주석 설명
Purpose What the routine does (not how).
Inputs Each non-obvious parameter on a separate line with
in-line comments
Assumes List of each non-obvious external variable, control, open file,
and so on.
Returns Explanation of value returned for functions.
Effects List of each effected external variable, control, file, and
so on and the affect it has (only if this is not obvious)
모든 특수 변수 선언에는 선언되는 변수의 사용법을 설명하는 인라인 주석이 포함되어야 합니다.

변수, 컨트롤 및 루틴의 이름은 복잡하거나 비직관적인 구현 정보에만 인라인 주석이 필요하도록 명확하게 지정해야 합니다.

응용 프로그램, 열거형 주 데이터 개체, 루틴, 알고리즘, 대화 상자, 데이터베이스, 파일 시스템 등에 대한 개요는 프로젝트의 Visual Basic 일반 상수 선언이 포함된 .BAS 모듈의 시작 부분에 나와 있어야 합니다.

참고: 기본적으로 프로젝트 창에는 프로젝트에 있는 파일 목록이 표시되므로 이 개요 구역은 초기화(.INI) 또는 데이터베이스 파일과 같이 프로젝트 창에 표시되지 않는 파일이나 가장 중요한 파일과 모듈에 대한 정보를 제공할 때만 필요합니다.

위로 가기

코드 서식 지정

아직 많은 프로그래머가 VGA 디스플레이를 사용하므로 코드 서식에 논리 구조와 중첩이 반영되도록 하면서 화면 공간을 가능하면 많이 확보하는 것이 좋습니다.

표준, 탭 기반, 블록 중첩 들여쓰기에는 2~4개의 공백을 사용해야 합니다. 5개 이상의 공백은 불필요하며 이로 인해 문이 보이지 않거나 실수로 잘릴 수 있습니다. 2개 미만의 공백은 논리 중첩을 충분히 보여주지 않습니다. Microsoft 기술 자료 문서에는 3공백 들여쓰기가 사용됩니다. 환경 옵션 대화 상자를 사용하면 기본 탭 너비를 설정할 수 있습니다.

루틴의 기능을 설명하는 개요 주석에는 1공백 들여쓰기를 사용해야 합니다. 개요 주석 다음에 나오는 가장 높은 수준의 문은 한 탭을 들여써야 하고 이후의 각 중첩된 블록은 한 탭씩 추가로 들여써야 합니다. 예를 들면 다음과 같습니다.
**************************************************************************
'Purpose:   Locate first occurrence of a specified user in UserList array.
'Inputs:    rasUserList():  the list of users to be searched
'           rsTargetUser:   the name of the user to search for
'Returns:   the index of the first occurrence of the rsTargetUser
'           in the rasUserList array. If target user not found, return -1.
'**************************************************************************

'VB3Line: Enter the following lines as one line
Function iFindUser (rasUserList() As String, rsTargetUser as String) _
   As Integer
   Dim i As Integer           ' loop counter
   Dim bFound As Integer      ' target found flag
   iFindUser = -1
   i = 0
   While i <= Ubound(rasUserList) and Not bFound
      If rasUserList(i) = rsTargetUser Then
         bFound = True
         iFindUser = i
      End If
   Wend
End Function
                                
변수와 비일반 상수는 격리된 영역이나 특수 파일로 나누는 대신 함수별로 그룹화해야 합니다. HOURGLASS와 같은 Visual Basic 일반 상수는 단일 모듈(VB_STD.BAS)로 그룹화하여 응용 프로그램 관련 선언과 별도로 보관해야 합니다.

위로 가기

연산자

문자열을 연결할 때는 항상 앰퍼샌드(&)를 사용하고 숫자 값을 사용하여 작업할 때는 더하기 기호(+)를 사용합니다. 두 개의 Variant에 대한 연산을 수행할 때 숫자가 아닌 값에 더하기 기호(+)를 사용하면 문제가 발생할 수 있습니다. 예를 들면 다음과 같습니다.
   vntVar1 = "10.01"
   vntVar2 = 11
   vntResult = vntVar1 + vntVar2         ' vntResult =  21.01
   vntResult = vntVar1 & vntVar2         ' vntResult = 10.0111
                                

위로 가기

범위

변수는 가능하면 가장 작은 범위를 사용하여 정의해야 합니다. 전역 변수는 시스템을 매우 복잡하게 만들고 응용 프로그램의 논리를 이해하기 매우 어렵게 할 수 있습니다. 또한 전역 변수는 코드의 재사용과 유지 관리를 훨씬 더 어렵게 합니다. Visual Basic의 변수는 다음과 같은 범위를 가질 수 있습니다.
범위 변수 선언 위치 표시
프로시저 수준 이벤트 프로시저, sub 또는 변수가 선언된
함수 프로시저에
표시됨
폼 수준 및 폼 또는 코드 폼 또는 코드
모듈 수준 모듈(.FRM, .BAS)에 있는 모듈에 있는
선언 구역 모든 프로시저에
표시됨
전역 코드 모듈 항상 표시됨
(전역 키워드를 사용하는
.BAS)의 선언 구역
Visual Basic 응용 프로그램에서 폼 간에 데이터를 공유하는 다른 편리한 방법이 없을 경우에만 전역 변수를 사용합니다. 경우에 따라 form.object.property 구문을 사용하여 전역적으로 액세스할 수 있는 컨트롤의 태그 속성에 정보를 저장할 수도 있습니다.

전역 변수를 사용해야 하는 경우 단일 모듈에 모든 변수를 선언하고 함수별로 그룹화하는 것이 좋습니다. 모듈 이름으로는 GLOBAL.BAS와 같이 해당 용도를 나타내는 의미 있는 이름을 사용하십시오.

전달하면 안 되는 전역 변수를 제외하고 프로시저와 함수는 자신들에게 전달되는 개체만 처리해야 합니다. 루틴에 사용되는 전역 변수에 대한 설명은 루틴의 시작 부분에 있는 일반 주석 영역에 있어야 합니다. 또한 전달된 인수의 값을 명시적으로 변경하지 않으려는 경우 ByVal을 사용하여 sub와 함수에 해당 인수를 전달합니다.

가능한 한 항상 모듈별 모드를 작성합니다. 예를 들어, 응용 프로그램에서 대화 상자를 표시하는 경우 대화 상자 작업을 수행하는 데 필요한 모든 컨트롤과 코드를 단일 폼에 배치합니다. 이렇게 하면 응용 프로그램 코드를 유용한 구성 요소로 구성하고 런타임 오버헤드를 최소화하는 데 도움이 됩니다.

위로 가기

타사 컨트롤

참고: 아래에 나와 있는 제품은 Microsoft와 무관한 공급업체에서 제조한 것입니다. Microsoft는 이러한 제품의 성능이나 신뢰성에 관하여 명시적이든 묵시적이든 어떠한 보증도 하지 않습니다.

다음 표에는 컨트롤 접두사와 함께 사용할 표준 타사 공급업체 이름 접두사가 나와 있습니다.
공급업체 약어
MicroHelp(VBTools) m
Pioneer Software p
Crescent Software c
Sheridan Software s
기타 o
다음 표에는 표준 타사 컨트롤 접두사가 나와 있습니다.
컨트롤 컨트롤 약어 공급업체 VBX 파일
유형 이름 이름
경보 Alarm almm MicroHelp almmAlarm MHTI200.VBX
애니메이션 Animate anim MicroHelp animAnimate MHTI200.VBX
콜백 Callback calm MicroHelp calmCallback MHAD200.VBX
콤보 상자 DB_Combo cbop Pioneer cbopComboBox QEVBDBF.VBX
콤보 상자 SSCombo cbos Sheridan cbosComboBox SS3D2.VBX
확인란 DB_Check chkp Pioneer chkpCheckBox QEVBDBF.VBX
차트 Chart chtm MicroHelp chtmChart MHGR200.VBX
시계 Clock clkm MicroHelp clkmClock MHTI200.VBX
단추 Command cmdm MicroHelp cmdmCommandButton MHEN200.VBX
Button
단추 DB_Command cmdp Pioneer cmdpCommandButton QEVBDBF.VBX
단추(그룹) Command cmgm MicroHelp cmgmBtton MHGR200.VBX
Button
(multiple)
단추 Command cmim MicroHelp cmimCommandButton MHEN200.VBX
Button
(아이콘)
CardDeck CardDeck crdm MicroHelp crdmCard MHGR200.VBX
주사위 Dice dicm MicroHelp dicmDice MHGR200.VBX
목록 상자(드라이브) SSDir dirs Sheridan dirsDirList SS3D2.VBX
목록 상자(드라이브) SSDrive drvs Sheridan drvsDriveList SS3D2.VBX
목록 상자(파일) File List film MicroHelp filmFileList MHEN200.VBX
목록 상자(파일) SSFile fils Sheridan filsFileList SS3D2.VBX
대칭 이동 Flip flpm MicroHelp flpmButton MHEN200.VBX
스크롤 막대 Form Scroll fsrm MicroHelp fsrmFormScroll ???
계기 Gauge gagm MicroHelp gagmGauge MHGR200.VBX
그래프 Graph gpho Other gphoGraph XYGRAPH.VBX
Q_Grid grdp Pioneer grdpGrid QEVBDBF.VBX
스크롤 막대 Horizontal hsbm MicroHelp hsbmScroll MHEN200.VBX
Scroll Bar
스크롤 막대 DB_HScroll hsbp Pioneer hsbpScroll QEVBDBF.VBX
그래프 Histo hstm MicroHelp hstmHistograph MHGR200.VBX
숨김 Invisible invm MicroHelp invmInvisible MHGR200.VBX
목록 상자 Icon Tag itgm MicroHelp itgmListBox MHAD200.VBX
키 상태 Key State kstm MicroHelp kstmKeyState MHTI200.VBX
레이블 Label(3d) lblm MicroHelp lblmLabel MHEN200.VBX
Line linm MicroHelp linmLine MHGR200.VBX
목록 상자 DB_List lstp Pioneer lstpListBox QEVBDBF.VBX
목록 상자 SSList lsts Sheridan lstsListBox SS3D2.VBX
MDI 자식 MDI Control mdcm MicroHelp mdcmMDIChild ???
메뉴 SSMenu mnus Sheridan mnusMenu SS3D3.VBX
음영 Marque mrqm MicroHelp mrqmMarque MHTI200.VB
그림 OddPic odpm MicroHelp odpmPicture MHGR200.VBX
그림 Picture picm MicroHelp picmPicture MHGR200.VBX
그림 DB_Picture picp Pioneer picpPicture QEVBDBF.VBX
속성 뷰어 Property pvrm MicroHelp pvrmPropertyViewer MHPR200.VBX
Viewer
옵션(그룹) DB_RadioGroup radp Pioneer radqRadioGroup QEVBDBF.VBX
슬라이더 Slider sldm MicroHelp sldmSlider MHGR200.VBX
단추(스핀) Spinner spnm MicroHelp spnmSpinner MHEN200.VBX
스프레드시트 Spreadsheet sprm MicroHelp sprmSpreadsheet MHAD200.VBX
그림 Stretcher strm MicroHelp strmStretcher MHAD200.VBX
화면 보호기 Screen Saver svrm MicroHelp svrmSaver MHTI200.VBX
전환기 Switcher swtm MicroHelp swtmSwitcher ???
목록 상자 Tag tagm MicroHelp tagmListBox MHEN200.VBX
타이머 Timer tmrm MicroHelp tmrmTimer MHTI200.VBX
도구 모음 ToolBar tolm MicroHelp tolmToolBar MHAD200.VBX
목록 상자 Tree trem MicroHelp tremTree MHEN200.VBX
입력 상자 Input(Text) txtm MicroHelp inpmText MHEN200.VBX
입력 상자 DB_Text txtp Pioneer txtpText QEVBDBF.VBX
스크롤 막대 Vertical vsbm MicroHelp vsbmScroll MHEN200.VBX
Scroll Bar
스크롤 막대 DB_VScroll vsbp Pioneer vsbpScroll QEVBDBF.VBX




Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면 Microsoft 뉴스 그룹 (http://support.microsoft.com/newsgroups/default.aspx)에 참여하시기 바랍니다.

위로 가기


본 문서의 정보는 다음의 제품에 적용됩니다.
Microsoft Visual Basic 4.0 Standard Edition
Microsoft Visual Basic 4.0 Professional Edition
Microsoft Visual Basic 4.0 16-bit Enterprise Edition
Microsoft Visual Basic 4.0 32-Bit Enterprise Edition
Microsoft Visual Basic 2.0 Standard Edition
Microsoft Visual Basic 3.0 Professional Edition
Microsoft Visual Basic 2.0 Professional Edition

위로 가기

키워드: 
kbinfo kbtophit kbref kbprogramming kbdocs kb3rdparty KB110264

 

 

 

출처 : http://support.microsoft.com/kb/q110264/

이 글은 스프링노트에서 작성되었습니다.

 

델마당 코딩 표준

델파이 코딩 가이드 for 델마당 ( version 1.0 )

 

요약

 

본 문서는 델파이 코드 형식에 대한 Borland 표준 스타일 문서(링크)를 바탕으로 만들어졌다.

델마당 표준의 원칙은 소스에 포함된 논리를 보다 명확하게 표현하기 위함이다.

따라서 볼랜드 표준과는 다르게 스타일이 강요되지는 않으며,

누구나 코드를 이해하기 쉽고, 코드에 표현된 논리가 명확한 범위내에서 개인적인 취향에 따라 변경할 수 있음을 명시한다.

 

변경내역

 

최종작성: 2001년 09월 24일 godrm@netsgo.com

초고작성: 2001년 09월 05일 godrm@netsgo.com

 

목적

 

델파이의 오브젝트 파스칼 언어는 아름다울 정도로 잘 디자인된 언어이며, 가장 큰 장점중에 하나가 읽기 쉽다는 점이다.

본 표준의 목적은 이러한 델파이 - 오브젝트 파스칼 코드의 장점을 더욱 극대화시키는 데 있다.

많은 개발자들이 사용하는 방식을 종합단 간단한 표준 방식을 따른다면, 좀 더 보기 좋고 쉬운 코드가 생길 것이며

디버깅 주기나 유지보수 기간을 줄일 수 있고, 소스 코드의 값어치를 높일 수 있을 것이다.

 

물론 코딩 방식이나 개발 작업 스타일은 개발자 자신의 입맛에 따라 다른 문제이다.

그럼에도 불구하고 이렇게 코딩 표준 스타일을 준비하는 것은 나름의 방식이 옳고-그름을 따지자는 것이 아니라,

대부분의 개발자들이 사용하는 표준을 만들어 효율성을 높이자는 것이다.

인간은 표준을 따라 사용하면서 툴이 더 친숙해지며, 잘 쓰는 패턴들을 보다 빠르고 정확하게 인식하는 습성이 있다.

 

아마도 이러한 표준 방식이 낯설더라도 표준에 따라서 사용하다보면 편리함을 느끼게 될 것이다.

그래도 자신의 방식을 지키고자 하는 사람들은, 적어도 이 곳 델마당나 공유 자료로 올릴 경우에는

다른 사람들과의 공유 차원에서 범용적인 표준 방식을 사용했으면 한다.

 

라이센스

 

코딩 표준에 대한 라이센스 같은 것은 당연히 없다.

다만 본 문서 자체를 무단 배포하거나 복제해서 사용하면 안되고, 반드시 델마당에서 만든 표준 문서임을 밝혀야 한다.

 

차례

 

 

 

1. 기본구성

1.1 들여쓰기

블럭/레벨간의 확인가능하고 일정하게 지켜진다면, 들여쓰기에 대한 제약은 전혀 두지 않기로 한다.

단, 볼랜드 방식인 레벨마다 2칸의 탭간격을 추천한다.

 

특히 조건문이나 출력문의 내용이 길어져서 옆줄로 길어진 경우, 다음줄로 내려쓰고 들여쓰기하여 구분할 수 있도록 한다.

 

1.2 주석

기본적인 주석은 중괄호 { } 로 한다.

부수적으로 (* *) 방식은 개발중에 임시로 사용되는 주석 용도로만 사용한다.

// 방식 주석은 한 줄만 주석처리 할 때 사용하도록 한다.

 

유닛 파일 가장 위에는 다음과 같은 파일 헤더를 붙인다.

{***************************************************************}
{                                                               }
{  This line describes the purpose of the unit                  }
{                                                               }
{  Copyright (c) 2001 godrm@netsgo.com                          }
{                                                               }
{     All rights reserved.                                      }
{                                                               }
{***************************************************************}

 

1.3 컨디션 설정

오브젝트 파스칼 컴파일러 지시자에 사용되는 것과 마찬가지로 { } 로 컨티션 설정을 한다.

  if ... then
  begin
    {$IFDEF VER90}
      raise Exception.CreateRes(SError);
    {$ELSE}
      raise Exception.Create(SError);
    {$ENDIF VER90}
  end;

 

1.4 빈공간

한줄 띄우기(Blank Lines)는 저작권 주석이나, 패키지 선언, 클래스 선언, 메소드 선언들 사이에 한다.

다음의 경우에는 빈공간을 주지 않는다.

(1) 메소드 이름과 여는 괄호 사이

(2) .(점) 연산자 앞뒤

(3) 단항연사자와 연산값 사이

(4) 형변환을 위한 형과 변수

(5) 여는 소괄호 '(' 다음과 닫는 소괄호 ')' 앞

   단, ()안에서 함수가 들어갈 경우나 강조할 경우는 띄어써도 무방하다.

(6) 여는 대괄호 '[' 다음과 닫는 소괄호 ']' 앞

(7) 세미콜론 앞

 

  //CORRECT
  function TMyClass.MyFunc(var Value: Integer);
  MyPointer := @MyRecord;
  MyClass := TMyClass(MyPointer);
  MyInteger := MyIntegerArray[5];
  ShowMessage( IntToStr(MyInteger) );

 

  //INCORRECT
  function TMyClass.MyFunc( var Value: Integer ) ;
  MyPointer := @ MyRecord;
  MyClass := TMyClass ( MyPointer ) ;
  MyInteger := MyIntegerArray [ 5 ] ;

 

1.5 기타( 토큰 분리자, 연산자, begin-end )

대부분의 토큰 분리자나 연산자는 붙여쓰는 것을 원칙으로 한다.

단, 사칙연산( +, -, *, /, div, mod )와 부등호( >, <, = ) 그리고 대입연산자( := )는 띄어쓴다.

 

begin-end 는 같은 레벨에 맞춰 쓴다.

단, if-else 문과 사용되는 경우에는 예외를 둔다. (3.5장 (1)if문 참조)

  for I := 0 to 10 do begin // Incorrect, begin on same line as for
  for I := 0 to 10 do       // Correct, begin appears on a separate line
  begin

 

블럭문내의 마지막 명령줄의 생력가능한 세미콜론도 찍어주는 것을 원칙으로 한다.

begin
  MyStatement;
  MyNextStatement;
  MyLastStatement;   // semicolon optional
end;

 

2. 파일이름

파일이름에는 InfixCaps 혹은 Camel Caps 방식인 단어 첫 알파벳만 대문자를 쓰는 방식으로 한다.

단, 확장자는 소문자로 한다.

 

2.1 프로젝트 파일

프로젝트명은 될 수 있으면 프로젝트의 내용을 설명하도록 만들며,

정해진 프로젝트 코드명이 있을 경우에는 코드명을 사용한다.

 

2.2 폼 파일

폼 파일명은 기능별 혹은 구성별로 붙일 수 있는 기능성이름과 Form이라는 postfix를 사용한다.

( 실제로 폼의 .dfm 파일은 유닛 파일명을 저장할 때, 같은 이름으로 그대로 저장된다. )

유의사항: 폼 파일명은 디자인한 폼 클래스의 인스턴스명이 아니다.

폼의 인스턴스는 TForm 클래스명인 Form이라는 prefix를 붙인다. (3.8 인스턴스명 참조)

폼 설명

폼 파일명

About Form

AboutForm.dfm

Main Form

MainForm.dfm

 

2.3 유닛 파일

델파이 폼의 유닛 이름은 자동적으로 폼 파일과 같은 이름을 사용한다. (2.2 폼 파일이름 참조),

반면에 일반 유닛일 경우에는 Unit이라는 postfix를 사용한다.

단, C/C++의 헤더파일을 변환하는 경우에는 확장자를 제외한 파일명을 그대로 사용한다.

유닛 설명

유닛 파일명

About Form Unit

AboutForm.pas

Service Unit

ServiceUnit.pas

Windows.c

Windows.pas

 

2.4 데이터모듈 파일

데이터 모듈의 파일명에는 DM이라는 postfix를 사용한다.

DM 설명

DM 파일명

Client Data Module

ClientDM.dfm

Customer Data Module

CustomerDM.dfm

 

2.5 패키지 파일

패키지 파일명에는 구분할 수 있는 prefix에

디자인타임패키기와 런타임패키지를 구분할 수 있는 infix와

지원하는 델파이버전을 나타내기 위한 D4, D5, D6와 같은 postfix로 구성한다.

"iiilibvv.pkg" - design package

"iiistdvv.pkg" - runtime package

 

3. 오브젝트파스칼

3.1 예약어

모든 오브젝트파스칼 예약어는 소문자로 쓰도록 한다.

 

3.2 함수명

함수명은 동사(+목적어) 형태로 사용하며, 값을 가져오는 경우 Get, 값을 설정하는 경우 Set을 쓴다.

InfixCaps 방식을 사용한다.

  procedure ThisIsMuchMoreReadableRoutineName;

 

  procedure FormatHardDrive;

 

  procedure SetUserName;

 

  function GetUserName: string;

 

3.3 변수명

변수명은 명사 형태로 사용하며, InfixCaps 방식을 사용한다.

변수선언을 할 때는 같은 형끼리는 복수선언하며, 다른 형끼리는 단수선언만 한다.

델파이에서는 WIN32 형식인 헝가리언 표기법을 권장하지 않는다.

하지만, WIN32 API를 사용할 경우나, VisualStudio와 같은 다른 툴과의 연동을 위해서는 사용해도 무방하다.

  var
    nLoop, MyNumber: Integer; // Correct
    lpstrMyString: String; // Incorrect

 

클래스의 멤버 변수일 경우, F(Field) prefix를 주로 사용한다.

필요에 따라서 P(Pointer-포인터형변수), G(Global-전역변수), L(Local-지역변수), X(temp-임시변수), A(argument-함수파라미터)등의 prefix를 붙일 수 있다.

 

3.4 데이터타입

내부 테이터형은 소문자로 표기하며, WIN32 API 데이터형은 대문자로 표기한다.

  var
    MyString: string;  // reserved word
    WindowHandle: HWND; // Win32 API type
    I: Integer;         // type identifier introduced in System unit

 

열거형은 선언할 때는 T(Type) prefix를 붙이며, 열거형 내부 목록에는 열거형에 대한 구분자(혹은 약자)를 2-3글자 prefix로 붙인다. 

  TSongType = (stRock, stClassical, stCountry);

 

배열형의 경우에는 T prefix, Array postfix를 붙이며, 

또한 데이터의 포인터형은 P(Pointer) prefix를 덧붙인다.

  type
    PCycleArray = ^TCycleArray;
    TCycleArray = array[1..100] of Integer;

 

레코드의 경우에도 T prefix를 사용하며, 레코드 내부 변수에는 붙이지 않는다. 

  type
    PEmployee = ^TEmployee;
    TEmployee = record
      Name: string;
      Rate: Double;
    end;

 

3.5 구문

(1) if문

if문은 적어도 두 줄로 내려쓴다.

다만 수행문이 짧으면 한 줄로 써도 무방하다.

  // CORRECT
  if A < B then DoSomething; 
  
  // CORRECT
  if A < B then 
    DoSomething;

 

if-else문의 경우 소스의 논리 구조를 표현하는 수단이다.

각 논리 블록간의 관계가 명확하게 구분된다면, 자유로운 레벨간의 들여쓰기와 begin-end 표시가 허용된다.

그리고 특히 if문이 반복되서 길 게 사용될 경우 begin-end를 표시하여 범위를 명확하게 한다.

가능하면 if-else를 반복해서 사용하지 않도록 하며, 될 수 있으면 case문으로 구성한다.

  // INCORRECT
  if A < B then     
  if C < B then 
    DoSomething
  else if D < B then 
    DoSomething;
  // CORRECT
  if A < B then     
  begin 
    if C < B then 
      DoSomething;
  end
  else if D < B then 
    DoSomething;

 

if문안에 if문의 구조가 5단계이상 들어가지 않도록 코드를 간결화한다.

여러 조건들은 나열할 때는 왼쪽부터 빈도가 높고, 가능성이 높은 것을 선택한다.

  if Condition1 and Condition2 and Condition3 then

 

(2) case문

case문은 순서가 있는 데이터형에만 사용할 수 있다.

case-else문도 if-else와 같이 논리 블록간이 명확하게 구분되는 범위에서 들여쓰기가 허용된다.

 

if문과 마찬가지로 중요도와 빈도가 높은 것이 윗쪽에 있도록 한다.

각 case마다 4-5줄을 넘어가지 않도록 하며, 길어질 경우 따로 함수를 작성하도록 한다.

  // CORRECT
  case Control.Align of
    alLeft, alNone: NewRange := Max(NewRange, Position);
    alRight: Inc(AlignMargin, Control.Width);
  end;
 
  // CORRECT
  case x of
    csStart:
      begin
        j := UpdateValue;
      end;
    csBegin: x := j;
    csTimeOut:
      begin
        j := x;
        x := UpdateValue;
      end;
   end;
      
  // CORRECT
  case ScrollCode of
    SB_LINEUP, SB_LINEDOWN:
    begin
      Incr := FIncrement div FLineDiv;
      FinalIncr := FIncrement mod FLineDiv;
      Count := FLineDiv;
    end;
    SB_PAGEUP, SB_PAGEDOWN:
    begin
      Incr := FPageIncrement;
      FinalIncr := Incr mod FPageDiv;
      Incr := Incr div FPageDiv;
      Count := FPageDiv;
    end;
    else
      Count := 0;
      Incr := 0;
      FinalIncr := 0;
  end;
  
  // CORRECT (볼랜드 스타일)
  case ScrollCode of
    SB_LINEUP, SB_LINEDOWN:
      begin
        Incr := FIncrement div FLineDiv;
        FinalIncr := FIncrement mod FLineDiv;
        Count := FLineDiv;
      end;
    SB_PAGEUP, SB_PAGEDOWN:
      begin
        Incr := FPageIncrement;
        FinalIncr := Incr mod FPageDiv;
        Incr := Incr div FPageDiv;
        Count := FPageDiv;
      end;
  else
    Count := 0;
    Incr := 0;
    FinalIncr := 0;
  end;  

  

(3) while문 (repeat문)

while문에서는 가능하면 루프중에 빠지지않고, loop조건으로만 종료되도록 구성한다.

 // INCORRECT
  while x < j  do begin
    DoSomething; 
    DoSomethingElse;
  end;
  // CORRECT
  while x < j do 
  begin
    DoSomething; 
    DoSomethingElse;
  end;
  
  // CORRECT
  repeat
    x := j;
    j := UpdateValue;
  until j > 25;
  

 

(4) for문

만약 1씩 증가가 아닌 경우라면, while문을 이용해서 마지막값부터 거꾸로 루프를 돌도록 한다.

  // INCORRECT
  for i := 0 to 10 do begin
    DoSomething; 
    DoSomethingElse;
  end;
  
  // CORRECT
  for i := 0 to 10 do 
  begin
    DoSomething; 
    DoSomethingElse;
  end;
  
  // CORRECT
  i := AList.Count-1;
  while i => 0 do
    i := i - 2;

 

(5) with문

with문을 사용할 경우에는 복수객체나 구조체를 참조하지 않도록 주의하며,

같은 이름의 다른 객체의 프로퍼티나 메소드를 참조하지 않는지 확인해야 한다.

  with Record1, Record2 do

 

3.6 에러처리구문

에러처리 (Exception Handling)는 에러 복구와 리소스 보호의 역할을 한다.

 

(1) try..finally

되도록 각 동적할당마다 try..finally 구문을 사용하여 예외사항에 대비한다.

다음의 예제는 동적할당된 클래스를 참조할 때, 예외가 발생할 수 있는 숨겨진 버그가 있다.

  SomeClass1 := TSomeClass.Create
  SomeClass2 := TSomeClass.Create;
  try
    { do some code }
  finally
    SomeClass1.Free;
    SomeClass2.Free;
  end;

 

다음의 예제는 숨겨진 버그를 없애는 올바른 방법이다.

  SomeClass1 := TSomeClass.Create
  try
    SomeClass2 := TSomeClass.Create;
    try
      { do some code }
    finally
      SomeClass2.Free;
    end;
  finally
    SomeClass1.Free;
  end;

 

(2) try..except

특정 예외 사항이 발생했을 때의 행동을 위해 사용한다.

  // Correct
  try
    try
      EnumThreadWindows(CurrentThreadID, @Disable, 0);
      Result := TaskWindowList;
    except
      EnableTaskWindows(TaskWindowList);
      raise;
    end;
  finally
    TaskWindowList := SaveWindowList;
    TaskActiveWindow := SaveActiveWindow;
  end;

 

(3) try..except..else

혹시 처리되지 않는 에러을 위해서는 else 구문을 사용한다.

 

3.7 클래스명

클래스의 Access Level은 Private, Protected, Public, Published 순으로 낮으며,

데이터는 될 수 있으면 Public 레벨을 사용하지 않고, Private 레벨을 사용하면서 Access Method를 활용한다.

클래스명은 T(Type) prefix를 붙이고 기능/목적상의 이름을 붙인다.

 

3.8 인스턴스명

클래스의 인스턴스명은 클래스명을 앞에 붙이고, 기능/목적상의 이름을 붙인다.

  예) FormMain, FormAbout, ButtonShowList , ButtonLoadImage

단, 유사한 기능의 클래스는 같은 클래스로 묶어도 무방하다

  예) TButton과 TSpeedButton의 예

강조를 위해서나, 뒤에 붙는 이름과 특별히 구분이 필요할 경우에는 '_' 를 넣어도 된다.

  예) FormMain, Form_About, Button_SaveToFile , Button_LoadFromFile

 

3.9 인터페이스

클래스와 같은 방식으로 선언하도록 한다.

 

자료정리 : 김정(고드름)

 

출처 : http://www.delmadang.com/community/bbs_view.asp?bbsNo=23&amp;bbsCat=50&amp;indx=399176

이 글은 스프링노트에서 작성되었습니다.

+ Recent posts