'개~발/Powerbuilder'에 해당되는 글 39건

  1. 2009.03.05 DW 객체 사용하기 by 민서정
  2. 2009.03.05 csv, xls, 탭형식 파일 DW로 import 받기 by 민서정
  3. 2009.03.05 selectrow함수 대신 선택행 글씨 굵게 하고 가독성 높이게 홀수짝수 색상입히는 기술..... by 민서정
  4. 2009.02.19 키입력을 동적으로... by 민서정
  5. 2009.02.19 윈도우를 투명하게... by 민서정
  6. 2009.02.19 Getfreesystemresources() - 메모리관리 by 민서정
  7. 2009.02.19 GetUserNameA() - LAN ID 알아내기 by 민서정
  8. 2009.02.19 ShellExecuteA() - 윈도우 실행 by 민서정
  9. 2009.02.19 윈도우 타이틀색 변경 by 민서정
  10. 2009.02.19 SetEnvironmentVariableA() -환경변수설정 by 민서정

[참고도서] 대림출판사 클릭하세요 파워빌더 11.x

 

이거 원...책 내용을 인용하는데.. 출판사에서 제동걸지 않을려나 모르겠네요..-.-;

아무튼 그래도 유용하게 사용할 수 있을 것이라 판단해서 또 올립니다.

 

데이터 윈도우에서 보통 값을 읽기 위해서 getitem삐리리~ 나, dw_1.object.컬럼[row]를 많이 씁니다.

동일한 표현식은

dw_1.object.Data[row, 컬럼번호]

dw_1.object.컬럼.Primary.Current[row]

dw_1.object.컬럼.Primary[row]

그외....

해당 데이터윈도우 버퍼의 데이터를 모두 받는 건?

dw_1.object.data

 

두번째 행의 모든 값을 받는 건?

dw_1.object.data[2]

 

1행의 첫컬럼부터 2행의 두번째 컬럼까지 받는 건?

dw_1.object.data[1,1, 2, 2]

 

selectrow()함수를 이용해서 선택된 행을 모두 갖고 오는 건?

dw_1.object.Data.Selected

 

모든 행의 특정컬럼 값만 갖고 오는 거?

dw_1.object.컬럼


Posted by 민서정
l
 

파일을 Import 받을때 TXT(탭형식), CSV(쉼표), XLS(엑셀파일)형식을 아래의 하나의 함수로 받을 수 있습니다.

 

//***************************************************************************************//
//* Import file type : TXT(탭형식), CSV(쉼표), XLS(엑셀파일)
//* Function : f_excel_import *//
//* 용 도 : 선택한 파일을 DataWindow에 ImportFile 하기 *//
//* Argument : as_path (처리할 Excel File 경로, 파일명 포함) *//
//*    adw (IMPORT할 DataWindow) *//
//*    as_error ( Reference, Error Msg) *//
//* ReTurn값 : Long( 1 : Success, 0에서 -9 : ImportFile Fail, -10 : FileOpen Fail, *//
//* -11 : FileDelete Fail ) *//
//* 사 용 예 : f_excel_import('C:\TEMP\TEMP.XLS', dw_1, REF ls_err) *//
//***************************************************************************************//

oleobject ole_excel
Boolean lb_select, lb_delete
Integer li_connect, li_open
Long ll_xls, ll_row, ll_import
String ls_open_file, ls_save_file , ls_msg

SetNull(as_error)
ls_open_file = trim(as_path)

IF Len(ls_open_file) = 0 THEN
 as_error = "엑셀 파일의 경로를 입력하세요."
 RETURN -10
END IF

IF Not FileExists(ls_open_file) Then
 as_error = "지정한 파일이 존재하지 않습니다."
 RETURN -10
END IF


if pos(ls_open_file,'CSV') + pos(ls_open_file,'csv') > 0 then
   ll_xls = pos(ls_open_file,'CSV')  //쉼표분리파일
   if IsNull(ll_xls) or ll_xls = 0 then ll_xls = pos(ls_open_file,'csv')
else
   ll_xls = pos(ls_open_file,'xls')  //엑셀파일
   if IsNull(ll_xls) or ll_xls = 0 then ll_xls = pos(ls_open_file,'XLS')
end if

if IsNull(ll_xls) or ll_xls = 0 then //* Excel File이 아니면 Text File인지 체크
 ll_xls = pos(ls_open_file,'txt')  // txt 탭 분리 파일
 if IsNull(ll_xls) or ll_xls = 0 then ll_xls = pos(ls_open_file,'TXT')
 If Not IsNull(ll_xls) or ll_xls > 0 then
  ls_save_file = ls_open_file
  goto excel_import
 END IF
 
 as_error = "Excel 파일이 아닙니다."
 Return -10
end if

ole_excel = CREATE OLEobject

li_connect = ole_excel.ConnectToObject("","excel.application")

IF li_connect = -5 THEN
 // -5 Can't connect to the currently active object
 li_connect = ole_excel.ConnectToNewObject("excel.application")
END IF

IF li_connect <> 0 THEN
 SetPointer(Arrow!)
 CHOOSE CASE li_connect
    CASE -1
     ls_msg = "Invalid Call: the argument is the Object property of a control~r~n"
    CASE -2
     ls_msg = "Class name not found~r~n"
    CASE -3
     ls_msg = "Object could not be created~r~n"
    CASE -4
     ls_msg = "ould not connect to object~r~n"
    CASE -9
     ls_msg = "Other error~r~n"
    CASE -15
     ls_msg = "MTS is not loaded on this computer~r~n"
    CASE -16
     ls_msg = "Invalid Call: this function not applicable~r~n"
    CASE ELSE
     ls_msg = "If any argument's value is NULL, ConnectToNewObject returns NULL.~r~n"
 END CHOOSE
 DESTROY ole_excel
 as_error = '엑셀 프로그램을 실행할 수 없습니다. ~r~n'+ls_msg
 RETURN -10
END IF

SetPointer(HourGlass!)

ole_excel.WorkBooks.Open(ls_open_file)
ole_excel.Application.Visible = FALSE

lb_select = ole_excel.WorkSheets(1).Activate

ls_save_file = mid(ls_open_file, 1, ll_xls -2) + string(now(),'hhmmss') + ".txt"

ole_excel.Application.Workbooks(1).Saveas(ls_save_file, -4158)
ole_excel.WorkBooks(1).Saved = TRUE

ole_excel.WorkBooks.Close() //파일삭제

ole_excel.Application.Quit
ole_excel.DisConnectObject()

DESTROY ole_excel

excel_import:


ll_import = adw.importfile(ls_save_file) // 1번라인부터 입력
//ll_import = adw.importfile(ls_save_file,2)

SetPointer(Arrow!)

IF ll_import < 1 Then
 MessageBox("ERROR", "파일 처리에 실패 하였습니다.(" + ls_save_file + ")", StopSign!)
 Return ll_import
END IF

adw.accepttext()

IF NOT FileDelete(ls_save_file) THEN
 MessageBox("ERROR", "파일 삭제에 실패 하였습니다.(" + ls_save_file + ")", StopSign!)
 Return -11
END IF

Return 1

==============================================================================================
/* 사용예*/
/*import 할  파일의 컬럼수와 동일한 DW가 생성되어 있어야한다.*/

 s_result = GetFileOpenName ("Select File", s_FileName1, s_FileName2, "CSV", &
         + "CSV(쉼표로 분리), *.csv,Excel Files (*.xls), *.xls, ")

 IF s_result <> 1 THEN return 0
 dw_k.SetItem(1, "file_name", s_FileName1)
 
 if not FileExists(s_FileName1) then return 0
 
 dw_excel.Reset()
 
 f_excel_import(s_FileName1, dw_excel, REF ls_err)


Posted by 민서정
l

 

/* 선택행에 대한 표시 */
Integer li_exit, li_x, li_y, li_colTabsequence
string ls_col_name, ls_objects, ls_type, ls_col_type, ls_band
long ll_row
li_exit = 0
ls_objects = string(this.Object.DataWindow.objects)
do while true
 if pos(ls_objects,'~t') > 0 then
  ls_col_name = left(ls_objects,pos(ls_objects,'~t') - 1)
  ls_objects = mid(ls_objects,pos(ls_objects,'~t') + 1)
 else
  ls_col_name = ls_objects
  li_exit = 1
 end if
  ls_type = this.describe(ls_col_name + ".type")
  ls_band = this.describe(ls_col_name + ".band")
 if ls_type = 'text' then
 else
  if ls_col_name <> "RowNum" Then
   li_colTabsequence += 10
   this.Modify(ls_col_name+'.background.mode="2"')
   
   /*현재Row에 대한 색상과 Row별 라인이 색상이 반복적으로 보여줌 - 가독성을 높이기 위해 */
   //this.Modify(ls_col_name+'.background.color="536870912~tif (currentrow() = getrow() ,rgb(91,151,83) , if( mod( getrow(),2) = 1 ,RGB(236,243,235) , RGB(222,235,220) ) )"')
   this.Modify(ls_col_name+'.background.color="536870912~tif (currentrow() = getrow() ,rgb(232,234,149) , if( mod( getrow(),2) = 1 ,RGB(236,243,235) , RGB(222,235,220) ) )"')
   
   /* 현재Row 표시를 폰트 굵게 표시  */
   this.Modify(ls_col_name+'.font.weight="400~tif (currentrow() = getrow() ,700 , 400)"')
  
  end if
 end if
 
 this.Modify(ls_col_name+'.font.face="굴림체"')
 
 if li_exit > 0 then exit

loop
/* 선택행에 대한 표시 끝 */

Posted by 민서정
l
http://pbdc.pe.kr 벽산님 글 발췌

키입력을 동적으로...

파워빌더 개발자라면 파워빌더에는 다른 응용프로그램에 키 입력을 발생시키는 방법이 없다는 것을 알고 있을 것이다.
그렇지만 운영체제 수준의 API를 사용한 방법은 있다.
이런 기능은 사용자이름과 암호를 사용자가 직접 입력하지 않고 파워빌더가 직접 입력하도록 할 때 상당히 유용하다.
또한 이 기능은 파워빌더가 만든 윈도우에만 한정되어 있지 않다.
이 API호출은 키보드 이벤트를 발생시켜 키가 눌린 것처럼 해서 현재 활성화가 되어 있는 어떤 윈도우에라도 나타나게 된다.
심지어 다른 제품의 윈도우라도 이것은 가능하다.

다음 표는 키보드와 연계되어 있는 가상 키값을 나타내고 있다.
이 값들이 키보드 이벤트 API에 전달되면 그 값에 해당하는 키가 눌린 것처럼 되며 출력 될 것이며 그 동작은 마치 사용자가 직접 키를 누른 것과 동일하다.

Key

Ascii

Key

Ascii

Key

Ascii

Key

Ascii

L-Button

1

2

50

W

87

F12

123

R-Button

2

3

51

X

88

F13

124

Cancel

3

4

52

Y

89

F14

125

M-Button

4

5

53

Z

90

F15

126

Back

8

6

54

NP - 0

96

F16

127

Tab

9

7

55

NP - 1

97

F17

128

Clear

12

8

56

NP - 2

98

F18

129

Return

13

9

57

NP - 3

99

F19

130

Shift

16

A

65

NP - 4

100

F20

131

Control

17

B

66

NP - 5

101

F21

132

Menu

18

C

67

NP - 6

102

F22

133

Pause

19

D

68

NP - 7

103

F23

134

Cap

20

E

69

NP - 8

104

F24

135

Escape

27

F

70

NP - 9

105

Numlock

144

Space

32

G

71

*

106

Scroll

145

Prior

33

H

72

+

107

Rshift

161

Next

34

I

73

-

109

L-Ctrl

162

End

35

J

74

.

110

R-Ctrl

163

Home

36

K

75

/

111

L-Menu

164

Left

37

L

76

F1

112

R-Menu

165

Up

38

M

77

F2

113

=

187

Right

39

N

78

F3

114

,

188

Down

40

O

79

F4

115

[

189

Select

41

P

80

F5

116

.

190

Print Scrn

44

Q

81

F6

117

/

191

Insert

45

R

82

F7

118

'

192

Delete

46

S

83

F8

119

[

219

Help

47

T

84

F9

120

/

220

0

48

U

85

F10

121

]

221

1

49

V

86

F11

122

'

222


동적으로 프린트스크린 키가 눌리도록 하려면:
외부 함수 선언:
SUBROUTINE keybd_event( int bVk, int bScan, int dwFlags, int dwExtraInfo) LIBRARY "user32.dll"
 
Powerscript: (Print Screen을 발생시킨다)
keybd_event( 44, 1, 0, 0 ) // 전체 화면을 클립보드에 복사한다.
keybd_event( 44, 0, 0, 0 ) // 현재 활성화된 윈도우만 클립보드에 복사한다. ALT+PRTSCR과 동일하다.

Powerscript: (다음 코드는 동적으로 붙여넣기 동작을 발생시킨다.CTRL + V를 누른것과 동일하다.)
rte_1.setfocus()
send(handle(rte_1),770, 0, 0)


다른 키들의 동적 발생:
외부 함수 선언:
SUBROUTINE keybd_event( int bVk, int bScan, int dwFlags, int dwExtraInfo) LIBRARY "user32.dll"
Powerscript: (이 스크립트는 'A'키가 눌린 것처럼 할 것이다.)
integer li_vkey
li_vkey = 65
sle_1.setfocus() // SLE에 포커스가 오게 해서 눌리는 키가 나타나게 한다.
keybd_event( li_vkey, 1, 0, 0 ) // 위의 표를 참조해서 어떤 키가 눌린 것인지 확인해 보자

파워빌더가 메모장에 메시지를 입력하도록 하기:
다음 코드는 메모장을 직접 실행해서 string ls_msg안의 문장을 입력한다.
문자열은 대문자로 되어 있지만 출력되는 내용은 현재 키보드의 상태가 무엇인지에 따라 달라질 것이다.
만약 "Caps Lock"키가 눌려진 경우는 대문자로 나오겠지만, 그렇지 않으면 소문자로 나오게 된다.
이런 기능은 모든 응용프로그램에도 적용할 수 있으며, 이를테면 로터스노츠의 사용자이름과 암호 입력창에도 사용할 수 있는 것이다.


외부 함수 선언:
SUBROUTINE keybd_event( int bVk, int bScan, int dwFlags, int dwExtraInfo) LIBRARY "user32.dll"


PowerScript:
integer li_loop, li_len, li_asc
string ls_msg = "POWERBUILDER IS TYPING THIS INTO NOTEPAD" + char(110) + char(13)

// 마침표(.)와 리턴키가 눌린 것처럼 한다.
run("Notepad.exe")
li_len = len(ls_msg)
yield() // 컴퓨터에 메모장을 실행할 약간의 여유를 준다.

for li_loop = 1 to li_len
li_asc = asc(mid(ls_msg,li_loop,1))
keybd_event(li_asc, 1, 0, 0)
yield() // 버퍼가 넘치기 전에 메모장에 글씨가 입력되도록 한다.
Next

 
기능키를 특정 키입력에 연결하기:

다음 코드는 F4를 누르면 Shift+Tab이, F5를 누르면 Tab이 눌린 것처럼 나타나게 한다.
이 API호출은 동적인 키 눌림과 적절한 쉬프트키의 해제 순서를 정확히 맞추어 주어야 한다.

외부함수 선언:
SUBROUTINE keybd_event( int bVk, int bScan, int dwFlags, int dwExtraInfo) LIBRARY "user32.dll"
Script: (pbm_dwnkey에 연결된 사용자 이벤트)
Choose Case key
Case KeyF4! // F4를 누르면 역방향으로 컬럼이 움직인다.
keybd_event(16,0,0,0) // SHIFT가 눌렸다.
keybd_event(9,0,0,0) // TAB이 눌렸다.
keybd_event(16,0,2,0) // SHIFT가 띄어졌다. (생략 불가능)
keybd_event(9,0,2,0) // TAB이 띄어졌다. (생략가능)
Case KeyF5! // F5를 누르면 앞으로 컬럼이 움직인다.
keybd_event(9,0,0,0) // TAB이 눌렸다.
keybd_event(9,0,2,0) // TAB이 띄어졌다. (생략가능)
End Choose

Posted by 민서정
l

윈도우를 투명하게...

//투명..
        long HWND, value,rtn
        HWND =handle(this)
        value = 15
        rtn = GetWindowLongA(hWnd, GWL_EXSTYLE)
        rtn = WS_EX_LAYERED
        rtn = SetWindowLonga(HWND, GWL_EXSTYLE, rtn)
        SetLayeredWindowAttributes(HWND, 0, (255 * Value) / 100, LWA_ALPHA)


FUNCTION long GetWindowLongA(long hwnd,long nOffset) library "user32.dll"
FUNCTION long SetWindowLongA(Long HWND,Long nIndex,Long dwNewLong) library "user32.dll"
FUNCTION Long SetLayeredWindowAttributes(Long hWnd,Long crKey,long bAlpha,Long dwFlags) LIBRARY "user32.dll"

//instance variable 설정
CONSTANT long GWL_EXSTYLE = (-20)
CONSTANT long WS_EX_LAYERED = 524288
CONSTANT long LWA_COLORKEY = 1
CONSTANT long LWA_ALPHA = 2
CONSTANT long ULW_COLORKEY = 1
CONSTANT long ULW_ALPHA = 2
CONSTANT long ULW_OPAQUE = 4
Long Value
Posted by 민서정
l


프로그램을 사용하다 보면 메모리 문제로 많은 고민을 하게 됩니다.
하지만 이런 메모리 문제는 윈도우의 API 함수를  이용해 프리 메모리(Free Memory) 공간에  대한 정보를 알아내어 적절히 처리할 수 있습니다.

먼저 local  external function에  
'Function uint Getfreesystemresources (uint resource) Library "user.exe"'
라고 정의한 후 윈도우의 오픈 이벤트에서 다음의 스크립트를 작
성해주면 됩니다.

uint li_rsc
PowerObject lpo_parm

li_rsc = GetFreeSystemResources(0)
if li_rsc < 25 then
  lpo_parm = Message.PowerObjectParm
  /* 경고 메시지를 보내준다 */
  Message.PowerObjectParm = lpo_parm
end if

조건문의 체크는 사용 가능한 메모리가 25%  이하면 프로그램을
사용할 수 없음을 확인하는 것입니다. 물론 이 %는 원하는 대로
지정할 수 있습니다.
Posted by 민서정
l


파워빌더에서 사용자 LAN ID 알아내기

이 경우에는 WIN32  API를 사용해야  합니다. 다음과 같이 GetUserNameA() WIN32 API 함수를 이용해 사용자의 LAN ID를 알아낼 수 있습니다.

//먼저 외부 함수로 GetUserNameA()를 다음과 같이 정의
Function boolean GetUserNameA( ref string userID, ref ulong len ) library "ADVAPI32.DLL"

//파워빌더 스크립트로
string  login_name
string  ls_temp
ulong   lul_value
boolean lb_rc

lul_value = 255
ls_temp = Space( 255 )
lb_rc = GetUserNameA( ls_temp, lul_value )
login_name = Trim( ls_temp )
Posted by 민서정
l

 ShellExecuteA() - 윈도우 실행

FUNCTION long ShellExecuteA( long hWnd, REF String s_Operation, REF String s_File, REF String s_Parameters, REF String  s_Directory, INT nShowCmd ) library 'shell32'
------------------------------------------------------------------------
// Script 기술 내용.

String ls_Command, ls_Dir, ls_Args, ls_app

setNull(ls_Args)
setNull(ls_URL)

ls_Command = 'open'
ls_app = 'notepad'

ShellExecuteA(0, ls_Command, ls_app, ls_Args, ls_Dir, 0 )

// 즉, 윈도우의 시작버튼/실행 을 실행시켜 ls_app의 내용을 입력해준것과 같은 동작을 하게 됩니다.
Posted by 민서정
l

FUNCTION Boolean SetSysColors(int cEt, REF int lpaEt, REF ulong lpaRV) Library "user32.dll"

// Script
constant Long WINDOW_TITLE = 2
constant Long COLOR_BACKGROUND = 1

ulong    ll_return

ll_return =12545856 //Color 값

SetSysColors(COLOR_BACKGROUND ,WINDOW_TITLE,ll_return)
Posted by 민서정
l

Global External Function:
FUNCTION boolean SetEnvironmentVariableA( string  lpszName, string lpszValue )
LIBRARY "kernel32.dll"

Script:
Boolean  lb_ret

lb_ret = SetEnvironmentVariableA( "path", &
"C:\MYPROGRAM\BIN;C:\MYPROGRAM\DATA;C:\WINDOWS\SYSTEM;" )

IF lb_ret <> TRUE THEN
  MessageBox("환경 화일 오류", "Path 저장중 오류 발생" )
  Return -1
Else  
  return 1
END IF
Posted by 민서정
l