[ 파워빌더.공통함수 - 10진수 <-> 36진수 ]

 

☞   

 

응? 파워빌더에서 진수 변환을 쓸 일이 있을까?

오늘 드디어 쓰게 됐네요. ^^;

 

PK는 1개 이고..

MS SQL NChar(17) 로 만들어진 테이블이 있습니다.

중복 방지용으로만 코드를 만들었으면,

정말 넘치고 넘칠 정도로 데이터를 저장 할 수 가 있습니다.

 

예) YYYYMMDD+SEQ(9)

(연번을 9자리 주는 경우는 없죠 ㅡㅡㅋ)

 

근데, 문제는 코드 생성을 각각 자리마다 무언가 의미를 주다보니

Sequence를 겨우 2자리만 쓸 수 있는 상태입니다.

 

즉, "01" ~ "99"... "100" Error!!!!

관계있는 Table도 있어서 18자리로 늘리기도 힘들고..

 

그래서 머리 굴린 결과... ('' ) ( '') ( ..) (.. ) 데구르르 ~~

0~9 A~Z 총 36개 문자를 이용해서 36진수로 해결하자.

2자리로도 "01" ~ "ZZ" 까지 총 1295개 처리가 가능하더라구요.

Sort 도 문제 될게 없고.. 굿~!

 

Table 설계 하시는 분.. 개발자를 위해서 Seq 넉넉하게 잡아주세요!!!

또, Seq 짧게 잡으면 미워합니다. ㅎㅎㅎ

 

 

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

// 10진수 -> 36진수 변환

// gf_decto36(Decimal ad_Value) Return String

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

String  ls_Char, ls_36
Decimal ld_Num


Do While ad_Value > 0
 ld_Num = Mod(ad_Value, 36)
 ls_Char = Mid("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", ld_Num + 1, 1)
 ls_36  = ls_Char + ls_36
 ad_Value = Int(ad_Value / 36)
Loop

Return ls_36

 

 

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

// 36진수 -> 10진수 변환

// gf_36todec(String as_Value) Return Decimal

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

String  ls_Reverse, ls_Char
Decimal ld_Pos, ld_Num, ld_Dec


ls_Reverse = Reverse(as_value)

For ld_Pos = 1 To Len(ls_Reverse)
 ls_Char = Upper(Mid(ls_Reverse, ld_Pos, 1))
 ld_Num = Pos("123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", ls_Char)
 ld_Dec = ld_Dec + ( ld_Num * ( 36 ^ ( ld_Pos - 1 ) ) )
Next

Return ld_Dec

Posted by 농부지기
,

[ 파워빌더.공통함수 -  시간 지연 시키기  ]

 

☞   

 

Fuction wf_delay(integer ai_second) return None

 

//ai_second 만큼 뺑뺑이를 돌린다.
time lt_start
lt_start = now()
do while true
 do while Yield()
 loop
 if SecondsAfter ( lt_start, now() ) >= ai_second then
  exit
 end if
loop

Posted by 농부지기
,

[ 파워빌더.공통함수 - 숫자를 한들로 변환  ]

 

☞   

 

//* ======================================================================*
//*  f_amount() : 아라비아 숫자로 표기된 금액을 한글로 변환해 주는 함수
//*              천조단위( 16자리 ) 까지 표시 ( 1,000,000,000,000,000 )
//*      
//*  Example    :  ₩123,456,789   
//*            --> 일금 일억이천삼백사십오만육천칠백팔십구 원정
//*  구분(flag) : '1' 한글, '2' 한자.
//*---------------------------------------------------------------------- *
Double  db_amount
String ls_amount, ls_money,  ls_knum,    ls_kor_amount,Ls_hanja,ls_mhanja
string   ls_hanja_amount,ls_return
Long l_cnt,    l_cipher,     l_cipher_1
//*----------------------------------------------------------------------*
db_amount   =   target
ls_amount   =  String(db_amount) //  입력된 수치값을 문자로 변환
l_cipher    =  len(ls_amount)  //  자릿수를 구함
l_cipher_1  = l_cipher + 1  //  단위를 구하기 위해 초기값 부여( 자릿수 + 1 )
//*----------------------------------------------------------------------*
FOR l_cnt = 1 TO  l_cipher
l_cipher_1   = l_cipher_1  -  1   //  자릿수가 증가할때 감소시킴( 초기값 : 자릿수 )
//*----------------------------------------------------------------------*
CHOOSE CASE Mid(ls_amount, l_cnt, 1)  //  해당 자릿수의 숫자 변환( 한글 )
  CASE '1'
 If L_Cnt = L_cipher Then
  ls_knum = '일'
  ls_hanja =  '壹'
 Else
  ls_knum = ''
  ls_hanja =  ''
 End If
  CASE '2'
 ls_knum = '이'
 ls_hanja =  '貳'
  CASE '3'
 ls_knum = '삼'
 ls_hanja =  '參'
  CASE '4'
 ls_knum = '사'
 ls_hanja =  '四'
  CASE '5'
 ls_knum = '오'
 ls_hanja =  '五'
  CASE '6'
 ls_knum = '육'
 ls_hanja =  '六'
  CASE '7'
 ls_knum = '칠'
 ls_hanja =  '七'
  CASE '8'
 ls_knum = '팔'
 ls_hanja =  '八'
  CASE '9'
 ls_knum = '구'
 ls_hanja =  '九'
  CASE ELSE
 ls_knum = '00'
 ls_hanja =  '  '
END CHOOSE
//*----------------------------------------------------------------------*
CHOOSE CASE l_cipher_1 // 해당 자릿수의 단위 표시
  CASE  1
//  If L_Cnt = L_cipher Then
//   ls_knum = '일'
//   ls_hanja =  '壹'
//  Else
//   ls_knum = ''
//   ls_hanja =  ''
//  End If   
    ls_money = ''
 ls_mhanja = '' 
CASE  2,  6, 10, 14
 ls_money = '십'
 ls_mhanja = '十' 
  CASE  3,  7, 11, 15
 ls_money = '백'
 ls_mhanja = '百' 
  CASE  4,  8, 12, 16
 ls_money = '천'
 ls_mhanja = '千' 
  CASE  5
 ls_money = '만'
 ls_mhanja = '萬' 
  CASE  9
 ls_money = '억'
 ls_mhanja = '億' 
  CASE 13
 ls_money = '조'
 ls_mhanja = '兆' 
END CHOOSE
//*----------------------------------------------------------------------*
//*  해당 자릿수의 단위가 0(ZERO)인 경우 단위표시를 하지 않음
//*----------------------------------------------------------------------*

IF ls_knum <> '00' THEN
 ls_kor_amount = ls_kor_amount + ls_knum + ls_money
 ls_hanja_amount = ls_hanja_amount + ls_hanja + ls_mhanja
ELSEIF l_cipher_1  =   5  THEN
 IF Mid(ls_amount, l_cnt - 3, 4) <> '0000'  THEN
  ls_kor_amount = ls_kor_amount + ls_money
    ls_hanja_amount = ls_hanja_amount + ls_mhanja  
 END IF
ELSEIF l_cipher_1  =   9  THEN
 IF Mid(ls_amount, l_cnt - 3, 4) <> '0000'  THEN
  ls_kor_amount = ls_kor_amount + ls_money
    ls_hanja_amount = ls_hanja_amount + ls_mhanja     
 END IF
ELSEIF l_cipher_1  =  13  THEN
 ls_kor_amount = ls_kor_amount + ls_money
    ls_hanja_amount = ls_hanja_amount + ls_mhanja    
ELSE
 ls_kor_amount = ls_kor_amount
   ls_hanja_amount = ls_hanja_amount
END IF
NEXT
//*----------------------------------------------------------------------*
//ls_kor_amount =  '일금 ' + ls_kor_amount + ' 원정'
//*----------------------------------------------------------------------*

if flag = '2' then
ls_return = ls_hanja_amount
else
  ls_return = ls_kor_amount
end if

RETURN trim(ls_return)
//*======================================================================*
http://cafe.naver.com/pentaeduclub.cafe

Posted by 농부지기
,

[ 파워빌더.공통함수 - 실행중인 파일명 찾기 ]

 

☞   

 

현재 윈도우에서 해당 파일명으로 프로세스가 실행중인지 아닌지 알고 싶을 때,

다음과 같이 해서도 찾을 수 있습니다.

 

외부함수 선언)

Function ulong CreateToolhelp32Snapshot (ulong dwFlags, ulong th32ProcessID) Library "KERNEL32.DLL"
Function boolean Process32First (ulong hSnapshot, ref PROCESSENTRY32 lppe) Library "KERNEL32.DLL" alias for "Process32First;Ansi"
Function boolean Process32Next (ulong hSnapshot, ref PROCESSENTRY32 lppe) Library "KERNEL32.DLL" alias for "Process32Next;Ansi"
Function boolean CloseHandle (ref ulong hObject) Library "KERNEL32.DLL"
Function ulong GetCurrentProcess() Library "KERNEL32.DLL" Alias For "GetCurrentProcess"

 

스트럭쳐 선언)

global type PROCESSENTRY32 from structure
 ulong  dwSize
 ulong  cntUsage
 ulong  th32ProcessID
 ulong  th32DefaultHeapID
 ulong  th32ModuleID
 ulong  cntThreads
 ulong  th32ParentProcessID
 long  pcPriClassBase
 ulong  dwFlags
 character szExeFile[260]
end type

 

스크립트)

비교하고자 하는 파일이 실행중이면 True, 그렇지 않으면 False 를 Return

String ls_File_nm  //비교할 실행파일명

ulong ll_SnapShot
ulong lul_null
boolean lb_Res,lb_rtn = false
string ls_exefile //읽어온 프로세스의 실행파일명
PROCESSENTRY32 lstr_Entry


SetNull(lul_null)

ll_SnapShot = CreateToolhelp32Snapshot(15, lul_null)

lstr_Entry.dwSize = 1506 // structure의 size

// 실행중인 프로세스들의 첫번째 정보를 가져온다.
Process32First(ll_SnapShot, lstr_Entry)
if lstr_Entry.szExeFile = ls_File_nm  then
 lb_rtn = true
ELSE

 do while true
   lb_Res = Process32Next(ll_SnapShot,lstr_Entry);
   if not lb_Res then  exit //더이상 프로세스가 없으면 Exit
  ls_exefile = trim(lstr_Entry.szExeFile)
  ls_exefile = trim(ls_exefile)
  if ls_exefile = ls_File_nm  then    lb_rtn = true
 loop

END IF

CloseHandle(ll_SnapShot)

return lb_rtn

 

Posted by 농부지기
,

[ 파워빌더.공통함수 - 최소/최대/닫기 버튼 막기 ]

 

 

☞   

 

MDI 시트에서 최소/최대/닫기 버튼을 사용할 수 없게 하려면 먼저 사용자 이벤트 중 PBM_SYSCOMMAND을 선택하고, ue_syscommand라는 사용자 이벤트를 생성합니다. ue_syscommand 이벤트에서 다음 코드를 사용하면

Minimize/Maximize/Close 버튼을 눌러서 해당 윈도우를 '최소/최대/닫기'하려는 동작은 취소됩니다.

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

IF message.wordparm = 61488 THEN // 최대화 버튼
message.processed = TRUE
message.returnvalue = 1
END IF
IF message.wordparm = 61472 THEN // 최소화 버튼
message.processed = TRUE
message.returnvalue = 1
END IF
IF message.wordparm = 61536 THEN // 닫기 버튼
message.processed = TRUE
message.returnvalue = 1
END IF

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

Test Version : 7.0.3 Build 10009

Posted by 농부지기
,

 

 

 

[ 파워빌더.공통함수 - ancestorReturnValue ]

 

 

☞   

 

 

 

ancestorReturnValue 란 말 그대로 이벤트를 상속받아서 사용할 때, 해당 이벤트에 return 값이 있을 경우에 자손단에서는 조상단에서 이벤트를 수행하다가 return 된 값들을 체크할 때 사용할 수 있습니다.

 

예를 들어서, 저장하는 이벤트 ue_save를 만들구요.

거기에서는 trigger로 저장전에 체크하는 이벤트 ue_save_pre 라는 걸 만들었다고 가정합니다.

 

ue_save_pre는 리턴값이 있구요.

 

조상 이벤트에서 정상이면 1, 먼가 문제있으면 -1을 return 하도록 해놨다고 칩시다.

 

스크립트상에서는 다음과 같다고 할 수 있습니다.

ue_save() 이벤트내에서는

if this.event ue_save_pre() = -1 then

  return

end if

....

 

ue_save_pre() 이벤트내에서는

....//어떤 체크 로직이나 셋팅 로직

if 에러사항 then

  return -1

else

 return 1

end if

 

이를 상속받은 오브젝트에서 아무런 수정없이 그대로 사용하면 상관없는데, ue_save_pre에 먼가 기술을 하게 된다면..

 

조상단에서 -1을 호출해도 다시 자손에서 새로 기술된 스크립트까지 수행을 합니다.

그런데 자손단에서는 오류가 없어서 return 1 을 수행하게 되면, 앞의 -1은 무시가 될 수 있습니다.

 

이럴때 자손의 ue_save_pre 이벤트에서 조상의 return 값을 체크해주시면 됩니다.

 

if ancestorReturnValue = -1 then return -1

//이젠 자손에서 추가로 기술될 스크립트를 기술합니다.

...

return 1

Posted by 농부지기
,

[ 파워빌더.공통함수 - barCode ]

 

☞   

 

code128인경우 4자리 이상일때 적용이 가능.숫자 같은경우는 짝수일때 적용했을때는 단축효과가 있다...

영문대소문자구분 숫자표현 가능...

바코드 폰트는 링크걸린 사이트에서 받을수 있음..

바코드는 demo용 ... 고치는 방법도 있음. 이 부분은 알아서 하시길...

다른 자료 같은 경우는 유럽쪽 소스 내용 같은 경우는 문자코드열때문에 우리나라와 변환이 안맞아 사용이 힘들었는데..

서핑중 발견.. ㅋㅋㅋ  

아래 내용을 함수로 만들고 링크사이트에서 바코드 폰트를 받으셔서 사용하시면 됩니다..

다른 바코드관련 자료도 있으니 바코드관련 업무에 참고 하세요...

 

// PowerBuilder Source Code for IDAutomation.com Code 128 Barcode Fonts
// Copyright ⓒ 2002, IDAutomation.com, Inc. All rights reserved.
//
///////////////////////////////////////////////////////////////////////////////////
//
//      NOTE: The following code is only an example that was provided by a client.
//      IDAutomation.com, Inc. does not guarantee, support or troubleshoot
//      PowerBuilder source code.
//
// To use this function the developer needs to create an external function,
// Set function arguments and paste all the codes below.
//
///////////////////////////////////////////////////////////////////////////////////
//
// This function will convert input to a data string formatted for our
//      Code 128 Barcode Fonts. This is a code 128 "auto" function.
//
//      This barcode font is available at:
//      http://www.bizfonts.com/code128fonts/
// Download a demo version from:
//      http://www.advancemeants.com/code128fonts/download.htm
//
//      You may incorporate our Source Code in your application
//      only if you own a valid Multi-user or Corporate Distribution
//      license from IDAutomation.com, Inc. for the associated font and
//      the copyright notices are not removed from the source code.
//
// Arguments:
// Input(Pass By value)
//    Datatype String
//    Name  as_input
//
// Output(Pass By reference)
//    Datatype String
//    Name  as_ouptut
//
//    Copyright, IDAutomation.com, Inc. 2002. All rights reserved.
///////////////////////////////////////////////////////////////////////////////////

string ls_c128_starta
string ls_c128_startb
string ls_c128_startc
string ls_c128_start
string ls_c128_stop
Long  ll_len,i
Integer li_curr_char
String ls_curr_char
string ls_curr_encoding
Long  ll_curr_value
Long  ll_weighted_tot
string ls_datatoencode
Integer li_check_digit
String ls_c128_checkdigit
string ls_datatoprint, as_input , as_output


as_input = trim(sle_2.text)

If Isnull(as_input) OR as_input = '' Then
 Return -1
End IF

ls_c128_starta = char(203)
ls_c128_startb = char(204)
ls_c128_startc = char(205)
ls_c128_stop = char(206)

// Here we select character set A, B or C for the START character
ll_len = len(as_input)
li_curr_char = Asc(Mid(as_input, 1, 1))
If li_curr_char < 32 Then ls_c128_start = ls_c128_starta
If li_curr_char > 31 AND li_curr_char < 127 Then ls_c128_start = ls_c128_startb
If ((ll_len > 4) AND Isnumber(mid(as_input,1,4))) Then ls_c128_start = ls_c128_startc

// 202 is the FNC1, with this Start C is mandatory
If li_curr_char = 202 Then ls_c128_start = ls_c128_startc
If ls_c128_start = char(203) Then ls_curr_encoding = "A"
If ls_c128_start = char(204) Then ls_curr_encoding = "B"
If ls_c128_start = char(205) Then ls_curr_encoding = "C"

For i = 1 to ll_len
 // check for FNC1 in any set 
 If ((Mid(as_input,i,1)) = Char(202)) Then
  ls_datatoencode = ls_datatoencode + char(202)
 // check for switching to character set C 
 ElseIf ((i < ll_len - 2) AND (Isnumber(mid(as_input,i,1))) and (isnumber(mid(as_input,i + 1,1))) AND (Isnumber(Mid(as_input,i,4)))) OR ((i < ll_len) AND (Isnumber(mid(as_input,i,1))) AND (Isnumber(Mid(as_input,i + 1,1))) And (ls_curr_encoding = "C")) Then
  // switch to set C if not already in it  
  If ls_curr_encoding <> "C" Then ls_datatoencode = ls_datatoencode + char(199)
  ls_curr_encoding = "C"
  ls_curr_char = (Mid(as_input,i,2))
  ll_curr_value = Long(ls_curr_char)
  // set the CurrentValue to the number of String CurrentChar  
  If (ll_curr_value < 95 AND ll_curr_value > 0 ) Then ls_datatoencode = ls_datatoencode + char(ll_curr_value + 32)
  If ll_curr_value > 94 Then ls_datatoencode = ls_datatoencode + char(ll_curr_value + 100)
  If ll_curr_value = 0 Then ls_datatoencode = ls_datatoencode + char(194)
  i = i + 1
 // check for switching to character set A
 ElseIf (i <= ll_len) AND ((ASC(Mid(as_input,i,1)) < 31) OR ((ls_curr_encoding = "A") AND (ASC(Mid(as_input,i,1)) > 32 AND (asc(mid(as_input,i,1))) < 96))) Then
  // switch to set A if not already in it 
  If ls_curr_encoding <> "A" Then ls_datatoencode = ls_datatoencode + char(201)
  ls_curr_encoding = "A"
  // Get the ASCII value of the next character
  li_curr_char = (asc(mid(as_input,i,1)))
  If li_curr_char = 32 Then
   ls_datatoencode = ls_datatoencode + char(194)
  ElseIf li_curr_char < 32 then
   ls_datatoencode = ls_datatoencode + char(li_curr_char + 96)
  ElseIf li_curr_char > 32 Then
   ls_datatoencode = ls_datatoencode + char(li_curr_char)
  End IF
 // check for switching to character set B
 ElseIf (i <= ll_len) AND ((ASC(mid(as_input,i,1))) > 31 AND (ASC(mid(as_input,i,1))) < 127) Then  
  // switch to set B if not already in it
  If ls_curr_encoding <> "B" Then ls_datatoencode = ls_datatoencode + char(200)
  ls_curr_encoding = "B"
  // Get the ASCII value of the next character
  li_curr_char = (asc(mid(as_input,i,1)))
  If li_curr_char = 32 Then
   ls_datatoencode = ls_datatoencode + char(194)
  Else
   ls_datatoencode = ls_datatoencode + char(li_curr_char)
  End IF
 End IF  
Next

// ***** Calculate Modulo 103 Check Digit *******

// Set WeightedTotal to the value of the start character
ll_weighted_tot = (ASC(ls_c128_start) - 100)
ll_len = Len(ls_datatoencode)

For i = 1 to ll_len
 // Get the ASCII value of each character
 li_curr_char = (asc(mid(ls_datatoencode,i,1)))
 // Get the Code 128 value of CurrentChar according to chart
 If li_curr_char < 135 Then ll_curr_value = li_curr_char - 32
 If li_curr_char > 134 Then ll_curr_value = li_curr_char - 100
 If li_curr_char = 194 Then ll_curr_value = 0
 // multiply by the weighting character
 ll_curr_value = ll_curr_value * i
 // add the values together
 ll_weighted_tot = ll_weighted_tot + ll_curr_value
Next
// divide the WeightedTotal by 103 and get the remainder, this is the CheckDigitValue
li_check_digit = Mod(ll_weighted_tot,103)
// Now that we have the CheckDigitValue, find the corresponding ASCII character from the table
If li_check_digit < 95 AND li_check_digit > 0 Then ls_c128_checkdigit = char(li_check_digit + 32)
If li_check_digit > 94 Then ls_c128_checkdigit = char(li_check_digit + 100)
If li_check_digit = 0 Then ls_c128_checkdigit = char(194)
// Check for spaces or "00" and print ASCII 194 instead
// place changes in data to print
ll_len = Len(ls_datatoencode)
For i = 1 to ll_len
 ls_curr_char = mid(ls_datatoencode,i,1)
 If ls_curr_char = " " Then ls_curr_char = char(194)
 ls_datatoprint = ls_datatoprint + ls_curr_char
Next

// Get Printable String
as_output = ls_c128_start + ls_datatoprint + ls_c128_checkdigit + ls_c128_stop + " "
 
Return 0

 

☞  

 

예.. 폰트는 다운 로드 하심 되구요... 물론 demo라 약간 제약이 있는데..
그 부분은 좀만 생각하심 .. 여기까지. 메일주심..
아 그러구 바코드활용(1) 은 kan13(ean13) 관련 내용입니다.
http://cafe.naver.com/pentaeduclub/4850
http://cafe.naver.com/pentaeduclub/4849
일반적으로 폰트로 하는것은 code39 같은 경우는 일번적으로 많이 쓰는데 kan,upc,code128등 다른
바코드는 encoding을 하지 않으면 폰트를 이용하더라도 인식이 안됩니다.
kan(ean코드 ) 아무 다른 업체의 ean바코드 폰트를 이용해도 되지만,
다른방식의 폰트는 해당업체의 모듈(인코딩방식)과 연동되기 때문에 조금식 인코딩시 넘어오는 문자가 다릅니다. 그래서 바코드 인식이 안되는 경우가 많습니다.
인코딩 소스를 받았다면 그 해당 업체의 폰트를 받아야지만 정확한 바코드가 인식되는 경우가 많음...ㅋㅋ

☞  http://cafe.naver.com/pentaeduclub/990 참고 하시면 퐅트 없이도
패턴을 가지고 이렇게 표현도 가능 합니다. 폰트를 깔아주는 수고를 덜수도 있구요..
demo 폰트 조작할 필요도 없구요...
이거를 kan, code128에 적용함 해볼려구요..
대칭관계라 쉽지만은 안더라구요....

 

폰트를 수정하는 방법을 하면 가능 하지 않을까 생각 됩니다...
ls_c128_starta = char(203)
ls_c128_startb = char(204)
ls_c128_startc = char(205)
ls_c128_stop = char(206)
이 부분을 폰트를 다른 사용하지 않는 글자로 대체 하시는 방법을 하시면 가능 할것 같은데..
폰트수정은 폰트 수정하는 툴을 이용... 저도 생각만 해봐서.. 가능하지 않을까 사료됨.

 

프로젝트 하시다 보면 간단한 바코드 폰트로 해결 되는 경우도 있지만

CODE128A,CODE128B

이과 같이 CODE128 에 Check digit 없이 Code 128 character set 은 A로 처리 되는경우등은 일반적으로 바코드 폰트로만은

처리기가 힘듭니다.

그래서 대부분 관련 ActiveX 같은걸 구매해서 사용하죠..

 

Java Barcode Servlets 된 WEB으로 바코드 폰트를 이미지화 하여 원하는 바코드 형식으로 만들수 있는 곳인데

프로젝트 하시다 보면 해당 바코드가 어떤 형태인지 확인해 보실때 사용하시면 좋을것 같습니다.

WEB으로 구축시에는 직접 사용하시는것도 괜찮을것 같네요

 

저는 보통 생성된 바코드를 확인할때 주로 많이 사용합니다...

처음 구매한 바코드나 접하지 않은 바코드일경우 해당 바코드의 타입과 설정을 알고 대응하게는 좋으니깐요..^^

 

바코드 접해 보지 않은분은 바코드에 대해 공부하신다 생각 하고 한번 확인해 보면 좋을것 같습니다.

 

URL은 아래와 같습니다.

 

http://www.idautomation.com/java/linearservlet.html

 

 

카페 등업점수가 얼마 남지 않았네요...

자주 글을 쓰야 하는데..ㅎㅎ 노력해보겠습니다.

Posted by 농부지기
,

☞   

 

ole media player 활용에 대한 자료가 많이 부족하여 저도 여기저기 많이 돌아다니다가

몸으로 부딪혀보고 하다가 이렇게 짧은 지식이나마 공유하고자 이렇게 올려봅니다.

1. insert control로 windows media player를 추가한다.

간단하게 이렇게 화면을 디자인했습니다 ㅎㅎ

 

 

 

2. 목록 불러오기

   미리 text파일로 목록들을 넣어 놓고 저장. 그 파일을 불러와서 데이터 윈도우에 Import 시킵니다.

   다른 방법으로 하셔도 됩니다.

 

   Script 내용

string docname, named
integer value
value = GetFileOpenName("Select File",  &
        docname, named, "txt", "Text Files (*.txt))
if (IsNull(docname)) then return
if (value = 1) then
dw_1.importfile(docname)
dw_1.setfocus()
end if

 

text파일 내용은 아래처럼 만들었습니다.

   e:\MP3\01. Intro - 모두 다 소리쳐 - 빅뱅(Bigbang) - Remember.mp3

   e:\MP3\02. 오,아,오 - 빅뱅(Bigbang) - Remember.mp3

   e:\MP3\03. 붉은 노을 - 빅뱅(Bigbang) - Remember.mp3

 

3. 시작하기

if dw_1.rowcount() = 0 then
 messagebox('알림','연주 할 앨범을 선택하세요 ! ! ! ! !')
 return
end if

if dw_1.getrow() = 0 then
 play_row = 1
else
 play_row = dw_1.getrow()
end if

DW_1.SELECTROW(0,FALSE)
DW_1.SELECTROW(play_row,TRUE)
dw_1.scrolltorow(play_row)
sle_1.text = dw_1.object.filelist[play_row]
ole_1.object.Controls.play()

//실행할 파일

ole_1.object.url = sle_1.text

 

4. 정지하기

//정지

 ole_1.object.Controls.stop()

 

//일시정지

// ole_1.object.Controls.pause()

5. 다음 곡으로 자동으로 넘어가기

ole media player의 Event에 보시면 Playstatechange() 이라고 있습니다.

NewState에 따라 처리하는 방식으로 했습니다.

endofstream()이나 Newstream()으로는 전혀 처리가 안되더라구요 ㅜㅜ

 

Newstate에 대하여서는 다 확인은 안해봤습니다

참조하세요^^

1 : 노래를 정상 혹은 비정상적으로 정지를 시킬때 발생합니다.

3 : 노래가 연주(재생)둥 일때 발생합니다.

8 : 노래의 연주가 정상적으로 종료되었을때 발생합니다.

9 : 스트림이 시작점 위치로 왔다는 의미 갔습니다.

 

자동으로 넘어갈때 Newstate의 옵션을 보면

8 -> 9로 넘어가는 것을 확인했습니다. ㅎㅎ

 

이것 때문에 고생많이 했습니다^^

 

//Playstatechange() script

If NewState = 9 and OldState = 8 Then
 if dw_1.rowcount() = 0 then
  messagebox('알림','연주 할 앨범을 선택하세요 ! ! ! ! !')
  return
 end if
 
  play_row++
  if play_row > dw_1.rowcount() then
   play_row = 1
  end if
  DW_1.SELECTROW(0,FALSE)
  DW_1.SELECTROW(play_row,TRUE)
  dw_1.scrolltorow(play_row)
  sle_1.text = dw_3.object.filelist[play_row]
  ole_1.object.url = sle_1.text
  ole_1.object.Controls.play()
  return
end if

//옵션체크하기위함

OldState = NewState

 

6. Instance 내용

long play_row, OldState

 

7. 기타 옵션

   - 볼륨 조절

      ole_1.object.settings.volume=100

 

이상 두서없이 제가 아는 내용에서 정리를 해보았습니다.

 

여러분께 도움이 되셨는지 모르겠습니다^^

Posted by 농부지기
,

[ 파워빌더.공통함수 - key pad ]

 

 

☞   

 


(파빌 9.0 기준)

visible user object로 숫자판을 하나 만든다.

picture button을 이용하여 다음과 같이 만들었다.

 

해당 object에 instance 변수 선언:

GraphicObject which_control

 

Local External Functions 나 Global Exterbal Functions 에 다음을 선언한다.

SUBROUTINE keybd_event( int bVk, int bScan, int dwFlags, int dwExtraInfo) LIBRARY "user32.dll"

 

user event 를 하나 만든다.

/****************************************************************

Event 명 : ue_clicked()

argument : string arg_tag

*****************************************************************/

if isvalid(which_control) then 
 CHOOSE CASE typeof(which_control)
  CASE  DataWindow!
   DataWindow    dw_which
   dw_which = which_control
   dw_which.setfocus()   
  CASE CommandButton! 
   CommandButton cb_which
     cb_which = which_control
     cb_which.setfocus() 
  CASE SingleLineEdit!
   SingleLineEdit sle_which
     sle_which = which_control
    sle_which.setfocus()
  CASE Editmask!
   EditMask    ed_which
   ed_which = which_control
   ed_which.setfocus()
  CASE ELSE
   //messagebox('' , 'else')
 END CHOOSE
else
   //messagebox('' , 'err' )
end if
choose case arg_tag
 case '1'
  keybd_event(49 , 0, 0, 0)
 case '2'
  keybd_event(50 , 0, 0, 0)
 case '3'
  keybd_event(51 , 0, 0, 0)
 case '4'
  keybd_event(52 , 0, 0, 0)
 case '5'
  keybd_event(53 , 0, 0, 0)
 case '6'
  keybd_event(54 , 0, 0, 0)
 case '7'
  keybd_event(55 , 0, 0, 0)
 case '8'
  keybd_event(56 , 0, 0, 0)
 case '9'
  keybd_event(57 , 0, 0, 0)
 case '0'
  keybd_event(48 , 0, 0, 0)
 case 'B'//back space
  keybd_event(8 , 0, 0, 0)
 case 'P' //점 
  keybd_event(110 , 0, 0, 0)
 case '+'
  keybd_event(107 , 0, 0, 0)
 case '-'
  keybd_event(109 , 0, 0, 0)
 case 'U'//위로
  keybd_event(38 , 0, 0, 0)
 case 'D'//아래로
  keybd_event(40 , 0, 0, 0)
 case 'L'//왼쪽
  keybd_event(37 , 0, 0, 0)
 case 'R'//오른쪽
  keybd_event(39 , 0, 0, 0)
 case 'DEL'
  keybd_event(46 , 0, 0, 0)
 case 'TAB'
  keybd_event(9 , 0, 0, 0)
end choose

/*****************************************************************/

각 버튼 클릭이벤트에는 버튼에 맞는 아규먼트를 넣어서 위의 이벤트를 실행한다.

예) 숫자1 버튼의 clicked 이벤트 :

     parent.event ue_clicked('1')

 

그리고, 이렇게 만든 오브젝트를 윈도우에서 붙여서 사용한다.(uo_keypad 로 가정)

만일, editmask가 있다면, 해당 editmask 의 getfocus() 이벤트에 다음과 같이 기술한다.

uo_keypad .which_control = getfocus() //해당 오브젝트의 instance 변수를 정의내린다

http://cafe.naver.com/pentaeduclub.cafe

Posted by 농부지기
,

[ 파워빌더.공통함수 - RPAD LPAD ]

 

☞   

 

**** LPAD함수 만들어 사용하기 *****

//paturn으로 채우기

==================================================================================================

global type lpad from function_object
end type

forward prototypes
global function string lpad (string as_data, char ac_paturn, integer ai_count)
end prototypes

global function string lpad (string as_data, char ac_paturn, integer ai_count);

    return as_data + fill(ac_paturn, ai_count - Len(as_data) )
end function
==================================================================================================

//밴공백으로 채우기

==================================================================================================

global type lpad from function_object
end type

forward prototypes
global function string lpad (string as_data, integer ai_count)
end prototypes

global function string lpad (string as_data, integer ai_count);

    return String( as_data, fill('@', ai_count) )
end function
==================================================================================================

 

**** RPAD함수 만들어 사용하기 *****

//paturn으로 채우기...

==================================================================================================

global type rpad from function_object
end type

forward prototypes
global function string rpad (string as_data, char ac_paturn, integer ai_count)
end prototypes

global function string rpad (string as_data, char ac_paturn, integer ai_count);

    return Reverse( Reverse(as_data) + fill(ac_paturn, ai_count - Len(as_data) ) )
end function
==================================================================================================

//빈공간으로 채우기

==================================================================================================

global type rpad from function_object
end type

forward prototypes
global function string rpad (string as_data, integer ai_count)
end prototypes

global function string rpad (string as_data, integer ai_count);

    return Reverse( String(Reverse(as_data), fill('@', ai_count ) ) )
end function
==================================================================================================

Posted by 농부지기
,