[파워빌더] FTP를 이용한 이미지(JPG) 파일 관리


  파워빌더에서 FTP를 이용한 이미지를 관리 하도록 만든 프로그램. 치과에서 사용 하는 프로그램.. 일부분만 사진을 첨부 합니다. 
저작권이 있어..^^ 주요 기능만 .. 가장 핵심은 이미지 파일을 업로드 시 썸네일과 디테일 파일의 두가지로  업로드 하는 것입니다. 하나의 파일을 업로드 하면 자동으로 썸네일과 디테일 파일을 생성해서 원격지 폴더에 업로드 해놓습니다. 경로는 DB에 저장해놓고 이미지 링크 형식으로 불러 옵니다. DW에 이미지가 많아지면 속도가 조금씩 느려지는데 이부분은 어떠한 해결책이 있을까요? ^^ 

 이미지 업로드 화면

 저장 후 조회 화면 이미지 클릭시 큰 화면으로 보여줄수있겠지요? 디테일은 따로 저장되어 있으니.. 후훗!

[파워빌더] 포지션 프로퍼티의 Slide Up


    오늘 프로그램을 만들면서 익힌 기능.. 사실 잘 쓸일이 없는 기능인데 어쨌든...
AutoSize Height등과 같은 컬럼을 사용 후 아래에 컴퓨티드 필드 등으로 어떤 값이나 이미지를 넣었을 때 겹쳐 보이거나 할때 이 메뉴를 Directly Above로 변경해 보라! 아래쪽에 붙는것을 확인 할 수 있을것이다. 

[파워빌더] 외부DLL를 이용한 프로그래밍...


안녕하세요??
파워빌더에서 가능한 모든것을을 처리 하면 좋겠지만 그렇지 못한 경우는 외부 프로그래밍 언어를 
사용해서 DLL을 만들어 사용하게 되지요.
DLL을 이용하는 방법은 3가지 정도가 있는것으로 알고 있습니다. 사실 저도 파워빌더 8-9년차에 
접어 들었지만 이 DLL을 사용하는 것 만큼은 아직 많이 어렵습니다.( 헤딩을 많이 해야 합니다. )
제가 알고 있는 방법은 3가지 방법이 사용 가능한것으로 알고 있습니다.
1. 대부분 파워빌더 개발자분들이 알고 있는 익스터널 펑션에 선언해서 사용 하는 방법 아마 대부분은
여기에서 해결이 가능 하리라 봅니다.
2. 두번째는 Create OLE 컨트롤을 이용하는 방법(MSCOM 등을 이용한 RS232 통신 등)에 많이 사용들
하시리라 생각합니다. OLE에 OCX나 DLL을 등록해서 사용할수도 있고요..
3. 마지막으로 OCX나 DLL을 regsvr32로 DLL 등록 후 사용하는 방법입니다.
( 이때 중요한것은 DLL을 등록 할 때 하나의 DLL이 아니 여러개의 DLL이 있을 경우 같은 폴더에 넣어서
  등록을 해주셔야 합니다. DLL 약자가 동적라이브러리 어쩌고니 같이 사용되는 DLL이 없을 경우 등록
  에 실패하는 경험을 하시게 됩니다. ^^ )
  DLL이 잘 등록이 되었다면 ConnectToNewObject 을 사용해서 해당 클래스를 불러와서 사용 하시면 
  됩니다. 일반적으로 ASP에서 Server.CreateObject등으로 사용되고 있는 방법은  파워빌더에서
  ConnectToNewObject 로 사용하시면 잘 대응 됨을 알 수 있습니다.
  EX) Server.createobject("adodb.connection") ===> ConnectTONewOjbect("adodb.connection") 로
  사용할수 있겠지요. 앞 adodb를 클래스 명, 뒤에 connection을 컴포넌트이름
  DLL에 사용되어진 클래스명, 컴포넌트이름만 제대로 알고 있다면 쉽게 사용 할 수가 있을것입니다.
  http://l2j.co.kr/1515  이 예제를 보시면 비베에서 DLL을 만들경우 프로젝트명이 클래스명
  (위에서 adodb)이 되며  클래스모듈이 컴포넌트이름(위에서 connection)이 된다는걸 알 수 있습니다.

[파워빌더] OLE를 이용해서 WEB관련 프로그래밍 하기


출쳐 : http://www.rgagnon.com/pbdetails/pb-0202.html 


Internet ExplorerTag(s): WinAPI/Registry

  • Method #1 - Using HyperlinkToURL function

  • Needs PB6.5 or better. Starts the default browser as defined in your installation.
    string ls_url
    inet iinet_base
    
    ls_url = "http://wwww.server.com/myWebApp?file=error.log"
    GetContextService("Internet", iinet_base)
    iinet_base.HyperlinkToURL(ls_url)
    
  • Method #2 - Using OLEObject InternetExplorer.Application + Run
    OLEObject IE
    string ls_ie
    string ls_url
    
    IE = CREATE OLEObject
    IE.ConnectToNewObject("InternetExplorer.Application")
    
    ls_ie = IE.Fullname ()
    
    ls_url = "http://wwww.server.com/myWebApp?file=error.log"
    Run (ls_ie + " " + ls_url)
    
  • Method #3 - Using OLEObject InternetExplorer.Application

  • Provides complete control IE behaviour.
    OLEObject IE
    
    IE = CREATE OLEObject
    IE.ConnectToNewObject("InternetExplorer.Application")
    
    IE.left=200
    IE.top=200
    IE.height=400
    IE.width=400
    IE.menubar=0
    IE.toolbar=1
    IE.statusBar=0
    IE.navigate("http://wwww.server.com/myWebApp?file=error.log")
    IE.visible=1
    
    // Local external function decalration
    // FUNCTION boolean SetForegroundWindow( long hWnd ) LIBRARY "USER32"
    SetForegroundWindow( IE.HWND )
    
  • Method 4 - Using OLEObject InternetExplorer.Application 
    Provides complete control IE behaviour. You simulate a FORM submit.using the POST method.
    OLEObject IE
    
    IE = CREATE OLEObject
    IE.ConnectToNewObject("InternetExplorer.Application")
    
    IE.left=200
    IE.top=200
    IE.height=400
    IE.width=400
    IE.menubar=0
    IE.toolbar=1
    IE.statusBar=0
    IE.goHome
    IE.visible=1
    
    
    DO WHILE IE.busy
    LOOP
    
    IE.document.Open
    IE.document.WriteLn("<HTML><HEAD>")
    IE.document.WriteLn("<SCRIPT>")
    IE.document.WriteLn("function go() {")
    IE.document.WriteLn("  document.myform.submit()")
    IE.document.WriteLn("  }")
    IE.document.WriteLn("</SCRIPT>")
    IE.document.WriteLn("</HEAD>")
    IE.document.WriteLn("<BODY onload='go()'>")
    IE.document.WriteLn("<FORM name='form' ")
    IE.document.WriteLn("METHOD='GET' ACTION='http://server.com/myApp'>")
    IE.document.WriteLn("<INPUT NAME='file' TYPE=HIDDEN VALUE='error.log'>")
    IE.document.WriteLn("</FORM>")
    IE.document.WriteLn("</BODY>")
    IE.document.WriteLn("</HTML>")
    IE.document.Close
    
    // Local external function declaration
    // FUNCTION boolean SetForegroundWindow( long hWnd ) LIBRARY "USER32"
    SetForegroundWindow( IE.HWND )
    
    
    // IE.Quit()
    // IE.DisconnectObject()
    // DESTROY iBrowser
    
    

    Some tips from rkern (thanks to him!).

    Some handy properties:

    IE.top = <integer>
    IE.left = <integer>
    IE.width = <integer>
    IE.height = <integer>
    IE.visible = <integer> (1 - Visible/ 0 - Not Visible)
    IE.menuBar = <integer> (1 - Visible/ 0 - Not Visible)
    IE.toolBar = <integer> (1 - Visible/ 0 - Not Visible)
    IE.statusBar = <integer> (1 - Visible/ 0 - Not Visible)
    

    Go To a URL:

    string ls_OldURL
    string ls_NewURL = 'www.yahoo.com'
    // Go to Document
    ls_OldURL = IE.LocationURL
    IE.Navigate (ls_NewURL)
    // Wait for Document to start loading
    DO WHILE ls_OldURL = IE.LocationURL
      Yield ()
    LOOP
    // Wait for Document to finish Loading
    DO WHILE IE.Busy
     Yield ()
    LOOP
    
    Notes:
    -The Busy attribute does not always get set immediateley so wait for URL to change before checking the Busy attribute 
    - This method works as long as the OldURL and NewURL are not the same

    Click on a Link with a specific display text:

    integer li_link, li_link_ctr
    string ls_text, ls_OldURL, ls_search = 'Download Spreadsheet'
    // Set Match string
    ls_search = Upper(ls_search)
    // Find Link with specified Text
    li_link_ctr = IE.Document.Links.Length
    FOR li_link = 0 TO li_link_ctr - 1
      ls_Text = Upper(IE.Document.Links[li_link].InnerText)
      // Check for Match
      IF ls_Text = as_Search THEN
          // Click the Link
          ls_OldURL = IE.LocationURL
          IE.Document.Links[li_link].Click()
          // Wait for Document to start loading
          DO WHILE ls_OldURL = IE.LocationURL
             Yield ()
          LOOP
          // Wait for Document to finish loading
          DO WHILE IE.Busy
            Yield ()
          LOOP
          EXIT
      END IF
    NEXT
    
    Notes:
    - The Busy attribute does not always get set immediateley so wait for URL to change before checking the Busy attribute 
    - This method works as long as the OldURL and NewURL are not the same - Unlike PB, arrays start at index = 0 to length - 1 - Use attribute HRef if you want to match on a URL

    Click on a Button with a specific display text:

    integer li_form, li_form_ctr
    integer li_elem, li_elem_ctr
    boolean lb_stop
    string ls_text, ls_OldURL, ls_search = 'Search'
    any la_name, la_type, la_value
    // Set Match string
    ls_search = Upper(ls_search)
    // Search thru Forms
    li_form_ctr = IE.Document.Forms.Length
    FOR i = 0 TO li_form_ctr - 1
        // Search thru Elements
        li_elem_ctr = IE.Document.Forms[i].Elements.All.Length
        FOR j = 0 TO li_elem_ctr - 1
            la_Name =
              IE.Document.Forms[i].Elements.All[j].GetAttribute("name")
            la_Type =
              IE.Document.Forms[i].Elements.All[j].GetAttribute("type")
            la_Value =
              IE.Document.Forms[i].Elements.All[j].GetAttribute("value")
            CHOOSE CASE Upper(String(la_Type))
            CASE 'SUBMIT', 'RESET', 'BUTTON'
                ls_Text = Upper(String(la_Value))
                // Check for Match
                IF ls_Text = ls_Search THEN
                    // Click the Button
                    ls_OldURL = IE.LocationURL
                    IE.Document.Forms[i].Elements.All[j].Click()
                    // Wait for Document to start loading
                    DO WHILE ls_OldURL = IE.LocationURL
                       Yield ()
                    LOOP
                    // Wait for Document to finish loading
                    DO WHILE IE.Busy
                       Yield ()
                    LOOP
                    lb_Stop = TRUE
                    EXIT
                END IF
            END CHOOSE
        NEXT
        IF lb_Stop THEN
           EXIT
        END IF
    NEXT
    
    Notes:
    - The Busy attribute does not always get set immediateley so wait for URL to change before checking the Busy attribute 
    - This method works as long as the OldURL and NewURL are not the same 
    - Unlike PB, arrays start at index = 0 to length - 1 
    - Use attribute Name if you want to match on an internal HTML Name 
    - The Returned Values of the GetAttribute method must be ANY variables , even though they return STRINGS

    Fill in a Input Field that has a specific Name:

    integer li_form, li_form_ctr
    integer li_elem, li_elem_ctr
    boolean lb_Stop
    string ls_text, ls_search = 'Company'
    any la_name, la_type, la_value
    // Set Match string
    ls_search = Upper(ls_search)
    // Search thru Forms
    li_form_ctr = IE.Document.Forms.Length
    FOR i = 0 TO li_form_ctr - 1
        // Search thru Elements
        li_elem_ctr = IE.Document.Forms[li_form].Elements.All.Length
        FOR j = 0 TO li_elem_ctr - 1
            la_Name =
              IE.Document.Forms[i].Elements.All[j].getAttribute("name")
            la_Type =
              IE.Document.Forms[i].Elements.All[j].getAttribute("type")
            la_Value =
              IE.Document.Forms[i].Elements.All[j].getAttribute("value")
            // ls_Text = IE.Document.Forms[i].Elements.All[j].InnerText
    
            CHOOSE CASE Upper(String(la_Type))
            CASE 'TEXT', 'TEXTAREA', 'PASSWORD'
                ls_Text = Upper(String(la_Name))
                // Check for Match
                IF ls_Text = ls_Search THEN
                    // Set the value
                    IE.Document.Forms[i].Elements.All[j].Value = ls_Value
                    lb_Stop = TRUE
                    Exit
                END IF
            END CHOOSE
        NEXT
        IF lb_Stop THEN
           Exit
        END IF
    NEXT
    
    Notes:
    - Unlike PB, arrays start at index = 0 to length - 1 
    - Use attribute InnerText if you want to match on a percieved label on the field. Check each element's InnerText until a match is found and then fill in the next input field you come to (usually works). 
    - The Returned Values of the GetAttribute method must be ANY variables , even though they return STRINGS
  •  

    [파워빌더] 구글맵API(GoogleMapAPI) 사용 관련


    파워빌더에서 구글맵 사용 예 : http://netgamer.tistory.com/11

    구글지도 API 관련
    http://imgsoul.blog.me/140102340598
    http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Google/Service/GoogleMapAPI
    http://blog.naver.com/wbleader?Redirect=Log&logNo=120129538686
    http://blog.naver.com/wbleader?Redirect=Log&logNo=120129538686

    xml에서 정의한 GoogleMap 가져오는 2가지 방법 아래 링크를 보면 2가지 xml에서의 정의 방법과 2가지 가져오는 방법을 확인 할 수 있다.

    http://stackoverflow.com/questions/19353255/how-to-put-google-maps-v2-on-a-fragment-using-viewpager


    [파워빌더] 파워빌더12.5, 파워빌더15 로드맵



    안녕하세요.

    사이베이스 TechDays 내용에 보면 파워빌더 로드맵이 경신 되었더군요.

    파워빌더 12.5가 올 3분기쯤 나올 예정이고

    12.5에서 바뀐점은 rest 클라이언트 지원, 멀티쓰레드 서포트, 데이터윈도우의 기능확대 등

    파워빌더 15가( 왜 12에서 15로 건너 뛰는지는 모르겠지만 )

    2012년 3분기에 나올 예정인것 같습니다.

    큰 맥락은 윈도우 모바일 프로그래밍 지원( 아무래도 닷넷을 강화한것이 모바일 윈도우7의 지원까지 생각해서인듯한 느낌 )

    HTML5 지원, 파워빌더 win32(클래식)의 윈도우 duck지원( 파워덕과 같은 것들을 지원 해줄 모양 ) 등

    파워빌더는 끊임없이 발전해 가는군요. 자세한것은 사이베이스 사이트에서 확인해보시길 바랍니다. ^^

    PPT 첨부 해놓을께요.

    파워빌더 화이링!!!!!!!!!!


    [파워빌더] 파워빌더를 이용한 대량 문자 발송 및 각종파일 저장 조회 후 바로 실행 하기


      이번에 작업을 맡은 프로그램 입니다. 크지 않은 프로그램이지만 나름 기능성이 있는 프로그램이지요. 특히 문자를 이용해서 관리하고 싶은 회원이 있을 경우, 또는 아웃소싱 회사에서 여러 사람들에게 문자를 보내고 싶을 경우 등등 여러가지 분야에서 응용이 가능 하리라 생각 됩니다. 사진이나 PDF파일을 등록 후 조회 시 클릭하면 바로 사진 파일이 열리거나 PDF파일이 열리도록 프로그램 하였습니다.
    조회후 왼쪽에 문자발송을 하게 되면 오른쪽에 조회된 사람 만큼 문자가 자동으로 발송 됩니다.( 당연히 문자 업체에 계약이 되어 있어야 겠지요 )



    파워빌더 EBF 19091: 11.5.1 (4964)


    파워빌더 패치
    Product Name: PowerBuilder
    Platform: Windows x86
    Release Version: 11.5.1
    Release Description: EBF 19091: 11.5.1 (4964)
    Release Date: 04 May 2011


    Releases for UNIX platforms are typically compressed using GNU Tar format (.tgz). To uncompress you need the GNU Tar utility. If you encounter problems downloading files with Internet Explorer or uncompressing files that are GNU Tar format (.tgz), please read theFAQ andHelpsection for more information.

    This release contains the following files:
    Info File Date Size (Bytes) Description
    EBF19091_README.html 05/03/2011 21640 README for EBF 19091
    EBF19091_Buglist.txt 05/03/2011 8129 Buglist for EBF 19091
    EBF19091_Filelist.txt 05/03/2011 444 Filelist for EBF 19091
    EBF19091.zip 05/03/2011 243580909 Software for EBF 19091

    [파워빌더] OpenSheet의 Original!과 Layered!의 차이점(최대화)


    MDI화면에서 작업화면 위에 놓일 MAIN 윈도우들을 WindowState를 Maximized!로 해놓고 메뉴에서 OpenSheet시 Original!로 옵션을 주었을 경우 아래와 같고



    Layered!의 경우는 아래와 같다 차이점은 눈에 보이는 그것! 바로 오픈시 바로 최대화 되어 MDI와 합체(?)가 된다

    기업용, 개인용 업무 프로그램 개발 해드립니다.


    안녕하세요. 반갑습니다.

    개발은 파워빌더로 해드리고요. 회사 업무용 프로그램은 어떤것이든 상관없습니다.

    또한 엑셀 등의 자료를 이용한 프로그램도 개발 가능합니다.


    파워빌더는 윈도우 어플리케이션 개발 프로그램 입니다. (EXE파일로 실행되는 프로그램)

    먼저 경력은 만 7년 넘었고요. 파워빌더 6.5 - 12(클래식만 ^^)까지 사용 해 보았습니다.

    DB는 엑세스DB, MSSQL, 오라클DB, Mysql등 사용 해보았고요.

    다른 DB들도 다 비슷하리라 생각 됩니다.

    잠시 일을 쉬고 있는 상황이니 ^^ 필요에 의한 방문도 가능하고요~

    포트폴리오 : http://ayukawa777.tistory.com/ 참고 바랍니다.

    좋은 하루 되세요.~! 쪽지나 ayukawa777@gmail.com 메일주세요

    P.S. 아래는 현재 프로토타입으로 개발중인 입고, 출고, 판매, 재고 관리 프로그램 입니다.



    상세스크린샷 -> http://nekomimi.tistory.com/318

    파워빌더 11.5.1 EBF 18585(4897)


    Product Name: PowerBuilder
    Platform: Windows x86
    Release Version: 11.5.1
    Release Description: EBF 18585: 11.5.1 (4897)
    Release Date: 18 Jan 2011


         Releases for UNIX platforms are typically compressed using GNU Tar format (.tgz). To uncompress you need the GNU Tar utility. If you encounter problems downloading files with Internet Explorer or uncompressing files that are GNU Tar format (.tgz), please read the FAQ and Help section for more information.

     
     
     
    This release contains the following files:
    Info File Date Size (Bytes) Description
    EBF18585_README.html 01/17/2011 17838 README for EBF 18585
    EBF18585_Buglist.txt 01/17/2011 5730 Buglist for EBF 18585
    EBF18585_Filelist.txt 01/17/2011 444 Filelist for EBF 18585
    EBF18585.zip 01/17/2011 243569074 Software for EBF 18585
     

    PopMenu(팝업메뉴)나 PopWindow(팝업윈도우)에 DW 전달시..


       윈도우의 경우는 OPENWITHWINDOW를 통해서 전달하기 쉽고 또 스트럭쳐 등으로도 전달이 가능하다. POPMENU의 경우는 따로 인수 전달 방법이 없으므로 팝업되는 메뉴내에 펑션을 이용하여 전달이 가능하다 팝업메뉴에 인스턴스 변수로 데이터윈도우를 선언 해주고 
     m_right_click menu
     
     menu = CREATE m_right_click
     menu.mf_setdatawindow(This)
     menu.menu_01.PopMenu(w_main.PointerX(), w_main.PointerY())

    이런식으로 처리해준다.

    메뉴의 mf_setdatawindow로 받은 데이터윈도우를 인스턴스 데이터운도우에 넣어주고, 팝업에서 오픈시
    OPENWITHPARM으로 오픈 처리 해준다.

    [파워빌더] 로또 번호 추출기


      역시 알바 비스무리 하게 작업 한 프로그램 로또 번호를 어떤 법칙에 의한 필터링.. 시스템에 부하가 상당히 많이 간다. ㄷㄷㄷ..

    [파워빌더] 마약 및 향정 관리 프로그램


       최근에 알바 비슷하게 작업 해주고 있는 것들 중 하나.. 의약품 중 마약 및 향정신성의약품 등의 재고 관리를 위한 프로그램



    무단 펌을 금지 합니다. !!

    파워빌더의 메모리 반환 문제..


    파워빌더만의 문제인지.. 다른 프로그램 언어들도 그런지는 모르겠지만..
    비주얼 오브젝트(dw)의 경우 100만건을 조회 하면 메모리를 600메가적도 잡아 먹는데 리셋후 재조회 하면 600메가에서 또다시메모리가 계속 해서 늘어난다.. 왜 환원이 안되는것일까?!
    조금이라도 메모리를 반환 시켜보려고 애써보니 dw_1.DataObject를 다시 지정해주니 300메가정도는 반환 하는것 같다.
    위의 내용은 윈도우 하나만 가지고 실했을 때의 문제로.. 탭이나 MDI 환경에서 닫으면 아마도 모두 환원 되리라 생각 된다. 파워빌더 뿐만아니라 다른 프로그램도 아마도.. 그러리라 생각된다. 일단은 나중을 위해 포스팅~