[ 파워빌더.Tab - tab control에서 만들었다 없앴는데도 1개가 남는 문제  ]

 

 

  설명이 어렵네요..

tab에서 탭의 수를 알아내는 방법이

int li_no
li_no = upperbound(tab_1.control)  // or upperbound(tab_1.control[])

이런식인데요

첨에는 이걸로 현재 열린 탭의 수가 몇개인지 열린탭을 모두 제거시켰을 때
제거가 되어 있는지 등 알아낼 수 있는데요

첨에는 탭은
저 li_no값이 0을 리턴합니다. 즉, 전혀 열려진 탭이 없다는 뜻이죠

근데 탭을 추가했다가 모두 비워버렸는데도

저 tab_1.control에는 1개가 존재하더라구요.
그 1개가 정상적인지 아닌지 확인하려니 확인할 길이 없어 3시간 헤맸네요

tab_1.control[1].classname()
뭐 이런걸로는 안됩니다.
isnull(tab_1.control[1]) 하면 false을 리턴하면서 null이 아니라고 알려주니
황당하더군요.

그러다가 알았는데

isvalid(tab_1.control[1])을 해 보면 false을 리턴해 줍니다.
정상적으로 tab에 1개의 오브젝트가 들어가 있다면 여기서 true을 리턴하거든요.


도움이 되셨음 좋겠습니다.

 

'파워빌더 > Tab' 카테고리의 다른 글

파워빌더 Tab Page 이동 하기  (0) 2017.01.26
Posted by 농부지기
,

[ 파워빌더.Picturecontrol - 클리어(초기화)  ]

 

  혹시나 싶어 적어봅니다..

PBDN 에서 찾은건데.. ㅠ.ㅠ

blob 형식의 파일을 Picturecontrol 에 setpicture로 뿌린뒤..

초기화 방법 찾으시는 분있으실까봐..

Setnull(blob 변수)

p_1.setpicture(blob 변수)

이렇게 해봤지만.. 안되더군요...

그런데..

p_1.PictureName = Space(1)

Posted by 농부지기
,

[ 파워빌더.MultiLIneEdit - 기본 ]

 

☞   

 

 

MLE에서 현재의 행위치와 컬럼의 위치를 계산 해보겠습니다.

 

/*  현재의 행과 컬럼의 위치 계산 */
il_Line = SelectedLine()
il_Column = of_getlinecolumn( il_Line )
is_line   = String(il_Line,'0000')
is_column = String(il_Column,'0000')

 

/* of_getlinecolumn ( ai_line )
 현재 행에서 위치한 컬럼의 위치
*/
Long    l_Len, l_cnt, l_loop
integer i_column, i
string  ls_line[]
l_Len = of_stringarray( ls_line )
l_loop = ai_line - 1
for i = 1 to l_loop
 l_cnt += Len( ls_line[i] )
next
i_column = Position() - l_cnt - ai_line - ai_line + 2
return i_column

/* integer of_stringarray ( ref String as_line[] )
 Line을 Line별 배열로 만든다.
 반환값은 라인의 갯수
*/

Integer li_pos, i
String   ls_text, ls_char
ls_char = '~r~n'
ls_text = Text + ls_char
li_pos  = Pos(ls_text, ls_char)
i = 0
do while li_pos > 0
 i ++
 as_line[i] = Left(ls_text, li_pos - 1)
 ls_text = mid(ls_text, li_pos + Len(ls_char) )
 li_pos  = Pos(ls_text, ls_char)
Loop

Return UpperBound(as_line)

Posted by 농부지기
,

[ 파워빌더.Window - Timer ]

 

☞   

  Timer는 Window에 있는 기능이죠.

X초가 지나면 Timer 이벤트를 실행시켜라..

API로도 있죠. 1/1000초 단위로 컨트롤 해주는.
FUNCTION ULONG SetTimer(long hwnd, ULONG nIDEvent, ULONG elapse, long zero) LIBRARY "USER32.DLL"FUNCTION BOOLEAN KillTimer(long hwnd, ULONG nIDEvent) LIBRARY "USER32.DLL"

그리고 또.. Object Timing이 있습니다.
Window에 있는 Timer랑 동일합니다.

1개를 생성해보겠습니다.
=============================================================================
forward
global type n_timing from timing
end type
end forward

global type n_timing from timing
event ue_setparent ( readonly powerobject apo_parent,  readonly string as_event )
end type
global n_timing n_timing

type variables
Protected:

powerobject ipo
string is_event
end variables

event ue_setparent(readonly powerobject apo_parent, readonly string as_event);/*-------------------------------------------------------
오브젝트명  : n_timing
이  벤  트  : ue_setParent
비      고  : 2007.07.29  By JH
-------------------------------------------------------*/
ipo = apo_parent
is_event = as_event
end event

on n_timing.create
call super::create
TriggerEvent( this, "constructor" )
end on

on n_timing.destroy
TriggerEvent( this, "destructor" )
call super::destroy
end on

event timer;/*-------------------------------------------------------
오브젝트명  : n_timing
이  벤  트  : Timer
비      고  : 2007.07.29  By JH
-------------------------------------------------------*/
IF ISVALID(ipo) THEN
ipo.TriggerEvent(is_event)
END IF
end event
=============================================================================

Timing Object 를 상속받는 n_timing Object이죠.

n_timer.Start(Integer Num) : Num 초 주기로 Timer를 발생시킨다.
n_timer.Stop() : Timer 구동 중지
n_timer.ue_setparent(Object, Event ID) : 정해진 시간 이후에 Object의 Event를 호출한다.

Non-Visual Object 이기 때문에 Object내에서 사용하시려면
Instance로 사용하셔야 합니다.

PB 특성상 Event 또는 Function이 끝나면 그 안에 선언된 변수 메모리는 반환(자동 소멸)되니까요.

수고하세요

 

Posted by 농부지기
,

[ 파워빌더.ListView - 기본 ]

 

☞   

 

오브젝트 하나 만들어 달라고 해서 만들면서 만든 함수 하나 소개 할까 합니다.

DW를 그리지 않고 DS 와 ListView를 이용하여 SQL Select 를 실행하고 결과를 보여주기 입니다.

필요없다고 생각하지 마시고 파빌을 이렇게도 사용가능하구나 하고 너그럽게...

///--------------------------------------------------------------------------------------

// long of_autolistview( listview alv_list, string as_SQL, transaction atrans )

// 반환값 : 행 갯수

// 전달값 1 : 보여질 ListView

// 전달값 2 : SQL 스크립트

// 전달값 3 : 트렌젝션
DataStore lds
Long      row, rowcnt, lpos
String    ls_tmp, ls_SQL, ls_column[], ls_DWsyntax, ls_ColType
Integer   i, li_Item
Any       la_data[]

as_sql = Upper( as_sql )
// Select 문인지 검사한다.
lpos = Pos(as_sql,'SELECT')
ls_SQL = Trim( Upper(Mid(as_sql, lpos, Len('SELECT') )) )
if ls_SQL <> Upper('SELECT') then Return 0
// 컬럼의 갯수를 파악한다.
lpos   = Pos(as_sql,'SELECT')
ls_SQL = Upper(Mid(as_sql, lpos + Len('SELECT') ))
ls_SQL = Left(ls_SQL, Pos(ls_SQL, 'FROM') - 1 )
ls_SQL = Trim(ls_SQL) + ','
lpos = Pos(ls_SQL, ',')
i = 0
Do While lpos > 0
 ls_tmp = ''
 ls_tmp = Left( ls_SQL, lpos - 1 )
 ls_SQL = Mid( ls_SQL, lpos + 1 )
 if Not ( Trim(ls_tmp) = '' or IsNull(ls_tmp) ) then
  i ++
  ls_column[i] = ls_tmp
 end if
 lpos = Pos(ls_SQL, ',')
Loop
// ListView를 컬럼 형식으로 조정한다.
alv_list.View = listviewreport! // List형식으로
alv_list.SortType = UnSorted!   // 정렬하지 않음
alv_list.ButtonHeader = true    // 제목을 버튼으로
alv_list.Hideselection = false  // 선택 사용
alv_list.FullRowSelect = true   // 행선택 사용
alv_list.FaceName = '굴림'
alv_list.TextSize = 12
// 파악한 컬럼을 가지고 ListView 컬럼을 만들과 변수를 초기화 한다.
For i = 1 to UpperBound(ls_column)
 alv_list.AddColumn(ls_column[i], Left! , 800)
 la_data[i] = ''
Next
// 자료를 조회 한다.
lds = Create DataStore
ls_SQL = as_sql
ls_DWsyntax = atrans.SyntaxFromSQL(ls_SQL, "style(type=grid)", ls_SQL)
lds.Create ( ls_DWsyntax )
lds.SetTransObject( atrans )
rowcnt = lds.Retrieve()

// 조회된 값을 넣는다.

alv_list.SetRedraw(false)

alv_list.DeleteItems()
for row = 1 to rowcnt

 for i = 1 to UpperBound(ls_column)
  // Column Type 에 따른 값읽기
  ls_ColType = Lower ( ls_column[i]+'.ColType' )
  ls_ColType = lds.describe(ls_ColType)
  if Pos(ls_ColType,'(') > 0 then
   ls_ColType = Left(ls_ColType, Pos(ls_ColType,'(') - 1)
  end if
  choose case ls_ColType
   case 'decimal' ;la_data[i] = lds.GetItemDecimal (row,i)
   case 'char'  ;la_data[i] = lds.GetItemString  (row,i)
   case 'date'  ;la_data[i] = lds.GetItemDate    (row,i)
   case 'time'  ;la_data[i] = lds.GetItemTime    (row,i)
   case 'datetime';la_data[i] = lds.GetItemDateTime(row,i)
   case else  ;la_data[i] = lds.GetItemNumber  (row,i)  //'number', 'long', 'real'
  end choose
  if i = 1 then
   // 첫컬럼이면 행추가
   li_Item = alv_list.AddItem(String(la_data[i]), 1)
  else
   alv_list.SetItem(li_Item, i, String(la_data[i]))
  end if
 Next
next

alv_list.SetRedraw(true)
DESTROY lds

return rowcnt

 

Posted by 농부지기
,

[ 파워빌더.TreeView - 기본 ]

 

  

 
전체 아이템갯수
     li_count = Send(handle(treeview_control), 4357, 0, 0)

보이는 아이템갯수
     li_count = Send(handle(treeview_control), 4368, 0, 0)

 

Posted by 농부지기
,

[ 파워빌더.PopUp - POP or RESPONSE를 MDI 가운데로 ]

 

☞   

 

쪽지로 문의 하셔서 간단하게 올려 봅니다.

제목 그대로 mdi윈도를 따라다니도록 하는 스크립트

window open event에서 다음과 같이

//===========================================================

window lwin
hide()
post show()
lwin = ParentWindow()
if IsValid( lwin ) then
 Do While IsValid( lwin )
  if lwin.Windowtype = MDI! or lwin.Windowtype = MDIHelp! then
   exit
  end if
  lwin = lwin.ParentWindow()
 Loop
else
 This.center = true
end if
if IsValid( lwin ) then
 if lwin.width < This.width then
  This.x = lwin.x
 else
  This.x = lwin.x + ( ( lwin.width - This.width ) / 2 )
 end if
 if lwin.height < This.height then
  This.y = lwin.y
 else
  This.y = lwin.y + ( ( lwin.height - This.height ) / 2 )
 end if
end if

//===========================================================

이케하면 되고요

appeon에서는 테스트 안했습니다.

환경이 되시는분 테스트 부탁 합니다.

Posted by 농부지기
,

[ 파워빌더.PopUp - 팝업창에서 부모창에 datawindow넘기기 ]

 

 

 


1. 자식창에서 종료할때
   CloseWithReturn(This, 넘길 데이타윈도우)
 

2. 호출한 부모창에서
   datawindow ldw
    자식창 호출
   Open(자식창)
   ldw = Message.PowerObjectParm

'파워빌더 > PopUp' 카테고리의 다른 글

파워빌더.PopUp - POP or RESPONSE를 MDI 가운데로  (0) 2017.01.26
Posted by 농부지기
,

[ 파워빌더.Window - 인쇄 ]

 

 

메뉴에서 "화면인쇄" 목록만들고

Click Event에 아래와 같이 넣으시면됩니다...

활성화된 윈도우만 A4  1/2 사이즈로 인쇄됩니다.

long Job
Job = PrintOpen( )
boolean bValid
window wSheet
wSheet = w_main.GetFirstSheet()
bValid = IsValid (wSheet)
if bValid then
wSheet.Print(Job, 1000,500, 6000,4500)
end if
PrintClose(Job)

 

Posted by 농부지기
,

 

[ 파워빌더.Window - 타원형 window 만들기 ]

 

 

파워빌더에서도 API함수를 이용하면 원하는 모양의 윈도우를 만들수 있습니다. 저도한번 해봤는데, 꽤 신기하네요 ~

 

1.Gloval External Function에 다음과 같이 선언

*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

  Function long CreateEllipticRgn( long lX1, long lY1, long lX2, long lY2 ) Library "gdi32.dll"
  Function long SetWindowRgn( long lHandle, long lRgn, boolean bIsRedraw ) Library "user32.dll"
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
2.윈도우 open script에 작성

*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
Long hRgn
hRgn = CreateEllipticRgn( 0, 0, This.Width/5, This.Height /4)
SetWindowRgn( Handle( This ), hRgn, True )
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
※ CreateEllipticRgn() 함수는 타원형 함수입니다.


기존의 딱딱하기만 한 네모 모양의 윈도우 형태를 떠나서 이렇게 시도해보는것도 재미있을 것 같네요.

디자인만 잘 한다면 괜찮은 걸 만들수도 있을 것 같아요. 예를 들면 아래 그림처럼...(하얀바탕이 네모라면.. 저런식으로 타원생성)

   

Posted by 농부지기
,