?
Solved

Use standard windows file open window in powerbuilder application

Posted on 2006-05-09
4
Medium Priority
?
10,406 Views
Last Modified: 2013-12-26
Is it possible to use the windows file open dialog box from a powerbuilder application (like used in Word, Excel, Outlook)?  I know that I can use DirList() and DirSelect() from Powerbuilder to accomplish this but I'd prefer not to build it if I can use a component that already exists.  Any input would be appreciated.
Regards,
Kristi
0
Comment
Question by:QueenKretee
3 Comments
 
LVL 6

Assisted Solution

by:tr1l0b1t
tr1l0b1t earned 1000 total points
ID: 16640256
Hi,

To displays the system's Open File dialog and allows the user to select a file or enter a filename,
use the GetFileOpenName() and GetFileSaveName() methods. Refer to PB Help for further information
on its use and parameters.

~~~~~~~~~~~~~~~~~~~~~~
Example from PB Help :
~~~~~~~~~~~~~~~~~~~~~~

string docname, named
integer value
value = GetFileOpenName("Select File", &
            + docname, named, "DOC", &
            + "Text Files (*.TXT),*.TXT," &
            + "Doc Files (*.DOC),*.DOC")
IF value = 1 THEN FileOpen(docname)


Regards
0
 
LVL 5

Accepted Solution

by:
berXpert earned 1000 total points
ID: 16669806
Hi Kristi,

you need to call Windows API functions to get those Dialog Box like Excel or Outlook:    GetOpenFileName

There is a question that use this API, but their sample is to change CurrentPath:

http://www.experts-exchange.com/Programming/Programming_Languages/PowerBuilder/Q_20747696.html

I just create an user object that use this ideas and make a full functional sample, you can get sample code here: http://berxpert.googlepages.com/powerbuilder

And here is the code:

//----------------------------------
//    Button click on a window
//----------------------------------
String pathNames[], FileNames[], filter
uo_winfile luo_winfile
Int i

luo_winfile = Create uo_WinFile

FileNames[1] = ''
Filter = "Excel Files (*.xls)|*.XLS|Access Files (*.mda, *.mdb)|*.MDA;*.MDB|Text Files (*.txt)|*.TXT|All Files (*.*)|*.*"

i = luo_winfile.Open(Handle(parent), "Use API to select a file using Windows Excel - Outlook style", pathNames, FileNames, filter, 'D:\BerXpert', true, true, 0)

// i = 0 User Pressed Cancel

if i > 0 then
      MessageBox(pathNames[1], FileNames[1]  )
end if      


//----------------------------------
//    Api functions
//----------------------------------
Function boolean GetOpenFileName(ref OPENFILENAME lpofn) Library "COMDLG32.DLL" Alias For "GetOpenFileNameA"
Function boolean GetSaveFileName(ref OPENFILENAME lpofn) Library "COMDLG32.DLL" Alias For "GetOpenFileNameA"
Function long       CommDlgExtendedError() Library "COMDLG32.DLL"

//----------------------------------
//    File Constants
//----------------------------------
Protectedwrite CONSTANT long OFN_NOLONGNAMES = 262144 //&H40000                      
Protectedwrite CONSTANT long OFN_NONETWORKBUTTON = 131072 //&H20000
Protectedwrite CONSTANT long OFN_NOREADONLYRETURN = 32768 //&H8000
Protectedwrite CONSTANT long OFN_NOTESTFILECREATE = 65536 //&H10000
Protectedwrite CONSTANT long OFN_READONLY = 1 //&H1
Protectedwrite CONSTANT long OFN_OVERWRITEPROMPT = 2 //&H2
Protectedwrite CONSTANT long OFN_HIDEREADONLY = 4 //&H4
Protectedwrite CONSTANT long OFN_NOCHANGEDIR = 8 //&H8
Protectedwrite CONSTANT long OFN_SHOWHELP = 16 //&H10
Protectedwrite CONSTANT long OFN_ENABLEHOOK = 32 //&H20
Protectedwrite CONSTANT long OFN_ENABLETEMPLATE = 64 //&H40
Protectedwrite CONSTANT long OFN_ENABLETEMPLATEHANDLE = 128 //&H80
Protectedwrite CONSTANT long OFN_NOVALIDATE = 256 //&H100
Protectedwrite CONSTANT long OFN_EXTENSIONDIFFERENT = 1024 //&H400
Protectedwrite CONSTANT long OFN_PATHMUSTEXIST = 2048 //&H800
Protectedwrite CONSTANT long OFN_FILEMUSTEXIST = 4096 //&H1000
Protectedwrite CONSTANT long OFN_CREATEPROMPT = 8192 //&H2000
Protectedwrite CONSTANT long OFN_SHAREAWARE = 16384 //&H4000
Protectedwrite CONSTANT long OFN_NODEREFERENCELINKS = 1048576 //&H100000
Protectedwrite CONSTANT long OFN_LONGNAMES = 2097152 //&H200000                      
Protectedwrite CONSTANT long OFN_SHARENOWARN = 1
Protectedwrite CONSTANT long OFN_SHAREFALLTHROUGH = 2
Protectedwrite CONSTANT long OFN_SHAREWARN = 0
Protectedwrite CONSTANT long OFN_EXPLORER = 524288 //&H80000
Protectedwrite CONSTANT long OFN_ALLOWMULTISELECT = 512 //&H200



//----------------------------------
//    File Open function
//----------------------------------
public function integer open (unsignedlong hwnd, string title, ref string pathname[], ref string filename[], string filter, string initialdirectory, boolean multiselect, boolean explorer, long flags);openfilename     ofn
blob                    lblb_filter
blob                    lblb_filename
blob                    lblb_filetitle
double               li_pos, li_len, li_count
uint                    li_rc
string               ls_pathname
string               ls_filename
string               ls_null[]

if isnull(hwnd) then
     return -1
end if

ofn.lstructsize   = 76
ofn.hwdowner = 0
ofn.hinstance   = 0

lblb_filter = blob (filter + space(1))
li_pos = Pos ( filter, '|' )
DO WHILE li_pos > 0
     blobedit ( lblb_filter, li_pos, char(0))
     li_pos = Pos ( filter, '|', li_pos + 1 )
LOOP
blobedit (lblb_filter,len(lblb_filter),char(0))
ofn.lpstrfilter = lblb_filter
     
setnull( ofn.lpstrcustomfilter )
ofn.nmaxcustfilter  = 0
ofn.nfilterindex  = 1

if multiselect then                                
     ofn.nmaxfile = 2048000
     ofn.lpstrfile = blob (space(2047990))
else
     ofn.nmaxfile = 25600
     ofn.lpstrfile = blob (space(25590))
end if
ls_pathname += Space (ofn.nmaxfile)
blobedit(ofn.lpstrfile,1,char(0))

ofn.nmaxfiletitle  = 138
ls_filename = filename[1]
ls_filename += Space ( ofn.nmaxfiletitle - len ( filename[1]) - 10 )
lblb_filetitle = blob (ls_filename)
blobedit(lblb_filetitle,(len(filename[1])+1),char(0))
ofn.lpstrfiletitle = lblb_filetitle

ofn.lpstrinitialdir = initialdirectory
ofn.lpstrtitle = title


ls_filename = filename[1]
ls_filename += Space ( ofn.nmaxfiletitle - len ( filename[1]) - 10 )
lblb_filetitle = blob (ls_filename)
blobedit(lblb_filetitle,(len(filename[1])+1),char(0))
ofn.lpstrfile = lblb_filetitle


IF multiselect THEN
     flags += OFN_ALLOWMULTISELECT
END IF

IF explorer THEN
     flags += OFN_EXPLORER
END IF

ofn.flags   = flags

//ofn.nfileoffset   = 0
//ofn.nfileextension  = 0
ofn.lpstrdefext   = ''
//ofn.lcustdata   = 0
//ofn.lpfnhook   = 0
//ofn.lptemplatename  = ''

IF NOT this.GetOpenFileName (ofn) THEN
      li_rc = CommDlgExtendedError()
     if li_rc > 0 then
          messagebox ("Error ", "Error No " + string(li_rc))
     end if
     return li_rc
ELSE
     setpointer(hourglass!)
     IF multiselect THEN
          IF explorer THEN
               //For explorer, the first element is the directory, the rest are the filenames
               //and then are null seperated
               ls_pathname = Trim ( String ( ofn.lpstrfile ) )
               li_len = Len ( ls_pathname )
               ofn.lpstrfile = BlobMid ( ofn.lpstrfile, li_len + 2 )
               ls_filename = Trim ( String ( ofn.lpstrfile ) )
               li_len = Len ( ls_filename )
               filename[] = ls_null[]
               li_count = 0
               DO WHILE li_len > 0
                    filename[UpperBound(filename)+1] = ls_filename
                    pathname[UpperBound(pathname)+1] = ls_pathname + '\' + ls_filename
                    ofn.lpstrfile = BlobMid ( ofn.lpstrfile, li_len + 2 )
                    ls_filename = Trim ( String ( ofn.lpstrfile ) )
                    li_len = Len ( ls_filename )
                    li_count++
               LOOP
               if li_count = 0 then
                    if len(ls_pathname) > 0 then
                         ls_filename = trim ( string( ofn.lpstrfiletitle ) )
                         filename[UpperBound(filename)+1] = ls_filename
                         pathname[UpperBound(pathname)+1] = ls_pathname
                    end if    
               end if
          ELSE
               //For old style, the first element is the directory, the rest are the filenames
               //and the are seperated by spaces
               ls_pathname = Trim ( String ( ofn.lpstrfile ) )
               li_pos = Pos ( ls_pathname, ' ' )
               ls_filename = Mid ( ls_pathname, li_pos + 1 )
               ls_pathname = Left ( ls_pathname, li_pos - 1 )
               li_pos = Pos ( ls_filename, ' ' )
               filename[] = ls_null[]
               DO WHILE li_pos > 0
                    filename[UpperBound(filename)+1] = Left ( ls_filename, li_pos - 1 )
                    pathname[UpperBound(pathname)+1] = ls_pathname + '\' + Left ( ls_filename, li_pos - 1 )
                    ls_filename = Mid ( ls_filename, li_pos + 1 )
                    li_pos = Pos ( ls_filename, ' ' )
               LOOP
               filename[UpperBound(filename)+1] = ls_filename
               pathname[UpperBound(pathname)+1] = ls_pathname + '\' + ls_filename
          END IF
     ELSE
          //Only one file, don't need to loop through
          pathname[1] = String ( ofn.lpstrfile )
          filename[1] = String ( ofn.lpstrfiletitle )
     END IF
     setpointer(arrow!)
     Return 1
END IF


Regards,

BerXpert
0
 

Author Comment

by:QueenKretee
ID: 16834310
Oh my.  So sorry.  I didn't realize I'd left this open.
0

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

In our object-oriented world the class is a minimal unit, a brick for constructing our applications. It is an abstraction and we know well how to use it. In well-designed software we are not usually interested in knowing how objects look in memory. …
Update (December 2011): Since this article was published, the things have changed for good for Android native developers. The Sequoyah Project (http://www.eclipse.org/sequoyah/) automates most of the tasks discussed in this article. You can even fin…
This tutorial covers a step-by-step guide to install VisualVM launcher in eclipse.
The viewer will learn how to synchronize PHP projects with a remote server in NetBeans IDE 8.0 for Windows.
Suggested Courses

569 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question