CLASS OF DLL
TcBrowse
명령어 설명

독립 브라우즈는 FiveWin의 모든 브라우즈 기능을 지원하며, 그 외에 다양한 기능을 가지고 있습니다. 브라우즈 구현 시 가능하면 FiveWin의 LIST BOX를 이용하지 말고 이 브라우즈 시스템의 사용을 권장합니다,

REDEFINE [ COLUMN ] BROWSE  <oBrw>  					;
            [<Flds,...>] 								;
            [ ALIAS <cAlias> ] 						;
            [ ID <nId> ] 							;
            [ <dlg:OF,DIALOG> <oDlg> ] 					;
            [ <sizes:FIELDSIZES, SIZES, COLSIZES> <aColSizes,...> ] 		;
            [ <head:HEAD,HEADER,HEADERS> <aHeaders,...> ] 		;
            [ SELECT <cField> FOR <uValue1> [ TO <uValue2> ] ] 		;
            [ <change: ON CHANGE, ON CLICK> <uChange> ] 			;
            [ ON [ LEFT ] DBLCLICK <uLDblClick> ] 				;
            [ ON RIGHT CLICK <uRClick> ] 					;
            [ FONT <oFont> ]							;
            [ CURSOR <oCursor> ] 						;
            [ <color: COLOR, COLORS> <nClrFore> [,<nClrBack>] ] 		;
            [ MESSAGE <cMsg> ] 						;
            [ <update: UPDATE> ] 						;
            [ WHEN <uWhen> ] 						;
            [ VALID <uValid> ]
oBrw 		브라우즈 객체명
Flds 		필드명 배열
cAlias 		DBF파일 알리아스 명
nId 			ID
oDlg		브라우즈가 그려질 다이얼로그 객체명
aColSizes 	각 칼럼의 폭 길이 배열
aHeaders	각 칼럼 헤더 타이틀명 배열
cField		SELECT <cField> FOR ... TO ...
uValue1		SELECT ... FOR <uValue1>  TO ...
uValue2		SELECT ... FOR ... TO <uValue2> 
uChange		선택바 이동 시 수행할 행동
uLDblClick	더블클릭 시 수행할 행동
uRClick		마우스 오른쪽 버튼을 누를 때 수행할 행동
oFont		텍스트를 표시하는 데 사용되는 폰트 객체
oCursor		브라우즈 상의 마우스 커서
nClrFore		브라우즈 문자 색상값
nClrBack		브라우즈 배경 색상값
cMsg		메시지 내용
UPDATE	<oDlg:Upstable()>를 수행할 때 자동으로 :Refresh()됨
uWhen		when 조건, 이 컨트롤을 가능/불가능하게 하는 데 필요한 코드블럭
uValid		valid 조건, 이 콘트롤을 끝내는 데 필요한 코드블럭
DATA
lFoot		FOOTER 지정 여부
nClrFootFore	FOOTER 글자 색상
nClrFootBack	FOOTER 배경 색상
nShadowHead	헤더의 셰도우 효과
nStClr		헤더 색상의 시작 색상
nEndClr		헤더 색상의 끝 색상
nSpeed		그라데이션 농도
nFadeMode	그라데이션 모양
aColumns	정의된 모든 칼럼 객체를 가지고 있는배열
aArray		브라우즈 될 배열
lNoHScroll	수평 스크롤 바 표시 여부
lNoVScroll	수직 스크롤 바 표시 여부
lNoLiteBar	라이트 바 표시 여부
lNoGrayBar	그레이 바 표시 여부
lLogicDrop	논리적인 드롭 여부
nAdjColumn	칼럼에 맞게 재조정
lRePaint		재 페인트 될지 여부
nFreeze		Freeze 칼럼 번호
lColDrag		칼럼 드래그 가능 여부
lLineDrag	라인 드래그 가능 여부
nDragCol	드래그 칼럼 수
lAutoCtx		자동 콘텍스트 여부
hBmpCursor	비트맵 커서의 핸들
bSeekChange	찾기 후 바꾸는 블럭
cSeek		찾기 문자열
nColOrder	칼럼 오더 번호
nClrForeHead	머리말의 전경색
nClrBackHead	머리말의 배경색
bHeadClick 	헤더가 눌려졌을 때 수행할 행동	
lNoteStyle	레코그 사이에 라인대신 컬러를 사용하여 구분 여부
aNoteColors	Note 스타일에서 컬러

예) oBrw:aNoteColors := { { CLR_BLACK, CLR_WHITE }, ;

             { CLR_BLACK, nRGB( 235, 255, 255 ) }}

METHOD
GoDown()	아래로 이동
GoUp()		위로 이동
LButtonDown   	마우스 좌측 버튼을 눌렸을 때 행동
			LButtonDown(nRowPix, nColPix, nKeyFlags)
LButtonUp	마우스 좌측 버튼을 놓았을 때 행동
			LButtonUp( nRowPix, nColPix, nKeyFlags )
LDblClick	마우스 좌측 버튼을 더블클릭 했을 때 행동
			LDblClick( nRowPix, nColPix, nKeyFlags ) 	
MouseMove	마우스 이동시 행동
			MouseMove( nRowPix, nColPix, nKeyFlags )	
lEditCol		칼럼 편집
			lEditCol( nCol, uVar, cPicture, bValid, nClrFore, nClrBack, cMsg, cError )
CSeek		찾기에 의해 이동
			Seek( nKey )	
PageUp		한 페이지 이전으로 이동
			PageUp(nLines)
PageDown 	다음 페이지로 이동
			PageDown(nLines)
KeyChar		키를 눌렀을 때의 수행 행동
			KeyChar( nKey, nFlags )	
Report		브라우즈 형태로 리포트 출력
			Report( cTitle, lPreview )	
Reset()		객체 재정의
ResetBarPos()	바의 위치 재정의
SetArray		배열의 지정
			SetArray( aArray )
VerLine 		칼럼의 수직 크기 조정
			VerLine( nColPos, nColInit )
AddColumn	칼럼의 추가
			AddColumn( oColumn )
SwichCols	칼럼의 스위칭
			SwichCols( nCol1, nCol2)	
Exchange	칼럼의 자리 교환
			Exchange( nCol1, nCol2)	
SetHeadBmp 	브라우즈 헤드 배경을 BMP로 그려준다.
			SetHeadBmp ( cBmpOrResName )
SLineStyle 	각 라인 사이의 선을 바꾸어 그린다.
			SLineStyle ( nLineStyle )
RefreshCurrent()	현재의 Row만 다시 그린다.
RefreshHeader() 	헤더만 다시 그린다.
nRowCount() 	헤더와 풋터를 제외한 데이터 열 수
BrwGoBottom( nMinus )	브라우즈의 맨 마지막을 기준으로 가득 차게 그려준다.
			nMinus만큼 레코드 여백을 남긴다.
SetBkGrdClr	헤더의 형태, 칼라, 농도, 제목칼라, 그림자 칼라를 지정한다.
			SetBkGrdClr( nFadeMode, nColor, nBkBmpSpeed, nTextClr, nShadowClr )
nFadeMode
1 좌에서 우로 여리게
2 좌에서 우로 진하게
3 상에서 하로 여리게
4 상에서 하로 진하게
5 좌.우는 진하고 가운데는 여리게
6 좌.우는 여리고 가운데는 진하게
7 상.하는 진하고 가운데는 여리게
8 상.하는 여리고 가운데는 진하게
9 가운데는 여리고 상.하.좌.우는 진하게
10 가운데는 진하고 상.하.좌.우는 여리게
nColor (색상표)
1 RED 11 DGREEN 21 LVIOLET
2 ORANGE 12 DBLUE 22 BLACK
3 YELLOW 13 DCYAN 50  
4 GREEN 14 DVIOLET 100  
5 BLUE 15 LRED   
6 CYAN 16 LORANGE   
7 VIOLET 17 LYELLOW   
8 DRED 18 LGREEN   
9 DORANGE 19 LBLUE   
10 DYELLOW 20 LCYAN   

<nBkBmpSpeed>

농도를 나타낸다. 1이 가장 미세하고 숫자가 클수록 거칠어진다.

 

SetAutoScroll(lLogic) 선택바 이동시 스크롤바의 위치를 자동으로 조절해 준다.

             초기 함수에 지정하면 된다.

Dr_BrwStable( oBrw,lLogic ) 자료 입력 또는 수정 후 선택바의 위치를 자동 조절해준다.

             clipper5.3에 인덱스는 “CDX”을 사용시 가능하다.

Dr_BrwDelete ( oBrw ) 자료 삭제 후 선택바의 위치를 자동 조절해준다.

             clipper5.3에 인덱스는 “CDX”을 사용시 가능하다.

aColumns[nFld]:SetGrade( ) 헤더의 3Dtext 설정

            nFld 필드 번호, ()는 SetBkGrdClr함수 참조

ADD [ COLUMN ] TO [ BROWSE ] <oBrw> 					;
      [ <dat: DATA, SHOWBLOCK> <uData> ] 				;
      [ <tit: TITLE, HEADER> <cHead> [ <oem: OEM, ANSI, CONVERT>] ]	;
      [ <clr: COLORS, COLOURS> <uClrFore> [,<uClrBack>] ] 			;
      [ ALIGN ] [ <align: LEFT, CENTERED, RIGHT> ] 			;
      [ <wid: WIDTH, SIZE> <nWidth> [ PIXELS ] ] 				;
      [ PICTURE <cPicture> ] 							;
      [ FOOTER <uFoot> ] 							;
      [ <bit: BITMAP> ] 							;
      [ <edit: EDITABLE> ] 							;
      [ MESSAGE <cMsg> ] 							;
      [ VALID <uValid> ] 							;
      [ ERROR [MSG] [MESSAGE] <cErr> ] 					;
      [ <lite: NOBAR, NOHILITE> ] 						;
      [ <idx: ORDER, INDEX, TAG> <cOrder> ] 				;
      [ <lin: LINESTYLE> <nStyle> ] 						;
      [ <when: WHEN> <uWhen> ] 						;
      [ <items: LIST, ITEM, ITEMS> <aItems> ] 				;
      [ FIELD <cField> ]
oBrw		칼럼 브라우즈 객체명
uData		칼럼 데이터가 리턴된 코드 블럭
cHead		헤더명
uClrFore, uClrBack	문자 색상값, 배경 색상값
align		문자 정렬( LEFT, CENTER, RIGHT)
nWidth		셸의 폭 길이
cPicture		picture 형식
uFoot		Footer에 나타낼 행동 { || 함수 } 리턴 값은 문자로 하세요. 
BITMAP	비트맵명
EDITABLE	셸편집 모드
cMsg		메시지 내용
uValid		valid 조건
cErr			valid가 틀릴 경우 에러 메시지
NOBAR, NOHILITE 선택바 표시 안함
nStyle		라인 스타일
uWhen		when 조건
aItems		콤보박스 내용
DATA
cHeading	임의의 헤더 문자열
bData		칼럼 데이터가 리턴된 코드 블럭
cData		The above as a string
cPicture		picture 옵션
bClrFore 	전경색의 컬러 블록 옵션
bClrBack		배경색의 컬러 블록 옵션
nAlign		정렬 옵션
nWidth		넓이 옵션
lBitMap 		비트맵 프래그 옵션
lEdit		편집 가능 여부
lNoLite		SelectLine()시 셀 이동 가능 여부
cMsg		편집 메시지
bValid		편집 valid 블럭
cError		valid가 틀릴 경우 에러 메시지
nHeadAlign	제목 정렬 방법
nLineStyle	각 라인 사이의 선 구분 방법
bFooter     	컬럼 하단에 나타낼 블럭	
bPrevBlock 	쉘 편집 전 평가해야 할 블록 
aItems		편집시 자동 COMBOBOX가 나타나게 할 배열
EDITCOL [<nCol>] VAR [<uVar> ]           	;
        	  [ PICTURE <cPicture> ]             	;
        	  [ VALID <bValid> ]                 	;
        	  [ COLOR <nClrFore>, <nClrBack> ] 	;
        	  [ ITEMS <aItems> ]                 	;
        	  [ OF <oBrw>      ]                 	;
        	  [ <lvirtual: VIRTUAL> ]
nCol			현재 편집될 컬럼의 위치 
uVar			편집할 초기 변수 값
cPicture           Picture 형식
bValid 			valid조건
nClrFore, nClrBack	셸의 글자색상 값, 배경 색상 값
aItems			콤보박스 내용
oBrw     		브라우즈의 객체명
VIRTUAL  		가상 레코드를 추가
참 고

* 브라우즈의 헤더간격 코딩방법

1. 프로그램을 코딩 후 실행파일을 만들어 실행시킨 후 브라우즈의 헤더를 마우스로 드래그하여 헤더간격을 적당히 조절한다.

2. Ctrl키를 누른 상태에서 브라우즈헤더를 클릭하면 헤더의 길이를 알려준다.

* Ctr+F9

  DB명, 콘트롤 ID, class명, 지금 명령을 실행중인 프로그램의 라인수를 보여줍니다.

 

1. 일반 브라우즈

NSAMPLES\BROWSE\SAMBRW1.PRG 참조

#include "npp.ch"

#DEFINE DR_BRW1 RGB(245,141,244) //분홍
#DEFINE DR_BRW2 RGB(018,000,250) //파랑
#DEFINE DR_BRW3 RGB(247,249,210) //진한노랑
#DEFINE DR_BRW4 RGB(244,249,240) //연한노랑
#DEFINE DR_BRW5 RGB(192,192,192) //회색
#DEFINE DR_BRW6 RGB(255,255,255) //흰색
#DEFINE DR_BRW7 RGB(000,000,000) //검정
#DEFINE DR_BRW8 RGB(239,239,239) //진한 프름
#DEFINE DR_BRW9 RGB(236,244,252) //연한 프름

FUNCTION MAIN()

         LOCAL oApp := TBrwTest():New()

RETURN NIL
CLASS TBrwTest

       DATA oDlg
       DATA oBrw
       DATA oBut AS ARRAY INIT Array( 9 )
       DATA oPopUp

       METHOD New() CONSTRUCTOR
       METHOD FormCreat()
         METHOD ThinkHead()
         METHOD ShowPopMenu()
         METHOD BrwPopUp ( nRow, nCol )
         METHOD ThinkPostClr()
         METHOD BrwKeyDown( nKey )

ENDCLASS


METHOD New() CLASS TBrwTest

       Use POST New
       ::FormCreat()
       POST->( dbCloseArea() )

Return Nil

METHOD FormCreat() CLASS TBrwTest

       Local oFont := Dr_RndFnt(16)
       Local hBmpCusor := LoadBitmap( GetResources(), "B_SAM" )

       DEFINE DIALOG ::oDlg RESOURCE "D_BRW"

         ::oDlg:SetWall( "BATANG" )
         SetHPlus ( 7 )

         REDEFINE BROWSE ::oBrw                          	;
                  ID 4001                                	;
                  OF ::oDlg                              	;
                  FONT oFont                             	;
                  ALIAS "POST"                           	;
                  ON DBLCLICK MsgInfo( "더블클릭 누름" ) 	;
                  ON CHANGE ::ThinkHead()

    ::oBrw:bRClicked   := {|nRow, nCol| ::BrwPopUp ( nRow, nCol ) }
    ::oBrw:bKeyDown  := {|nKey| ::BrwKeyDown(nKey)}

                  ::oBrw:hBmpCursor := hBmpCusor

                  ADD TO ::oBrw  DATA ""                 	;
                      TITLE "위치"                       	;
                      SIZE 30                            	;
                      COLOR DR_BRW7, DR_BRW5          	;

                  ADD TO ::oBrw  DATA RECNO()         	;
                      TITLE "레코드"                     	;
                      SIZE 50                            	;
                      COLOR DR_BRW7, ::ThinkPostClr(1)   	;
                      PICTURE " #,###"

                  ADD TO ::oBrw DATA POST->ZIP         	;
                      TITLE "우편번호"                   	;
                      ALIGN CENTER                       	;
                      SIZE 70                            	;
                      COLOR DR_BRW7, ::ThinkPostClr(2)

                  ADD TO ::oBrw DATA POST->DDD       		;
                      TITLE "DDD"                        	;
                      ALIGN CENTER                       	;
                      SIZE 50                            	;
                      COLOR DR_BRW7, ::ThinkPostClr(3)

                  ADD TO ::oBrw DATA POST->JUSO      		;
                      TITLE "주소"                       	;
                      SIZE 200                           	;
                      COLOR DR_BRW7, ::ThinkPostClr(4)

                  ::oBrw:acolumns[5]:nHeadAlign  :=  0

    ::oBrw:SetBkGrdClr( 4, 6, 1 , CLR_WHITE, CLR_BLACK )
    ::oBrw:nShadowHead  := CLR_BLACK
    ::oBrw:nClrForeHead := CLR_WHITE

    ::oBrw:Aactions := { {|| msginfo("1") }, {|| msginfo("2") }, 
{|| msginfo("3") }, ;
                        {|| msginfo("4") }, {|| msginfo("5") }}

        ::oBut[1]:=tBtnBmp():REDEFINE( 301,301,301, , , , ;
                 {||::oBrw:GoTop(), ::oBrw:SetFocus()  }, ::oDlg, .f.,,, )
        ::oBut[2]:=tBtnBmp():REDEFINE( 302,302,302, , , , ;
                 {||::oBrw:PageUp(15), ::oBrw:SetFocus()  }, ::oDlg, .f.,,, )
        ::oBut[3]:=tBtnBmp():REDEFINE( 303,303,303, , , , ;
                 {||::oBrw:GoUp(), ::oBrw:SetFocus()  }, ::oDlg, .f.,,, )
        ::oBut[4]:=tBtnBmp():REDEFINE( 304,304,304, , , , ;
                 {||::oBrw:GoBottom(), ::oBrw:SetFocus()}, ::oDlg, .f.,,, )
        ::oBut[5]:=tBtnBmp():REDEFINE( 305,305,305, , , , ;
                 {||::oBrw:PageDown(15), ::oBrw:SetFocus()  }, ::oDlg, .f.,,, )
        ::oBut[6]:=tBtnBmp():REDEFINE( 306,306,306, , , , ;
                 {||::oBrw:GoDown(), ::oBrw:SetFocus()  }, ::oDlg, .f.,,, )
        ::oBut[7]:=tButton():REDEFINE( 307, ;
                 {|| msginfo("왼쪽 버튼 눌렀내요")}, ::oDlg,,,.f.,,, )
        ::oBut[8]:=tBtnBmp():REDEFINE( 308,308,308, , , , ;
                 {||WINHELP( "BRW.HLP" )}, ::oDlg, .f.,,, )
        ::oBut[9]:=Tdrbtnbmp():Redefine( 309,309, , , ;
                 {||::oDlg:End()},::oDlg,.f.,,,," 종료(&X)",, 7,,,,,,,,)
        ::oBut[7]:bRClicked := {| nRow, nCol | ::ShowPopMenu() }

   ACTIVATE DIALOG ::oDlg CENTER

RETURN NIL
METHOD ThinkHead() CLASS TBrwTest

       Local aDDD  := { "02",  "0394", "0395", "0392", "0372","0556" }
       Local aADDR := { "서울","동해", "삼척", "속초", "횡성","고성" }
       Local cADDR := "DDD"

       Local cGivenDDD := alltrim(POST->DDD)
       Local nPos      := ascan ( aDDD, cGivenDDD )

       if nPos <> 0
          cADDR := aADDR[ nPos ]
       endif

       if ::oBrw:aColumns[4]:cHeading <> cADDR
          ::oBrw:aColumns[4]:cHeading := cADDR
          ::oBrw:RefreshHeader()
       endif

Return NIL

METHOD ThinkPostClr(nSun) CLASS TBrwTest

       LOCAL nRecNo := POST->(RecNo())
       LOCAL nColor := DR_BRW8

       DO CASE
          CASE nSun == 1
               nColor := DR_BRW3
          CASE nSun == 2
               nColor := DR_BRW4
          CASE nSun == 3
               nColor := DR_BRW8
          CASE nSun == 4
               nColor := DR_BRW9
       END
       // 셸 색상 조정

       IF Mod ( nRecNo, 10 ) == 0
          nColor := DR_BRW1
       ENDIF
       // 10의 배수 레코드 마다 색상 조정

RETURN nColor

METHOD ShowPopMenu() CLASS TBrwTest

       LOCAL oMenu := ''
       LOCAL nRow  := 0 , nCol := 0
       nRow := ::oBut[7]:nHeight

       MENU oMenu POPUP
            MENUITEM   "TEST1"
            MENUITEM   "TEST2"
            MENUITEM   "TEST3"
            SEPARATOR
            MENUITEM   "TEST4"
            MENUITEM   "TEST5"
       ENDMENU

       ACTIVATE MENU oMenu OF ::oBut[7] AT nRow, nCol

RETURN NIL

METHOD BrwPopUp ( nRow, nCol ) CLASS TBrwTest
        IF ::oPopUp <> NIL
           ::oPopUp := NIL
           RETURN NIL
        ENDIF
        MENU ::oPopUp POPUP
            MENUITEM   "TEST1"
            MENUITEM   "TEST2"
            MENUITEM   "TEST3"
            SEPARATOR
            MENUITEM   "TEST4"
            MENUITEM   "TEST5"
       ENDMENU

       ACTIVATE MENU ::oPopUp OF ::oBrw AT nRow, nCol

RETURN NIL

METHOD BrwKeyDown( nKey ) CLASS TBrwTest

       DO CASE
          CASE nKey==VK_RETURN
               msginfo("RETURN를 눌렀네요")
          CASE nKey==VK_DELETE
               msginfo("DELETE를 눌렀네요")
          CASE nKey==VK_INSERT
               msginfo("INSERT를 눌렀네요")
          CASE nKey==VK_ESCAPE
               msginfo("ESCAPE를 눌렀네요")
       END

Return NIL

INIT FUNCTION APP_INIT()

     SET RESOURCES TO "SAMBRW1.DLL"
     SET _3DLOOK ON

RETURN NIL


Exit Function FINISH()

     SET 3DLOOK OFF
     SET RESOURCES TO

RETURN NIL

 

2. 배열 브라우즈

NSAMPLES\BROWSE\SAMBRW2.PRG 참조

#include "npp.ch"

Func MAIN()

     Local oMain := ABRW():New()

Return Nil


CLASS ABRW

      DATA oDlg, oBrw, oBut

      METHOD New() CONSTRUCTOR
             METHOD ShowNam()

ENDCLASS


METHOD New() CLASS ABRW

       Local i        := 0
       Local j        := 0
       Local nX       := 1
       Local nY       := 1
       Local cSeekNam := ""
       Local lSunTak  := .t.
       Local aName1   := {"김일동","김이동","김삼동","김사동","김오동",;
                          "박일동","박이동","박삼동","박사동","박오동",;
                          "이일동","이이동","이삼동","이사동","이오동" }
       Local aName2[5,3]

       For i=1 to 5
           For j=1 to 3
               aName2[i,j] := aName1[ (j-1)*5 + i ]
           Next
       Next

// aName2 배열에 저장할 데이터 및 브라우즈에 표현할 모양

// {"김일동","박일동","이일동"}
// {"김이동","박이동","이이동"}
// {"김삼동","박삼동","이삼동"}
// {"김사동","박사동","이사동"}
// {"김오동","박오동","이오동"}

       DEFINE DIALOG ::oDlg RESOURCE "D_SEEKNAM"
         Sethplus ( 5 )
         REDEFINE BROWSE ::oBrw ID 4001 OF ::oDlg ;
                  ALIAS "ARRAY"                   ;
                  ON DBLCLICK ( ::ShowNam( aName2 ) )

                  ::oBrw:SetArray ( aName2 )
                  ::oBrw:lCellStyle := .t.

                  ADD TO ::oBrw ARRAY elem 1 HEAD "이 름" SIZE 75 ALIGN CENTER
                  ADD TO ::oBrw ARRAY elem 2 HEAD "이 름" SIZE 75 ALIGN CENTER
                  ADD TO ::oBrw ARRAY elem 3 HEAD "이 름" SIZE 75 ALIGN CENTER

         REDEFINE BUTTON ::oBut ID 3001 OF ::oDlg ACTION ::oDlg:End()

       ACTIVATE DIALOG ::oDlg CENTER

Return Nil




METHOD ShowNam( aName2 ) CLASS ABRW

       Local nX := 0
       Local nY := 0

       nX := ::oBrw:Ncolact
       nY := ::oBrw:Nat
       MsgInfo( aName2[nY,nX] + "을 선택 했습니다.")
       ::oBrw:Refresh()

Return Nil


Init Function START()

     SET _3DLOOK ON
     SET RESOURCES TO "SAMBRW2.DLL"

RETURN NIL


Exit Function FINISH()

     SET 3DLOOK OFF
     SET RESOURCES TO

RETURN NIL

 

3. 편집 브라우즈

NSAMPLES\BROWSE\SAMBRW3.PRG 참조

#include "npp.ch"
#include "ads.ch"

REQUEST _ADS
FUNCTION Main()

   App_Init()
   TBrwEdit():New()

RETURN NIL

CLASS TBrwEdit

   DATA oDlg
   DATA oBrw
   DATA oBtn AS ARRAY INIT Array(3)
   DATA nWidth
   DATA oFont

   METHOD New() CONSTRUCTOR
   METHOD FormCreate()
   METHOD ReButton()
   METHOD Read( lNew )
   METHOD BrwKeyDown( nKey, nAsc )
   METHOD SaveData( uVar, nLastKey, lNew, cField, nRecNo )
   METHOD Open()
   METHOD Close()
   METHOD GenCode()
   METHOD ReBrw()
   METHOD DeleteData(oBrw)
   METHOD HeadChange( nPos )
   METHOD BrwPopUp()

ENDCLASS


METHOD New() CLASS TBrwEdit

   ::oFont := Dr_Font(10)
   ::nWidth:= GetFontInfo( ::oFont:hFont ) [2] //폰트의 가로크기
   ::Open()
   ::FormCreate()
   ::Close()

RETURN NIL


METHOD Open() CLASS TBrwEdit

   Local oMeter := ''
   Local nStep  := 0
   Local cFile  := "MAN.DBF"
   Local aStruct:= {{"CODE ", "C", 05, 0 },;
                    {"NAME ", "C", 10, 0 },;
                    {"JUMIN", "C", 14, 0 },;
                    {"PART ", "C", 20, 0 },;
                    {"POSI ", "C", 20, 0 },;
                    {"PAY  ", "N", 07, 0 } }

   IF !File( cFile )
      dbCreate( cFile, aStruct )
   ENDIF

   USE MAN SHARED NEW ALIAS MAN VIA "ADS"

   IF !File("MAN.CDX")
      nStep  := Int( MAN->(OrdKeyCount() ) / 10 )
      oMeter := TDrMeta():New("인덱스파일생성","잠시만 기다리세요",MAN->( OrdKeyCount() ), 1 )
      INDEX ON MAN->NAME  TAG NAME  TO MAN For !Deleted() ;
               EVERY nStep  Eval ( oMeter:SetData( MAN->( OrdKeyNo() ) ) )

      INDEX ON MAN->JUMIN TAG JUMIN TO MAN For !Deleted() ;
               EVERY nStep  Eval ( oMeter:SetData( MAN->( OrdKeyNo() ) ) )

      INDEX ON MAN->PART  TAG PART  TO MAN For !Deleted() ;
               EVERY nStep  Eval ( oMeter:SetData( MAN->( OrdKeyNo() ) ) )

      INDEX ON MAN->POSI  TAG POSI TO MAN For !Deleted()  ;
               EVERY nStep  Eval ( oMeter:SetData( MAN->( OrdKeyNo() ) ) )

      INDEX ON DESCEND(STR(MAN->PAY))+MAN->NAME TAG PAY TO MAN For !Deleted()  ;
               EVERY nStep  Eval ( oMeter:SetData( MAN->( OrdKeyNo() ) ) )

      oMeter:End()
   ELSE
      SET INDEX TO MAN
   ENDIF

   MAN->(dbGoTop())
   MAN->(OrdSetFocus("NAME"))

RETURN NIL


METHOD Close() CLASS TBrwEdit
   MAN->(dbCloseArea())
RETURN NIL


METHOD FormCreate() CLASS TBrwEdit

   DEFINE DIALOG ::oDlg RESOURCE "D_BRWEDIT"

      ::ReBrw()
      ::ReButton()

   ACTIVATE DIALOG ::oDlg CENTER

RETURN NIL
METHOD ReBrw() CLASS TBrwEdit

   REDEFINE BROWSE ::oBrw ID  4001 OF ::oDlg     ;
            COLOR CLR_BLACK, nRGB ( 235,255, 255 )

      ::oBrw:SetGrade( 4, 4, 1 , CLR_BLACK, nRGB(227,224,220) )
      ::oBrw:nStClr     := nRGB(181,173,161)
      ::oBrw:nEndClr    := nRGB(243,240,235)

      ::oBrw:lCellStyle := .t.
      ::oBrw:lNoHScroll := .t.
      ::oBrw:cAlias:="MAN"
      ::oBrw:bRClicked  := {| nRow, nCol | ::BrwPopUp( nRow, nCol ) }
      ::oBrw:bGotFocus  := {|| Dr_Han()}
      ::oBrw:aActions   := { {|| ::HeadChange( 1 ) }, {|| ::HeadChange( 2 ) }, {|| ::HeadChange( 3 ) },;
                             {|| ::HeadChange( 4 ) }, {|| ::HeadChange( 5 ) } }

      ::oBrw:bKeyDown   := {| nKey | ::BrwKeyDown( nKey ) }
      ::oBrw:bKeychar   := {| nAsc | iif ( nAsc <> 13, ::BrwKeyDown ( 13, nAsc ), ) }
      ::oBrw:bHanCheck  := {|      | ::BrwKeyDown(  13       ) }
      ::oBrw:bLDblClick := {|      | ::BrwKeyDown(  13       ) }

      ADD TO ::oBrw DATA MAN->NAME               ;
          TITLE "이  름"                         ;
          FIELD "NAME"                           ;
          SIZE ::nWidth * 13                     ;
          EDITABLE                               ;
          COLOR CLR_BLACK, nRGB ( 235, 255, 255 )

      ADD TO ::oBrw DATA MAN->JUMIN              ;
          TITLE "주민등록번호"                   ;
          FIELD "JUMIN"                          ;
          SIZE ::nWidth * 20                     ;
          PICTURE "999999-9999999"               ;
          EDITABLE                               ;
          COLOR CLR_BLACK, nRGB ( 235, 255, 255 )

      ADD TO ::oBrw DATA MAN->PART               ;
          TITLE "부   서"                        ;
          FIELD "PART"                           ;
          SIZE ::nWidth * 18                     ;
          EDITABLE                               ;
          COLOR CLR_BLACK, nRGB ( 235, 255, 255 )

      ADD TO ::oBrw DATA MAN->POSI               ;
          TITLE "직   급"                        ;
          FIELD "POSI"                           ;
          SIZE ::nWidth * 18                     ;
          EDITABLE                               ;
          COLOR CLR_BLACK, nRGB ( 235, 255, 255 )

      ADD TO ::oBrw DATA MAN->PAY                ;
          TITLE "급   여"                        ;
          FIELD "PAY"                            ;
          SIZE ::nWidth * 10                     ;
          PICTURE "9,999,999"                    ;
          EDITABLE                               ;
          COLOR CLR_BLACK, nRGB ( 235, 255, 255 )


RETURN NIL


METHOD ReButton() CLASS TBrwEdit

   REDEFINE BUTTON ::oBtn[1] ID  3001 OF ::oDlg ACTION ::oDlg:END()

RETURN NIL


METHOD BrwPopUp( nRow, nCol ) CLASS TBrwEdit

   LOCAL oPopUp

   IF oPopUp <> NIL
      oPopUp := NIL
   ENDIF


   MENU oPopUp  POPUP

      MENUITEM "추   가(Insert)" ACTION ( ::oBrw:nColAct:=1, ::Read( .t. ) )
      MENUITEM "수   정(Enter) " ACTION ::Read( .f. )
      MENUITEM "삭   제(Delete)" ACTION ::DeleteData(::oBrw)

   ENDMENU

   ACTIVATE MENU oPopUp OF ::oBrw AT nRow, nCol

RETURN NIL


METHOD HeadChange( nPos ) CLASS TBrwEdit

   DO CASE

      CASE nPos == 1
           MAN->(OrdSetFocus("NAME"))

      CASE nPos == 2
           RETURN NIL

      CASE nPos == 3
           MAN->(OrdSetFocus("PART"))

      CASE nPos == 4
           MAN->(OrdSetFocus("POSI"))

      CASE nPos == 5
           MAN->(OrdSetFocus("PAY"))
   ENDCASE

   Dr_BrwStable(::oBrw)
   ::oBrw:Refresh()

RETURN NIL



METHOD BrwKeyDown( nKey, nAsc ) CLASS TBrwEdit

   DO CASE

      CASE nKey == VK_INSERT
           ::oBrw:nColAct:=1
           ::Read( .t. )
      CASE nKey == 13
           ::Read( .f. )
      CASE nKey == VK_DELETE
           ::DeleteData(::oBrw)
      CASE nKey == VK_DOWN

           IF ::oBrw:lHitBottom
              ::oBrw:nColAct:=1
              ::Read( .t. )
           ENDIF

      CASE nKey == 27
           ::oDlg:End()

   ENDCASE

   IF nAsc <> NIL
      Dr_KeyBoard ( ::oBrw:oGet, nAsc )
   ENDIF

RETURN NIL


METHOD Read( lNew ) CLASS TBrwEdit

   LOCAL nPos     := ::oBrw:nColAct     // Browse의 Cell의 위치
   LOCAL uVar     := ''
   LOCAL lVirtual := .f.
   LOCAL nRecNo   := (::oBrw:cAlias)->(OrdkeyNo())
   LOCAL cField   := ::oBrw:aColumns[ nPos ]:cField
   LOCAL cPicture := ::oBrw:aColumns[ nPos ]:cPicture

   DEFAULT lNew := .f.

   IF Empty ( cField )
      RETURN NIL
   ENDIF

   IF lNew
      lVirtual := .t.
   ENDIF
   IF (::oBrw:cAlias)->(OrdKeyCount()) == 0  //자료가 하나도 없으면
      lNew := .t.
      lVirtual := .f.             //부라우즈에서 가상위치(다음 줄)로 가지않고 현재위치에서 입력받는다.
   ENDIF

   IF lNew
      (::oBrw:cAlias)->( dbGoto( 0 ) )
   ENDIF

   uVar := (::oBrw:cAlias)->&(cField)

   IF lNew

      (::oBrw:cAlias)->( dbGoto( nRecNo ) )

      IF ::oBrw:nRowCount <= (::oBrw:cAlias)->(OrdKeyCount())
         ::oBrw:BrwGoBottom(1)
         ::oBrw:Refresh()
      ELSE
         ::oBrw:BrwGoBottom()
      ENDIF

   ENDIF

 IF ::oBrw:aColumns[ nPos ]:lEdit    //Editable 이면

      IF lVirtual                      //가상레코드를 만든다.
         EDITCOL nPos VAR uVar OF ::oBrw ;
               VIRTUAL                 ;
               PICTURE cPicture        ;
               VALID {| uVar, nLastKey |  ::SaveData( uVar, nLastKey, lNew, cField, nRecNo ) }
               ::oBrw:oGet:lRightEdit := .t.                 //오른쪽 숫자입력
      ELSE
         EDITCOL nPos VAR uVar OF ::oBrw ;
               PICTURE cPicture        ;
               VALID {| uVar, nLastKey |  ::SaveData( uVar, nLastKey, lNew, cField, nRecNo ) }
               ::oBrw:oGet:lRightEdit := .t.
      ENDIF
 ELSE                           //Editabl이 아니면
      IF nPos == Len(::oBrw:aColumns)  //마지막 칼럼이면 아래 첫번째 셀로 이동한다.
         ::oBrw:nColAct:=1
         ::oBrw:GoDown()
      ELSE
         ::oBrw:GoRight()              //마지막이 아니면 오른쪽으로 이동
         Return NIL
      ENDIF
   ENDIF

RETURN NIL


METHOD SaveData( uVar, nLastKey, lNew, cField, nRecNo ) CLASS TBrwEdit

   IF nLastKey == 27
     Dr_BrwStable( ::oBrw )
     ::oBrw:Refresh()
      RETURN NIL
   ENDIF

   IF lNew .and. Empty ( uVar )
     Dr_BrwStable( ::oBrw )
     ::oBrw:Refresh()
      RETURN NIL
   ENDIF


   IF lNew
      IF !( (::oBrw:cAlias)->(Dr_Append()) )
         MsgStop( "잠시후 재시도 바랍니다.","Network Busy")
         RETURN NIL
      ENDIF
   ENDIF

   IF !( (::oBrw:cAlias)->(Dr_dbRLock()) )
       MsgStop( "잠시후 재시도 바랍니다.","Network Busy")
       RETURN NIL
   ENDIF
   (::oBrw:cAlias)->&(cField) := uVar  //저장
   (::oBrw:cAlias)->(dbUnLock())

   IF lNew           //코드를 입력한다.
      ::GenCode()
   ENDIF

   IF nRecNo != (::oBrw:cAlias)->(OrdKeyNo())   //인덱스 위치가 달라졌을때만
     Dr_BrwStable( ::oBrw )
     ::oBrw:Refresh()
   ENDIF

   DO CASE                               // GET처리후의 키값

      CASE nLastKey == VK_DOWN           // 밑으로
           ::oBrw:GoDown()
           IF ::oBrw:lHitBottom
              Dr_KeyBoard(::oBrw, VK_INSERT )
           ENDIF

      CASE nLastKey == VK_UP             // 위로
           ::oBrw:GoUp()
      CASE nLastKey == 13

           IF ::oBrw:nColAct == Len(::oBrw:aColumns)       // 오른쪽이면
              ::oBrw:Godown()
              ::oBrw:nColAct:=1
           ELSE
              ::oBrw:GoRight()
           ENDIF

   ENDCASE

RETURN NIL



METHOD DeleteData( oBrw )  CLASS TBrwEdit

   Dr_BrwDelete ( oBrw )

   IF VALTYPE(oBrw:bChange)=="B"  //bChange 코드블럭이 있으면 실행한다.
      Eval(oBrw:bChange)
   ENDIF

RETURN NIL


METHOD GenCode() CLASS TBrwEdit

   IF MAN->(dbRLock())
      MAN->CODE := MakeCode ( "MAN", 5, .t. )
   ENDIF
   MAN->(dbUnLock())

RETURN NIL


FUNCTION MakeCode ( cRemark, nLen, lPlus )    //코드 생성 합수

   LOCAL cAlias := Alias()
   LOCAL cDummy := ''
   LOCAL cCode  := ''
   LOCAL nMax   := 0
   LOCAL nI     := 0
   LOCAL aStruct:= {{ "REMARK" ,  "C",  10,  0 },;
                    { "LENGTH" ,  "N",   1,  0 },;
                    { "COUNTER",  "N",   9,  0 } }
   LOCAL cFile  := "CODEBASE.DBF"
   LOCAL cIndex := "CODEBASE.CDX"

   iif ( lPlus == NIL , lPlus := .f., NIL )

   cRemark := PAD ( cRemark, 10 )

   IF !File ( cFile )
       dbCreate( cFile, aStruct )
   ENDIF

   USE CODEBASE NEW SHARED ALIAS CODEBASE VIA "ADS"

   IF !File ( cIndex )
      INDEX ON CODEBASE->REMARK TAG REMARK TO (cIndex)
   ELSE
      SET INDEX TO CODEBASE
   ENDIF

   IF !( CODEBASE -> ( dbSeek ( cRemark ) ) )
      CODEBASE->(Dr_Append())
      IF CODEBASE->( dbRLock() )
         CODEBASE->REMARK  := cRemark
         CODEBASE->LENGTH  := nLen
         CODEBASE->COUNTER := 0
         CODEBASE->( dbUnlock() )
      ENDIF
   ENDIF

   IF lPlus
      IF CODEBASE->( dbRLock() )
         CODEBASE->COUNTER :=  CODEBASE->COUNTER + 1
         CODEBASE->( dbUnlock() )
      ENDIF
   ELSE
      IF CODEBASE->COUNTER > 0
         IF CODEBASE->( rLock() )
            CODEBASE->COUNTER := CODEBASE->COUNTER - 1
            CODEBASE->( dbUnlock() )
         ENDIF
      ENDIF
   ENDIF

   cDummy := alltrim( str( CODEBASE->COUNTER ) )

   cCode := padl ( cDummy, nLen, "0" )

   CODEBASE->(dbCloseArea())

   IF Select ( cAlias ) <> 0
      (cAlias)->(dbSelectArea())
   ENDIF

RETURN cCode


FUNCTION App_Init()

   RddRegister ( "ADS", 1 )
   RddSetDefault ( "ADS" )

   SET SERVER LOCAL    // INTERNET
   SET FILETYPE TO CDX // ADT

   SET _3DLOOK ON
   SET DELETE ON
   SET DATE FORMAT "YYYY.MM.DD"
   SETHANDLECOUNT(45)

   SET RESOURCES TO "SAMBRW3.DLL"

   Dr_GSetcolor ( { CLR_BLACK, CLR_WHITE } ,;
                  { CLR_BLACK, nRGB( 235, 255, 255 ) } ,;
                  { CLR_BLACK, DR_YELLOW } )
   SetHPlus ( 8 )
   SetAutoScroll(.t.)
   SetAutoClear(.t.)
   Memory(-1)

RETURN NIL

Exit Function App_Exit()

     SET 3DLOOK OFF
     SET RESOURCES TO

RETURN NIL
 

Link categories 1

Link categories 2