【问题标题】:Powerbuilder .net adds \ escape character for double quotes in string variable:pfc_n_cst_winsrv_statusbarPowerbuilder .net 为字符串变量中的双引号添加 \ 转义字符:pfc_n_cst_winsrv_statusbar
【发布时间】:2014-04-03 17:09:36
【问题描述】:

基本上pfc_n_cst_winsrv_statusbar.of_createdwobjectls_dwdefinition 中生成一个数据窗口定义,然后使用它来创建一个数据窗口。我正在使用 PFC Example 应用程序和最新的 12.5 Classic PFC pbls 对此进行测试。这适用于 PB Classic 12.5.2 Build 5006。将该应用程序迁移到 PB .net 12.5.2 Build 5006。这在 PB .net 中不起作用。在ls_dwdefinition 中生成数据窗口定义时,PB .net 在ls_dwdefinition 中嵌入的所有双引号前插入\ 转义字符。数据窗口的后续创建失败(请参阅下面的错误)我假设是因为 \ 转义字符未被识别为有效的 dw 语法。我比较了 PB Classic 12.5 中创建的 dwsyntax 字符串与 PB .net 创建的 dw 语法字符串,我能看到的唯一区别是 \ 转义字符。

以前有人见过这种行为吗?有没有我可以更改的设置来消除这种行为?任何帮助将不胜感激。顺便说一句,这不仅仅是一个练习,我最初在我们正在迁移到 PB .net 的专有应用程序中看到了这种行为。

问候,

托德·奥斯特瑞奇

System.Exception: 语法不正确\r\n at Sybase.DataWindow.Core.DWObject.ParseInt(字符串值)\r\n at Sybase.DataWindow.Core.DWDataWindow.SetProperty(字符串名称,字符串 值)\r\n 在 Sybase.DataWindow.Core.SrdParser.a(IDWObject A_0, 字符串 A_1、字符串 A_2)\r\n 在 Sybase.DataWindow.Core.SrdParser.value(IDWObject prop, String nm)\r\n 在 Sybase.DataWindow.Core.SrdParser.name_value_pair(IDWObject prop)\r\n 在 Sybase.DataWindow.Core.SrdParser.property()\r\n 在 Sybase.DataWindow.Core.SrdParser.srd_definition()\r\n at Sybase.DataWindow.Core.DWSrdSyntaxReader.Parse(DWObject 父级,字符串 语法,DWParserOptions parserOptions)\r\n at Sybase.DataWindow.Core.DWDataWindowObject.a(DWSrdSyntaxReader A_0, 字符串 A_1、DWParserOptions A_2、字符串& A_3、DWDataWindowObject& A_4)

【问题讨论】:

    标签: .net escaping powerbuilder double-quotes backslash


    【解决方案1】:

    您是否尝试过解析 dwsyntax 并在使用它创建 dw 之前去掉添加的斜杠?

    【讨论】:

    • 马特,是的,我已经做到了(尝试过),内部添加了转义字符!例如,我删除了 textpad 中的 \'s,将其复制到剪贴板,在调试会话中将其粘贴到 ls_dwdefinition 变量中,在内部,当粘贴操作发生时,\'s 会重新应用。
    • 以编程方式从字符串中删除 \ 然后尝试创建 dw 怎么样?
    • 我试过了,当我用 pos 函数搜索 \" 的出现时,它没有找到它。我想我可以搜索 " 本身,然后将字符串连接到左边前导 \ 与前导反斜杠右侧的字符串。尽管反斜杠仅在内部被识别,但我几乎可以肯定这不起作用。例如,如果您将 '"' 分配给一个字符串变量,并在调试器中查看它,它将显示为 "\""。但是,如果您随后在消息框中显示该字符串 var,它只会显示“。(续)
    • “内部”识别的一个例外似乎是当具有数据窗口定义的变量被传递给创建函数时,反斜杠似乎与数据窗口定义的其余部分一起被推动。跨度>
    【解决方案2】:

    好的,想通了(在朋友的帮助下,我远离了我的 \ 转义字符“猜测”)

    原来 pfc_n_cst_winsrv_statusbar.of_createdwobject 函数中有几个代码错误。但显然 PB Classic 编译器比 PB .net 更宽容。

    1) DW 颜色属性直接与 DW timer_interval 属性对接,这两个属性之间应该有一个空格,PB Classic 似乎可以这样做,并且仍然会创建 DW,但 PB .net 将其吐回。

    // Create the desired DataWindow Timer Interval.    
    If ib_timer Then    
                // A timer event is defined. Use the appropriate value.    
                ls_dwtimerinterval = 'timer_interval=' + string(il_timerinterval)    
    Else    
                // No timer event is defined.    
                ls_dwtimerinterval = 'timer_interval=0 '    
    End If
    
    // Create the Header string.    
    ls_header = &  
      'release 6; '+ &  
      'datawindow(units=0 '+ &  
      ls_dwtimerinterval + &  
    'color=80263328 processing=0 HTMLDW=no print.documentname="" ' + &  
      'print.orientation = 0 print.margin.left = 107 print.margin.right = 107 ' + &  
      'print.margin.top = 97 print.margin.bottom = 97 print.paper.source = 0 ' + &  
      'print.paper.size = 0 print.prompt=no print.buttons=no print.preview.buttons=no) ' + &  
      'header(height=' + string(li_microhelpheight) + ' color="536870912" ) ' + &  
      'summary(height=1 color="536870912" ) ' + &  
      'footer(height=1 color="536870912" ) ' + &  
      'detail(height=1 color="536870912" ) ' + &  
      'table(column=(type=char(20) updatewhereclause=no name=requiredcol dbname="requiredcol" ) ) '  
    

    2) 在编译上述修复程序时,我们遇到了几个“无法将一元运算符应用于字符串变量”的错误。下面的大红色加号不是有效的 PB 语法,但 PB Classic 似乎还可以,基本上忽略了它,PB .net 不太好,将其视为原样,一元运算符。

    选择大小写较低(inv_dwobjects[li_cnt].s_type)
    案例正文
    ls_newobject = + &
    '计算('+ &
    'name=' + inv_dwobjects[li_cnt].s_id + ' ' + &
    '表达式="~'' + 字符串(inv_dwobjects[li_cnt].s_value) + '~'" '+ & 'border="' + 字符串(inv_dwobjects[li_cnt].i_bordertype) +'" ' + &
    'x="' + 字符串(li_xpoint) + '" ' + &
    'height="'+string(li_microhelpheight)+'" ' + &
    'width="'+ 字符串(inv_dwobjects[li_cnt].i_width) + '" ' + &
    'background.color="12632256" ' +&
    'band=header 对齐="0" color="33554432" y="0" '+ & 'font.face="MS 无衬线" font.height="-8" font.weight="400" '+ & 'font.family="2" font.pitch="2" font.charset="0" background.mode="2" ' +& ') '

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-07
      相关资源
      最近更新 更多