带有动态文件类型过滤器的 SYSTEM-DIALOG GET-FILE

SYSTEM-DIALOG GET-FILE with dynamic file type filters

使用 OpenEdge 11.7 和 Windows 7,我正在使用以下工作代码搜索磁盘文件:

DEFINE VARIABLE cFileName AS CHARACTER NO-UNDO.
DEFINE VARIABLE lChose AS LOGICAL NO-UNDO.

SYSTEM-DIALOG GET-FILE cFileName
    FILTERS "Text Files (*.txt)" "*.txt", "Comma-Separated Value Files (*.csv)" "*.csv"
    UPDATE lChose.

有没有办法用变量动态构建过滤器列表?我试过这个,但不起作用:

DEFINE VARIABLE cFileName AS CHARACTER NO-UNDO.
DEFINE VARIABLE cFilters AS CHARACTER NO-UNDO.
DEFINE VARIABLE lChose AS LOGICAL NO-UNDO.

cFilters = '"Text Files (*.txt)" "*.txt", "Comma-Separated Value Files (*.csv)" "*.csv"'.

SYSTEM-DIALOG GET-FILE cFileName
    FILTERS cFilters
    UPDATE lChose. 

我也试过:

FILTERS VALUE(cFilters)

return 和 "unable to understand" 错误 (198)。这还能做到吗?

ABL 及其有趣的语法...文档指出每个过滤器标签和过滤器文件规范本身就是一个表达式。您可以传递空对,那些将被忽略。所以这在这里有效 - 数组元素 5 - 10 为空且被压缩:

DEFINE VARIABLE cFileName AS CHARACTER NO-UNDO.
DEFINE VARIABLE cFilters AS CHARACTER NO-UNDO EXTENT 10.
DEFINE VARIABLE lChose AS LOGICAL NO-UNDO.

ASSIGN 
    cFilters[1] = "Text Files (*.txt)" 
    cFilters[2] = "*.txt"
    cFilters[3] = "Comma-Separated Value Files (*.csv)"
    cFilters[4] = "*.csv" .

SYSTEM-DIALOG GET-FILE cFileName
    FILTERS cFilters[1] cFilters[2], cFilters[3] cFilters[4], cFilters[5] cFilters[6], cFilters[7] cFilters[8], cFilters[9] cFilters[10]   
    UPDATE lChose. 

或使用 .NET 作为替代:

DEFINE VARIABLE cFileName AS CHARACTER NO-UNDO.
DEFINE VARIABLE cFilters AS CHARACTER NO-UNDO.
DEFINE VARIABLE lChose AS LOGICAL NO-UNDO.

cFilters = "Text Files (*.txt)|*.txt|Comma-Separated Value Files (*.csv)|*.csv".

DEFINE VARIABLE oSystemDialog AS System.Windows.Forms.OpenFileDialog NO-UNDO . 
DEFINE VARIABLE oDialogResult AS System.Windows.Forms.DialogResult NO-UNDO . 

oSystemDialog = NEW System.Windows.Forms.OpenFileDialog () .
oSystemDialog:Filter = cFilters .
oSystemDialog:CheckFileExists = TRUE . 
oSystemDialog:RestoreDirectory  = TRUE .

WAIT-FOR oSystemDialog:ShowDialog () SET oDialogResult . 

IF Progress.Util.EnumHelper:AreEqual (oDialogResult, System.Windows.Forms.DialogResult:OK) THEN
DO:
    ASSIGN lChose = TRUE 
           cFileName = oSystemDialog:FileName. 
END.
ELSE 
    ASSIGN lChose = FALSE 

好像可以这样写

DEFINE VARIABLE cFileName AS CHARACTER NO-UNDO.
DEFINE VARIABLE cFilter1a AS CHARACTER NO-UNDO.
DEFINE VARIABLE cFilter1b AS CHARACTER NO-UNDO.
DEFINE VARIABLE cFilter2a AS CHARACTER NO-UNDO.
DEFINE VARIABLE cFilter2b AS CHARACTER NO-UNDO.
DEFINE VARIABLE lChoose AS LOGICAL NO-UNDO.

assign
    cFilter1a = "Text Files (*.txt)"
    cFilter1b = "*.txt"
    cFilter2a = "Comma-Separated Value Files (*.csv)"
    cFilter2b = "*.csv"
.

SYSTEM-DIALOG GET-FILE cFileName
    FILTERS cFilter1a cFilter1b, cFilter2a cFilter2b
    UPDATE lChoose.

这对你可能有用也可能没用。