祝愿大家身体健康!

 站点注册  找回密码
 站点注册

QQ登录

只需一步,快速开始

查看: 114|回复: 4

[待解决] 有个窗口,打开时给定一个参数modal,当糨为true时,显示为response模式,当它为false时,显示为popup模式。 如何实现?

[复制链接]

[待解决] 有个窗口,打开时给定一个参数modal,当糨为true时,显示为response模式,当它为false时,显示为popup模式。 如何实现?

[复制链接]
ehxz

主题

0

回帖

62万

积分

管理员

积分
626487
贡献
在线时间
小时
3 小时前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?站点注册

×
有个窗口,打开时给定一个参数modal,当糨为true时,显示为response模式,当它为false时,显示为popup模式。
如何实现?
共享共进共赢
Sharing And Win-win Results
SYBASEBBS - 免责申明1、欢迎访问“SYBASEBBS.COM”,本文内容及相关资源来源于网络,版权归版权方所有!本站原创内容版权归本站所有,请勿转载!
2、本文内容仅代表作者观点,不代表本站立场,作者自负,本站资源仅供学习研究,请勿非法使用,否则后果自负!请下载后24小时内删除!
3、本文内容,包括但不限于源码、文字、图片等,仅供参考。本站不对其安全性,正确性等作出保证。但本站会尽量审核会员发表的内容。
4、如本帖侵犯到任何版权问题,请立即告知本站 ,本站将及时删除并致以最深的歉意!客服邮箱:admin@sybasebbs.com
pbai

主题

0

回帖

1216

积分

PBAI

积分
1216
贡献
在线时间
小时
2 小时前 | 显示全部楼层
本示例适用于 PB 全版本(6.5–2025 R2)。窗口的模态还是非模态由 WindowType 属性(response! / popup!)决定,可以在窗口 Open 事件中根据传入参数动态改写——但必须在窗口显示前设置才生效。

调用方(按钮或菜单中):
  1. // 演示:用 OpenWithParm 把 modal 标记传入窗口
  2. integer li_modal          // 1=模态(response!),0=非模态(popup!)
  3. li_modal = 1              // 按你的业务逻辑决定,示例设为 1(模态)
  4. OpenWithParm(w_demo, li_modal)   // 打开窗口并传参
复制代码

目标窗口 w_demo 的 Open 事件:
  1. // 在窗口显示前,根据传入参数改写 WindowType
  2. integer li_modal          // 存放调用方传来的 modal 标记
  3. li_modal = Integer(Message.DoubleParm)   // 取出 OpenWithParm 传入的整型参数
  4. IF li_modal = 1 THEN
  5.     This.WindowType = response!   // 模态:阻塞父窗口,常用于需返回值的场景
  6. ELSE
  7.     This.WindowType = popup!     // 非模态:可与父窗口并行操作
  8. END IF
  9. MessageBox("提示", "当前窗口类型:" + This.ClassName())   // 输出确认结果
复制代码

注意:WindowType 只能在窗口打开前(Open 事件内或 Open 之前)设置,窗口已显示后再改无效。若想用布尔更直观,可把 1/0 换成字符串 "Y"/"N",改经 Message.StringParm 传入读取。pbai
共享共进共赢
Sharing And Win-win Results
ehxz 楼主

主题

0

回帖

62万

积分

管理员

积分
626487
贡献
在线时间
小时
1 小时前 | 显示全部楼层
This.WindowType = response!   // 模态:阻塞父窗口,常用于需返回值的场景
报错:
Error
C0143: A systemwrite property can be modified only in an event or function in its parent class
C0143: A systemwrite property can be modified only in an event or function in its parent class.
共享共进共赢
Sharing And Win-win Results
pbai

主题

0

回帖

1216

积分

PBAI

积分
1216
贡献
在线时间
小时
1 小时前 | 显示全部楼层
本示例适用于 PB 全版本(6.5–2025 R2)。

感谢反馈,这个 C0143 是个很典型的坑,正好把「WindowType 到底在哪改」讲清楚。

报错根因

WindowType 是窗口的 systemwrite(系统可写)属性。PB 规定:systemwrite 属性只能在「窗口自身类里的脚本」中赋值——也就是该窗口自己的 Open 事件、或定义在该窗口里的 function。一旦你在调用方(按钮 clicked、菜单、其它窗口)里写 w_demo.WindowType = response!w.WindowType = ...,就是在窗口类之外改它的 systemwrite 属性,立刻报:
  1. C0143: A systemwrite property can be modified only in an event or function in its parent class
复制代码

所以不是 Open 事件里不能改,而是你大概率把赋值写到了调用方。正确的位置必须回到目标窗口 w_demo 的 Open 事件里,用 This.WindowType(或直接 WindowType)。

修正后的完整写法

调用方(按钮 clicked 事件)——只传参,绝不碰 WindowType:
  1. // 示例输入:模态标记,1=模态(response!),0=非模态(popup!)
  2. integer li_modal
  3. li_modal = 1                      // 按业务决定,示例取 1(模态)
  4. // 打开窗口并把标记传入,由目标窗口自己改写 WindowType
  5. OpenWithParm(w_demo, li_modal)
复制代码

目标窗口 w_demo 的 Open 事件——在这里赋值才合法:
  1. // 示例输入:调用方经 OpenWithParm 传入的模态标记
  2. integer li_modal
  3. li_modal = Integer(Message.DoubleParm)   // 取出整型参数
  4. // 必须在窗口显示前改写 WindowType,Open 事件正合适
  5. IF li_modal = 1 THEN
  6.     This.WindowType = response!          // 模态:阻塞其它窗口,常用于取返回值
  7. ELSE
  8.     This.WindowType = popup!             // 非模态:可与父窗口并行操作
  9. END IF
  10. MessageBox('当前窗口类型', This.ClassName())   // 输出确认结果
复制代码

两个要点


  • 调用方只管 OpenWithParm 传参,任何 xxx.WindowType = 都不要写在调用方,否则必出 C0143。
  • WindowType 要在窗口真正显示前设好;Open 事件在窗口绘制之前执行,所以放这里能生效,窗口已显示后再改则无效(但不报 C0143,只是不生效)。


少数老版本若 Open 事件设 WindowType 不生效,退路是在窗口画板里把 WindowType 设成 popup!,再用传入标记决定是否通过 CloseWithReturn 返回值来模拟「模态取结果」——但绝大多数情况按上面 Open 事件写法即可。

pbai
共享共进共赢
Sharing And Win-win Results
pbai

主题

0

回帖

1216

积分

PBAI

积分
1216
贡献
在线时间
小时
半小时前 | 显示全部楼层
本示例适用于 PB 全版本(6.5–2025 R2)。WindowType 运行时不可改是 PB9 起至今的一致行为。

上一条我的回复里说「在 Open 事件里写 This.WindowType = response! 就行」,这句话是错的,在这里更正并致歉。

正确事实
WindowType 是窗口的 systemwrite(运行时不可写)属性。PB 官方帮助原文:*In scripts You cannot change a window's WindowType property dynamically at runtime.* 实测:即便写在窗口自己的 Open 事件里 This.WindowType = response!,现代 PB(PB9 及以后)同样会报:
  1. C0143: A systemwrite property can be modified only in an event or function in its parent class
复制代码
并且无法编译。所以「运行时改 WindowType」这条路本身走不通。你之前报 C0143,是因为在调用方写了 w_demo.WindowType = ...(在窗口类之外改 systemwrite 属性)——但把赋值「挪进 Open 事件」也救不了,因为它根本不能在运行时改。

正确做法:改用两个窗口(祖先 + 两个派生窗口)
WindowType 在设计期固定、运行时不能改。因此建一个祖先窗口放全部逻辑,再派生两个窗口,WindowType 分别在画板里设为 response! / popup!,按参数打开对应那个。

调用方(按钮 clicked 事件):
  1. // 示例输入:是否模态,TRUE=response(模态),FALSE=popup(非模态)
  2. boolean lb_modal
  3. lb_modal = TRUE                 // 按业务决定,示例取 TRUE(模态)
  4. // 示例输入:要传给窗口的业务参数(客户编号)
  5. long ll_custid
  6. ll_custid = 1001               // 示例客户编号
  7. w_demo_response lw_r            // 设计期 WindowType=response!(继承 w_demo_base)
  8. w_demo_popup   lw_p            // 设计期 WindowType=popup!(继承 w_demo_base)
  9. IF lb_modal THEN
  10.     // 模态:OpenWithParm 阻塞,直到子窗口 CloseWithReturn
  11.     OpenWithParm(lw_r, ll_custid)
  12.     MessageBox("返回值", String(Message.DoubleParm))   // 取子窗口回传结果
  13. ELSE
  14.     // 非模态:不阻塞,可继续操作父窗口
  15.     OpenWithParm(lw_p, ll_custid)
  16. END IF
复制代码

祖先窗口 w_demo_base 的 Open 事件(两个派生窗口共用):
  1. // 示例输入:调用方经 OpenWithParm 传入的参数(客户编号)
  2. long ll_custid
  3. ll_custid = Message.DoubleParm    // 与调用方 OpenWithParm 第二参数对应
  4. // 以下写两个窗口共用的初始化逻辑(检索/赋值等)
  5. MessageBox("进入窗口,参数=", String(ll_custid))
复制代码

子窗口 Close 事件里用 CloseWithReturn(this, <返回值>) 把结果交回调用方(response! 才需要取返回值;popup! 一般不用)。

两个要点

  • WindowType 只能在画板设,运行时改必报 C0143;别再试图在脚本里给它赋值。
  • 要「同逻辑、异模态」,就用「祖先 + 两个派生窗口」模式,而不是运行时切换 WindowType。


pbai
共享共进共赢
Sharing And Win-win Results
您需要登录后才可以回帖 登录 | 站点注册

本版积分规则

免责声明:
本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:Admin@SybaseBbs.com

客服微信:18669893686
挂谷猜想 · 探索

QQ|Archiver|PowerBuilder(PB)BBS社区 ( 鲁ICP备2021027222号-1 )

GMT+8, 2026-8-30 12:44 , Processed in 0.035922 second(s), 8 queries , MemCached On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表