C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[11791] 클리퍼(Clipper)를 아시나요?
주정섭 [jjsverylong] 3150 읽음    2006-05-23 19:00
클리퍼라는 개발 툴을 아시는가? 예전 도스 시대에 매우 유명했던 이툴의 개발 생산성은 가히 혁신적이었다. 90년대 초반에 이 클리퍼란 툴은 나의 주요한 밥벌이 수단이었다. 예전 프로그램의 유지 보수 때문에 과거에 내가 만들었던 클리퍼 소스 프로그램을 새로 볼일이 생겼는데, 자화자찬일지는 몰라도 지금봐도 너무 훌륭하다. 이 소스는 90년대 초반에 만든 것으로 기억되는데, 그 당시 클리퍼는 이미 미약하지만 객체지향을 지원하고 있었다. 그리고 Class(Y)라는 서드파티 툴을 덧붙이면 거의 완벽한 객체지향 코딩이 가능한 툴이었다.

구석기 시대의 소스이지만, 과거의 영광(?)을 기리고자, 그 소스 일부를 소개해 보고자 한다. 다음 소스는 클리퍼로 작성한 메인 메뉴를 만드는 부분의 소스이다. 참고로 local은 파스칼의 var와 같으며 : 은 . 과 같다고 이해하면 된다.

------------------------------------------------------------------------------------------------
메인 메뉴 작성 부분
------------------------------------------------------------------------------------------------

Local pull := PullDown():New() // 객체 정의 부분

// 메인 메뉴 등록
pull:addTitle("자료관리")   
// 하위 메뉴 등록 부분. 타이틀과 메뉴 선택시 실행할 함수 등록    
    pull:addItem("1>전화번호 관리", {|| Phone() }, 0, .t.)
    pull:addItem("2>단체/조직 관리", {|| Social() }, 0, .t.)
    pull:addItem("3>기타전화번호부", {|| Public() }, 0, .t.)
pull:addTitle("결과분석")
    pull:addItem("1>개별 결과 열람", {|| Result(1)}, 0, .t.)
    pull:addItem("2>단체 결과 열람", {|| Result(2)}, 0, .t.)
pull:addTitle("기초자료")
    pull:addItem("1>기 본 값 설 정", {|| SetUP()  }, 0, .t.)
    pull:addItem("2>모뎀 자동 찾기", {|| ModemFind()  }, 0, .t.)
//    pull:addItem("6>날자 시간 설정", {|| SetDos() }, 0, .t.)
pull:addTitle("화일관리")
    pull:addItem("1>작업종료(@x)", {|| Quit() })
    pull:addItem("2>색 인 갱 신 ", {|| MakeIndex() })
    pull:addItem("3>자 료 정 리 ", {|| .t. })
  pull:addItem("1>위치 지우기 ", {|| ClearData() } )
  pull:addItem("2>화일 비우기 ", {|| FileMake() } )

// 메인 화면을 그리고
MainScr()
// 풀다운 메뉴 두번째를 선택한 상태에서 구동시킨다.
pull:setpos(2):run()

당시 이 프로그램은 마우스를 완벽히 지원했다. 도스 시절에 마우스 기능을 지원하려면 상당한 노가다 코딩이 수반되는데, 객체지향은 그러한 노가다 코딩을 전면부 즉 어플 코드 쪽에서는 완벽히 배제시킨다. 객체지향의 뛰어난 점인 전면부 코드를 간결하게 하는 것이다. 모든 마우스 처리 작업은 델파이의 VCL이 그러하듯이 클래스 라이브러리 쪽으로 모조리 숨겨져 있다. 실제 어플 개발자는 마우스 처리에 대해서 전혀 신경을 쓰지 않아도 되는 것이다.

예전 클리퍼 방식의 소스를 델파이를 개발하면서도 종종 적용해보는데, 클리퍼에는 코드블럭이라고 해서, 간단한 인라인 함수를 만드는 기능이 있었지만, 델파이에는 이 기능이 없다. 이 때문에 위와 같은 방식의 코드가 델파이에서는 불가능하다. 위 소스에서 {|| Result(1)}, 0, .t.) 같은 부분이 코드 블럭이다.


------------------------------------------------------------------------------------------------
버튼 즉 툴바 작성 부분
------------------------------------------------------------------------------------------------

이미 윈도우 3.1이 유행했던 그 시절은 윈도우 GUI를 도스 프로그램들이 많이 흉내내는 시기였다. 다음 소스는 툴바 기능을 흉내내는 부분이다. 화면 하단에 버튼들을 표시하고, 클릭시 할 일과 단축키를 설정하는 소스 부분이다.

InitButton()

AddButton("?:전화걸기", { || Dialit(what), br:refreshcurrent():down() }, K_ENTER)
AddButton("Space:개인정보", { || BigoView(what), br:down():refreshAll() }, 32)
AddButton("F8:지역설정",    { || GetRegion(br, what)}, K_F8)
AddButton("F9:우편번호넣기",  { || Fillzip(br)}, K_F9)

ShowButton()

------------------------------------------------------------------------------------------------
작업 윈도우 처리 부분
------------------------------------------------------------------------------------------------

도스에서 윈도우 기능, 즉 화면 중첩 기능은 상당히 노가다스런 부분인데, 이를 당시에 객체지향 방식으로 처리하는 부분이다.

// 윈도우 객체 생성
Local win := Window():New(title, 3, ,64, 14, , 2)

win:show()

@ win, 1, 1 say "이    름" get name // when {||MKEYMODE(1), .t.}
@ win, 2, 1 say "주민등록" get jumin picture "@r 999999-9999999"
@ win, 3, 1 say "우편번호" get zip picture "@r 999-999"
@ win, 4, 1 say "주소" get sigu
@ win, 5, 1 say "자택전화" get telno
@ win, 6, 1 say "직장전화" get jiktel
@ win, 7, 1 say "팩스번호" get faxno
@ win, 8, 1 say "삐삐" get pipino picture "@r 999-999-9999"
@ win, 9, 1 say "핸드폰" get handphone picture "@r 999-999-9999"

// 가로줄 삽입
win:sepline(7)

위 코드에서 "@ win, 행번호, 열번호 say .. get ..." 이라는 부분이 반복되는데, 윈도우 객체인 win의 좌상단 좌표를 기준한 상대좌표에서 say 다음의 문자열을 표시하고 그 옆에서 입력박스를 표시하고 자료를 입력받는 부분이다. 델파이로 치면 Label을 표시하고 그 옆에 Edit 박스를 표시하는 것과 동일하다고 할 수 있겠다. picture는 델파이로 치면 EditMask와 같은 역할을 한다.

클리퍼는 당시에 개발자 정의 명령어 기능을 지원했었다. 이는 C로 치면 #define으로 정의한 유사함수나 유사 명령어와 비슷하지만, 훨씬 더 기능이 막강하다. "@ win, 1, 1 say ..." 도 이런 개발자 정의 명령이다. 즉 임의의 문법으로 새로운 명령문을 추가할 수 있었는데 델파이를 쓰면서 내가 매우 아쉬워하는 기능이기도 하다.

당시 클리퍼 개발자들을 추모(?)하면서, 지금도 델파이를 클리퍼처럼 개발할 수 있다면 참으로 좋지 않을까 아쉬워하면서 이글을 마친다.
Team B [teamb]   2006-05-24 10:04 X
클리퍼의 TBrowse 와 Get, Say 시스템(클래스?)은 정말 환상이였죠. 파헤치면 파헤칠수록 새로운 묘미가...^^ 이때는 객체지향이 먼지도 모르고 이 둘 시스템을 수정하면서 객체지향을 쓴거 같군요..
uwaaa1 [uwaaa1]   2024-10-31 00:54 X
안녕하세요.
초면에 뜬금없이 질문드려 미안합니다.
클리퍼 초보입니다.

다어얼로그에 몇 개의 get 이 있는데, 한글로 하나의 get 을 타이핑하고 다음 또는 다른 get 으로 옮겨갈 때 마우스로 클릭하여 옮겨가면 방금 타이핑한 get의 마지막 한 글자가 없어져 버립니다.
"아름답다" 를 타이핑했다면 "아름답" 만 남고 "다"는 사라져 버리는 겁니다.
영문으로 타이핑하면 괜찮습니다.
그리고 탭키나 아래방향키로 옮겨가도 괜찮습니다.
마우스로 다른 get을 클릭할 때만 마지막 한 글자가 사라져 버립니다.

REDEFINE GET   oBname   VAR      cBNAME      ID 240  OF IPDLG

혹시 이런 경험이 있으시면 코멘트 좀 부탁드려 봅니다.

감사합니다.

+ -

관련 글 리스트
11791 클리퍼(Clipper)를 아시나요? 주정섭 3150 2006/05/23
11795     Re:클리퍼(Clipper)를 아시나요? civilian,안영제 2232 2006/05/23
11793     오.. 클리퍼... 박지훈.임프 4703 2006/05/23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.