笔记【图书管理系统】开发之客户端界面设计 (TBBUTTON,IMAGELIST,BITMAP,兼容DC)

要设计这样一个界面,这篇主要讲五个按钮的设置以及下面背景图片的载入

首先5个按钮

一、设置工具栏以及工具栏按钮

1.工具栏的设置:

HWND hToolbar;

CreateWindowEx(

 0,        //窗口扩展风格

 TOOLBARCLASSNAME,       //窗口类名称

 "TOOLBAR",            //窗口名称
WS_VISIBLE | WS_CHILD ,        //窗口格式
0,0,0,0,              //窗口的位置以及大小
hWnd,      
<think>我们面对的需求是:在表单中点击工具栏按钮(RAER_tbButton)时,触发Python脚本,将物料基础资料中的体积(FMATERIALID.FVOLUME)赋值给报表中的体积字段(FVolume)。 分析: 1. 触发方式:点击工具栏按钮,这是一个用户界面操作,因此适合在表单插件中处理。 2. 操作对象:当前表单上的字段(FMATERIALID和FVolume),属于客户端操作。 3. 数据来源:FMATERIALID字段是基础资料字段,其值是一个对象,其中包含FVOLUME属性。 因此,我们应该使用表单插件(Form Plugin)来实现。 实现思路: 1. 在表单插件中,我们需要监听工具栏按钮的点击事件。 2. 当点击指定按钮(RAER_tbButton)时,执行赋值操作。 3. 赋值操作:获取当前行的物料基础资料,从中取出体积(FVOLUME),然后赋值给当前行的FVolume字段。 注意:销售出库单可能有多个分录(多行),因此我们需要考虑当前光标所在行(即当前操作行)。 步骤: 1. 重写表单插件的ButtonClick事件(或BarItemClick事件),判断点击的按钮是否为指定的RAER_tbButton。 2. 获取当前行号(当前焦点所在的行)。 3. 获取当前行物料字段(FMATERIALID)的值,这个值是一个基础资料对象。 4. 从基础资料对象中获取体积(FVOLUME)属性。 5. 将获取到的体积值赋给当前行的FVolume字段。 6. 更新界面显示。 代码实现: ```python import clr clr.AddReference('System') clr.AddReference('System.Core') clr.AddReference('Kingdee.BOS') clr.AddReference('Kingdee.BOS.Core') from Kingdee.BOS import * from Kingdee.BOS.Core import * from Kingdee.BOS.Core.Bill.PlugIn import * from Kingdee.BOS.Core.DynamicForm.PlugIn import * class AssignMaterialVolumePlugin(AbstractBillPlugIn): # 重写按钮点击事件 def BarItemClick(self, e): # 判断点击的是否为指定按钮 if e.BarItemKey == "RAER_tbButton": # 获取当前行号(当前操作行) rowIndex = self.View.Model.GetEntryCurrentRowIndex("FEntity") # 假设分录标识为FEntity # 获取当前行的物料基础资料对象 material = self.View.Model.GetValue("FMATERIALID", rowIndex) if material is not None: # 获取物料的体积属性(注意:基础资料对象中,扩展字段可能以Key-Value形式存储) # 方式1:直接通过属性名获取(如果该属性在基础资料中已存在) # volume = material["FVOLUME"] if "FVOLUME" in material else 0.0 # 方式2:使用GetFieldValue方法(更安全,可以处理基础资料扩展字段) # 这里我们采用方式1,因为FVOLUME是物料的标准字段。如果是自定义字段,可能需要使用方式2。 volume = material.GetFieldValue("FVOLUME") # 或者 material["FVOLUME"] # 将体积值赋给报表字段FVolume self.View.Model.SetValue("FVolume", volume, rowIndex) # 更新界面 self.View.UpdateView("FVolume", rowIndex) else: # 物料为空,可以清空体积字段或者给出提示 self.View.ShowMessage("当前行物料为空!", MessageBoxInformationType.Information) # 阻止事件继续传递(如果需要) e.IsCancel = True # 其他按钮事件不处理,继续传递 super().BarItemClick(e) ``` 注意: 1. 上述代码假设分录标识为"FEntity",实际开发中请替换为销售出库单分录的实际标识。 2. 获取物料体积的方式有两种,根据实际情况选择。如果FVOLUME是物料的标准字段,直接使用`material["FVOLUME"]`即可。如果是扩展字段,可能需要使用`material.GetFieldValue("F_XXX_Volume")`(其中F_XXX_Volume是扩展字段标识)。 3. 如果体积字段在基础资料中不存在,需要检查物料基础资料是否启用了体积字段,并确保在单据上绑定了该字段。 部署: 1. 在BOS设计器中打开销售出库单表单。 2. 创建新的表单插件(Python插件)。 3. 将上述代码复制到插件文件中。 4. 注册插件到销售出库单表单。 测试: 1. 打开销售出库单,选择一行分录,填写物料(该物料在基础资料中已维护体积)。 2. 点击工具栏按钮"RAER_tbButton",观察该行FVolume字段是否被正确赋值。 注意事项: 1. 按钮的标识(BarItemKey)必须与代码中的"RAER_tbButton"一致。如果不一致,请修改代码中的字符串。 2. 如果分录有多行,该操作只对当前行有效。 3. 如果希望批量操作多行,需要遍历分录的所有行。 如果需要批量处理所有行,可以修改代码如下: ```python if e.BarItemKey == "RAER_tbButton": # 获取分录所有行 rowCount = self.View.Model.GetEntryRowCount("FEntity") for rowIndex in range(rowCount): material = self.View.Model.GetValue("FMATERIALID", rowIndex) if material is not None: volume = material.GetFieldValue("FVOLUME") self.View.Model.SetValue("FVolume", volume, rowIndex) # 刷新整个表格 self.View.UpdateView("FEntity") ``` 但请注意,批量操作可能会影响性能,特别是行数较多时。因此,根据实际需求选择单行操作还是多行操作。 相关问题: 1. 如何获取金蝶云星空表单中工具栏按钮的标识(BarItemKey)? 2. 在表单插件中如何遍历单据体所有行? 3. 如何判断基础资料对象中是否存在某个字段? 4. 金蝶云星空Python表单插件中如何弹出消息提示框?</think>### 金蝶云星空表单插件实现方案:工具栏按钮触发体积赋值 #### 插件类型选择 **应注册为表单插件**,原因如下: 1. **界面交互需求**:工具栏按钮点击是客户端操作,需要即时响应界面事件[^1] 2. **字段赋值操作**:直接操作表单字段值,无需服务端计算 3. **实时反馈**:需要立即更新界面显示结果 #### Python脚本实现 ```python import clr clr.AddReference('System') clr.AddReference('Kingdee.BOS') clr.AddReference('Kingdee.BOS.Core') from Kingdee.BOS import * from Kingdee.BOS.Core import * from Kingdee.BOS.Core.Bill.PlugIn import * class AssignVolumePlugin(AbstractBillPlugIn): # 重写工具栏按钮点击事件 def BarItemClick(self, e): # 仅响应特定按钮点击 if e.BarItemKey == "RAER_tbButton": # 获取当前操作行 row = self.View.Model.GetEntryCurrentRowIndex("FEntity") # 分录标识 # 获取物料基础资料对象 material = self.View.Model.GetValue("FMATERIALID", row) if material: # 提取物料体积 (基础资料字段) volume = material["FVOLUME"] if "FVOLUME" in material else 0.0 # 赋值到报表字段 self.View.Model.SetValue("FVolume", volume, row) # 刷新界面显示 self.View.UpdateView("FVolume", row) # 提示操作成功 self.View.ShowMessage("体积已更新为: " + str(volume)) else: self.View.ShowMessage("当前行物料为空", MessageBoxType.Warning) ``` #### 关键实现说明 1. **事件绑定** 使用`BarItemClick`事件捕获工具栏按钮点击: ```python if e.BarItemKey == "RAER_tbButton": # 精确匹配按钮标识 ``` 2. **当前行定位** 获取用户当前操作的行号: ```python row = self.View.Model.GetEntryCurrentRowIndex("FEntity") # 单据体标识 ``` 3. **体积值获取** 通过物料对象的字典式访问获取体积: ```python volume = material["FVOLUME"] # 直接访问基础资料属性 ``` 4. **空值处理** ```python volume = material["FVOLUME"] if "FVOLUME" in material else 0.0 ``` 避免字段不存在时报错 #### 部署步骤 1. **创建插件** - 在BOS设计器中新建Python插件 - 复制上述代码到插件文件 2. **注册插件** ```路径 销售出库单表单 → 扩展 → 表单插件 → 添加新插件 ``` 3. **按钮标识验证** ```验证方法 1. 打开表单设计器 2. 定位工具栏按钮RAER_tbButton 3. 右键查看属性面板中的"标识"字段 ``` 4. **测试验证** ```测试用例 1. 打开销售出库单 2. 选择一行分录 3. 点击RAER_tbButton工具栏按钮 4. 观察FVolume字段是否更新为物料体积 ``` #### 技术原理图解 ```mermaid sequenceDiagram 用户界面->>表单插件: 点击RAER_tbButton 表单插件->>数据模型: 获取当前行物料(FMATERIALID) 数据模型-->>表单插件: 返回物料对象 表单插件->>物料对象: 提取FVOLUME值 表单插件->>数据模型: 设置FVolume字段值 表单插件->>用户界面: 刷新字段显示 ``` #### 注意事项 1. **按钮权限** 确保用户有权限访问该工具栏按钮: ```配置路径 系统管理 → 权限管理 → 功能权限 → 分配按钮权限 ``` 2. **字段绑定验证** 使用F7功能检查字段实际绑定: ```操作 在单据界面按F7 → 查看字段实际绑定的属性路径 ``` 3. **多行处理** 如需批量处理所有行,可添加循环: ```python row_count = self.View.Model.GetEntryRowCount("FEntity") for row in range(row_count): material = self.View.Model.GetValue("FMATERIALID", row) # ... 赋值操作 ... ``` 4. **调试技巧** 使用消息框输出调试信息: ```python self.View.ShowMessage(f"当前行: {row}, 体积值: {volume}") ``` --- ### 相关问题 1. 如何获取金蝶云星空表单中工具栏按钮的标识(BarItemKey)? 2. 在表单插件中如何遍历单据体所有行进行批量操作? 3. 金蝶云星空Python插件中如何捕获下拉框选择变化事件? 4. 表单插件和服务端插件在权限控制上有哪些区别? [^1]: 线性链表操作原理 [^2]: 队列操作实现机制 [^3]: 队列操作的指针处理 [^4]: 循环队列的边界条件处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值