|
카테고리
전체
제갈장비-Linux 제갈장비-TOMCAT 제갈장비-JAVA -------------------- 문서-Linux 문서-Powerbuilder 문서-JAVA 문서-ASP 문서-하드웨어 문서-EDPS 문서-MSSQL -------------------- TIP-JAVA TIP-Perl TIP-ASP TIP-Powerbuilder 01 TIP-Javascript TIP-Excel TIP-XML TIP-MSAccess TIP-PostgreSql TIP-Windows TIP-Linux TIP-HTML TIP-TOMCAT -------------------- ETC Secret Util-Japan 미분류 최근 등록된 덧글
잘읽어 보았습니다. 그런..
by 이윤철 at 11/07 1000 666 by qhrlfeh77 at 05/21 123 by qhrlfeh77 at 05/21 by qhrlfeh77 at 05/21 감사합니다!! HashSet.. by 세레네이 at 04/06 찾고 있었던 자료인데 .. by 나그네 at 01/09 감사합니다. 잘 보았습.. by 졸면죽는다 at 10/28 좋은 정보 정말 감사합니.. by 강성훈 at 10/22 좋은글 퍼가겠습니다. by 정의진 at 09/29 이제야 봤습니다. iText.. by 제갈장비 at 08/09 이글루 파인더
|
2006년 09월 29일
Highlighting Selected Text in PowerBuilder DataWindow 사용자가 찾고자 하는 문자열을 검색할 수 있는 윈도우가 있고, 그 윈도우 안에는 사용자가 찾고자 하는 문자와 일치하는 텍스트가 있다고 가정하자. 검색되어진 문자의 위치는 밝게 처리가 되어야 사용자가 쉽게 확인할 수 있을 것이다. 예를 들면 이것은 아래 그림1처럼 보여야 할 것이다. ![]() <그림 1> 파워빌더는 데이터검색과 정보를 보여주는 강력한 기능을 가지고 있는데 이것이 바로 DataWindow이다. 그렇다면 Datawindow 컬럼 내에서 이것들을 어떻게 처리해야 할 것인가? 안타깝게도 DataWindow 오브젝트에는 위와 같은 일을 할 수 있는 방법이 없다. 이 기사에서는 이것을 확인할 수 있는 기술에 대해 설명하고 있다. A Sample DataWindow 테스트를 위해 Tabular 형태로 Datawindow를 하나 만들고 String 타입으로 text라는 이름을 가진 컬럼을 생성한다. 여기서는 데이터를 필터링하는 것이 아니라, 단지 텍스트의 패턴 매칭으로 찾는 방식을 알아볼 것이다. 예제 데이터윈도우는 External Data Source를 이용하여 만든다. 그림 2에서 보는 것처럼 간단하게 DataWindow를 생성할 수 있다. ![]() <그림 2> 데이터윈도우 페이터에 있는 Data 부분에서 간단하게 데이터를 추가할 수 있다. 아니면, 스트립트 안에서 External Source로부터 데이터를 읽어들일 수도 있다. Selecting Part of the Text 이제 데이터윈도우에는 우리가 문자열 패턴 매치로 찾고자 하는 텍스트를 포함 하고 있다. 그 다음 데이터윈도우에서 우리가 원하는 패턴과 일치하는 문자열이 있으면 글자 색을 빨간색으로 처리할 것이다. 해당 데이터윈도우에 아래의 세 문장이 있다고 가정하고, PowerBuilder rules the world. It is a rule with us. This is the rule of the game. 이들 중 찾고자 하는 단어가 ‘rule’이라고 하더라도, 찾아진 결과는 변함이 없을 것이다. 데이터윈도우 컬럼의 일부만을 강조할 수 없기 때문이다. 이를 표현하기 위해 다음의 세 부분으로 (선택되기 전, 선택, 선택되어진 후)컬럼을 나누어 생각해 볼 수 있다. 생성한 데이터윈도우의 Result Set에 컬럼 “search” 를 추가하자. 기존의 text 컬럼 대신에 세 개의 Computed Filed를 추가한다. 첫번째 Computed Filed의 Expression에 아래의 표현을 적는다. if( isNull(search), text, if( pos(text, search, 1) = 0, text, left(text, pos(text, search, 1) - 1) )) 생성한 Computed Filed를 “prefix”라 부르자. 두 번째 Computed Filed에는 아래의 표현식을 적는다. if(pos(text, search, 1) = 0, '', search) 두번째로 생성한 Computed Filed는 “Matched”라 명하자. 세 번째 Computed Filed에는 아래의 표현식을 적는다. if( isNull(search), '', if( pos(text, search, 1) = 0, '', mid(text, pos(text, search, 1) + len(search) ) ) ) 세 번째로 생성한 것을 “suffix”라 명하자. 이 세가지 Computed Filed들을 기존의 text 컬럼의 길이에 맞게 위치시킨다. “matched” Computed Filed의 폰트 색은 빨간색으로 설정 후 text 컬럼을 지운다. 결과적으로 그림 3에서 보이는 것과 같은 결과를 얻을 것이다. 우리가 원하는 부분이 빨간색으로 바뀌었다. 하지만 데이터윈도우가 하나의 컬럼처럼 보이지 않고 Computed Field들 사이에 불필요한 공간이 들어가 있는 것을 볼 수 있다. 적당한 크기로 조절하기 위해 “matched”와 “suffix” Computed Filed의 Position 프로퍼티 중 Slide Left를 체크해준다. ![]() <그림 3>
![]()
<그림 4> Selecting Several Parts 만약 사용자가 하나의 단어를 찾으려 하는 것이 아니라 여러 단어를 찾으려 한다면 어떻게 해야 할까? 이를 만족시키기 위해선 원본 컬럼을 나누기 위해 더 많은 Computed filed들을 만들어야 할 것이다. 캐릭터들을 더 작은 단위의 컬럼을 나누어 보자. 즉 모든 Computed Filed는 해당 컬럼 텍스트에 하나의 케릭터만을 포함하게 만든다. 첫 번째 Computed Filed는 첫 번째 캐릭터를, 두 번째 Computed Filed는 두 번째 캐릭터를… 이런 방식으로 하나의 캐릭터를 갖도록 한다. 각 Computed Filed의 Expression에는 아래의 스크립트로 작성한다. mid( text, , 1) 그 다음 Computed Filed들에 원하는 문자 색을 설정해줌으로써 각각의 문자들을 선택할 수 있게 된다. Computed filed에 폰트 색상을 설정해주는 프로퍼티를 설정하는 방식은 Buck Woolley가 작성한 “Not Your Father’s DataWindow” (PBDJ volumn 8 issue7)내용을 이용하였다. 이 기술문서의 기본내용은 String 타입의 컬럼들이 포함되어 있는 많은 데이터윈도우 오브젝트들의 파라미터를 가져오는 것이다. 예제 데이터윈도우의 텍스트 컬럼 길이는 50이기 때문에 50개의 Computed Filed를 생성해야 할 것이다. DataWindow의 Result Set에서 “select” 이름으로 String 컬럼을 하나 추가하고 이 컬럼 역시 길이를 50으로 정한다. 다양한 색상의 텍스트를 표현해보기 위해, “select” 컬럼은 아래 값을 입력한다. "0101010101010010100101001010000000<...>" 50개의 케릭터이기 때문에 Computed Filed들을 50개 생성해야 한다면, 아니면 그 이상의 Computed Fileld를 손수 생성해야 한다면 그것은 무척 골치 아픈 일이 될 것이다. 이 방법을 해결하기 위해 코딩을 이용하자. Selection Service Object 사용자가 직접 작업해야 하는 지루한 일들을 대신 해주는 오브젝트를 만들도록 하자. 먼저 많은 원본 컬럼의 길이와 같은 Computed Filed들이 생성되어 질 데이터윈도우를 생성해 놓아야 한다. 그리고 원본 컬럼의 이름을 데이터윈도우가 정확하게 알고 있어야 한다. 아래 List 1은 of_init() 함수 코드이다. 생성된 Computed field들을 위해 보이는 모든 파라미터들은 원본 컬럼으로부터 가져오게 된다. Instance 변수 함수의 마지막은 스트링값 0 을 가지고 초기화 되어진다. LISTING 1 n_select variables protected: datawindow idw_dw string is_notselected public function boolean of_init (datawindow adw_dw, string as_col); string ls_prop[] int li, li_cnt int li_x int li_w = 55 string ls_color string ls_name string ls_rest_syn string ls_coltype string ls_syn idw_dw = adw_dw ls_rest_syn = 'create compute(band=detail alignment="0" border="0" format="[general]" ' & + 'width="' + string(li_w) + '" slideleft=yes 'ls_prop = { 'y', 'height', 'font.face', 'font.height', 'font.family', & 'font.pitch', 'font.charset', 'background.mode', 'background.color' } for li = 1 to upperBound( ls_prop) ls_rest_syn += ls_prop[li] + '="' + idw_dw.describe(as_col + '.' + ls_prop[li]) + '" ' next ls_color = idw_dw.describe( as_col + '.color') li_x = Integer( idw_dw.describe( as_col + '.x')) ls_coltype = idw_dw.describe( as_col + '.coltype') // expected char(xx) li_cnt = Integer( Mid( ls_coltype, 6, pos(ls_coltype, ')', 1) - 6 ) ) for li = 1 to li_cnt ls_syn = ls_rest_syn & + ' x="' + String(li_x + li_w*(li - 1)) + '" ' & + ' expression="mid( ' + as_col + ', ' + String(li) + ', 1)" ' & + ' color="' + ls_color + '~tif(mid(select,' + string(li) + ',1)=~'1~',rgb(255,0,0),' + ls_color +')" ' & + 'name = c$' + string(li) ')' idw_dw.modify(ls_syn) next idw_dw.modify('destroy ' + as_col) is_notSelected = Fill('0', li_cnt) return true 그 다음으로, 선택된 텍스트의 위치를 알려주는 함수가 필요하다. 이 함수에서 사용되는 아귀먼트는 선택된 문자, 선택된 문자의 길이 그리고 데이터윈도우에 있는 줄의 개수다. 이 함수를 of_select()라 부르고, 이 함수를 구성하고 있는 스크립트는 아래 List 2나와있다. LISTING 2 public subroutine of_select (integer ai_start, integer ai_len, long al_row); string ls_data ls_data = idw_dw.getItemString(al_row, 'se _lect') if isNull(ls_data) then ls_data = is_notSelected idw_dw.setItem(al_row, 'select', Replace(ls_data, ai_start, ai_len, Fill('1', ai_len) ) ) 마지막으로 우리는 각 줄에서 선택된 내용을 지우는 함수가 필요하다. 이 함수를 of_clear()라 부르고 이 함수를 구성하는 스크립트는 아래 List 3에 나와있다. LISTING 3 public subroutine of_clear (long al_row); idw_dw.setItem( al_row, 'select', is_notSelected ) Conclusion 파워빌더에서는 데이터윈도우 컬럼에 있는 text를 직접적으로 찾아낼 수 있는 방법이 없다. 하지만, 위에서 살펴본 기술을 이용하면 데이터윈도우 컬럼 안에 있는 텍스트의 일부분을 찾아 매칭을 시킬 수 있었다. 우리는 글자 색을 변경하거나, 뒷 배경색을 변경하거나, 글씨를 굵게 아니면 기울리는 등의 우리가 원하는 모든 종류의 텍스트 형태를 이용할 수 있다. 첨부문서 : Highlighting Selected Text in PowerBuilder DataWindow.mht
| |||||