Artículo original: PUTFILE function as originally typed (not in uppercase)
http://vfpimaging.blogspot.com/2021/01/putfile-function-as-originally-typed.html
Autor: Cesar Ch.
Traducido por: Google Translate
Como ya se ha discutido en Fox.Wikis: "VFP siempre ha sido un poco más gracioso con los casos de nombres de archivo. Más específicamente, no está documentado cómo funciona con el caso de nombres de archivo. Se traducirá los nombres de archivo a minúsculas en algunos casos, a mayúsculas en otros, y dejarlo igual en otros."
PUTFILE() está en esa lista de funciones extrañas, siempre devolviendo los nombres de archivo en MAYÚSCULAS. Así que aquí hay una pequeña función que he estado usando que devuelve el nombre de archivo elegido de la forma en que el usuario lo escribió.
Los parámetros y el uso son exactamente los mismos que los de la función PUTFILE() original de Visual FoxPro:
FUNCTION XPUTFILE(tcCustomText, tcFileName, tcFileExt)
* Usage:
* ? PUTFILE("Save file as...", "MyFile.PDF", "PDF;TXT;*")
#DEFINE COMMDLOG_DEFAULT_FLAG 0x00080000
#DEFINE COMMDLOG_RO 4
#DEFINE COMMDLOG_MULTFILES 512
LOCAL lcSetDefa
m.lcSetDefa = SET("Default") + CURDIR()
LOCAL loDlgForm AS "Form"
m.loDlgForm = CREATEOBJECT("Form")
m.loDlgForm.ADDOBJECT("oleObject1", "oleComDialObject")
LOCAL loDlg
m.loDlg = m.loDlgForm.OleObject1
LOCAL lcFilter, lcFileExt, lnExtCount, N
IF NOT EMPTY(tcFileExt)
lnExtCount = GETWORDCOUNT(m.tcFileExt, ";")
lcFilter = ""
FOR N = 1 TO lnExtCount
lcFileExt = GETWORDNUM(m.tcFileExt, N, ";")
IF lcFileExt = "*"
lcFilter = lcFilter + "All files|*.*"
ELSE
lcFilter = lcFilter + lcFileExt + " files|*." + lcFileExt && EVL(tcFileExt, "All files|*.*")
ENDIF
IF N < lnExtCount
lcFilter = lcFilter + "|"
ENDIF
ENDFOR
ELSE
lcFilter = "*.*|*.*" && EVL(tcFileExt, "All files|*.*")
ENDIF
m.loDlg.FILTER = lcFilter
m.loDlg.FileName = EVL(m.tcFileName, "")
m.loDlg.DialogTitle = EVL(m.tcCustomText, "Save file as...")
m.loDlg.FLAGS = COMMDLOG_RO + COMMDLOG_DEFAULT_FLAG
m.loDlg.MaxFileSize = 256
LOCAL lnResult AS INTEGER, lcFileName
* lnResult = loDlg.ShowOpen()
m.lnResult = m.loDlg.ShowSave()
* Restore the original directory
SET DEFAULT TO (m.lcSetDefa)
IF EMPTY(m.loDlg.FileTitle) && Clicked 'Cancel'
m.lcFileName = ""
ELSE
m.lcFileName = m.loDlg.FileName
ENDIF
m.loDlgForm = NULL
RETURN m.lcFileName
DEFINE CLASS oleComDialObject AS OLECONTROL
OLECLASS ="MSComDlg.CommonDialog.1"
ENDDEFINE