
声明:本文档由AI自动生成。

# 宏记 GridFilter 类库帮助文档
## 概述
宏记 GridFilter 是一个功能强大的 Visual FoxPro 表格列筛选类库,提供专业的列筛选、排序和自定义筛选功能。本类库采用逻辑删除技术实现数据筛选,避免了传统 SET FILTER 命令的性能问题。
## 系统要求
- Visual FoxPro 9.0 或更高版本
- 推荐使用 MyFll.Fll 库以获得更好的拼音筛选性能
## 类库结构
### 主要组件
| 类名 | 功能描述 | 基类 |
|------|----------|------|
| `gridfilter` | 主筛选控制器 | Custom |
| `gridfilter_columncmd` | 列筛选按钮 | CommandButton |
| `gridfilter_filterform` | 筛选表单 | Form |
| `gridfilter_filterformadv` | 高级筛选表单 | Form |
| `gridfilter_filterformadv_item` | 高级筛选条件项 | Container |
| `gridfilter_filterformadv_andor` | 条件关系选择 | OptionGroup |
## 快速开始
### 基础使用示例
```foxpro
*** <summary>
*** 基础使用示例
*** </summary>
Procedure Example_BasicUsage
Private All Like l*
Local loGridFilter As gridfilter
*!* 创建 GridFilter 实例
m.loGridFilter = CreateObject([gridfilter])
*!* 设置关联的 Grid 对象
m.loGridFilter.Grid = ThisForm.GrdData
*!* 启用筛选功能
m.loGridFilter.Enabled = .T.
*!* 可选:设置筛选前后处理
m.loGridFilter.FilterRecordBefore = [MyFilterBefore()]
m.loGridFilter.FilterRecordAfter = [MyFilterAfter()]
EndProc
```
### 完整集成示例
```foxpro
*** <summary>
*** 完整集成示例
*** </summary>
Define Class MyForm As Form
Height = 400
Width = 600
*!* 添加表格控件
Add Object GrdData As Grid With ;
Top = 10, ;
Left = 10, ;
Height = 300, ;
Width = 580, ;
RecordSource = [MyCursor]
*!* GridFilter 实例
oGridFilter = .Null.
*** <summary>
*** 初始化方法
*** </summary>
Procedure Init
DODEFAULT()
*!* 初始化数据
This.InitData()
*!* 创建并配置 GridFilter
This.oGridFilter = CreateObject([gridfilter])
This.oGridFilter.Grid = This.GrdData
This.oGridFilter.Enabled = .T.
EndProc
*** <summary>
*** 初始化示例数据
*** </summary>
Procedure InitData
*!* 创建示例数据
Create Cursor MyCursor (;
ID I, ;
Name C(20), ;
Department C(20), ;
Salary N(10,2);
)
*!* 插入示例记录
Insert Into MyCursor Values (1, '张三', '技术部', 8000)
Insert Into MyCursor Values (2, '李四', '销售部', 6000)
Insert Into MyCursor Values (3, '王五', '技术部', 9000)
Insert Into MyCursor Values (4, '赵六', '人事部', 5500)
Insert Into MyCursor Values (5, '钱七', '销售部', 7000)
EndProc
*** <summary>
*** 清理资源
*** </summary>
Procedure Destroy
If Vartype(This.oGridFilter) = [O]
This.oGridFilter.ClearFilter()
This.oGridFilter = .Null.
EndIf
DODEFAULT()
EndProc
EndDefine
```
## 核心类详解
### gridfilter 类
#### 主要属性
| 属性 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `Enabled` | Logical | .T. | 是否启用筛选功能 |
| `EnabledSort` | Logical | .T. | 是否启用排序功能 |
| `Grid` | Object | "" | 关联的 Grid 对象(必填) |
| `IsHasFilter` | Logical | .F. | 当前是否有筛选状态(只读) |
#### 主要方法
##### ClearFilter
```foxpro
*** <summary>
*** 清除所有筛选条件
*** </summary>
Procedure ClearFilter
*!* 清除筛选条件,恢复原始数据
EndProc
```
##### FilterRecordBefore
```foxpro
*** <summary>
*** 筛选前验证方法
*** </summary>
*** <returns>Logical - 返回 .T. 时执行筛选</returns>
Procedure FilterRecordBefore
Return .T.
EndProc
```
##### FilterRecordAfter
```foxpro
*** <summary>
*** 筛选后处理方法
*** </summary>
Procedure FilterRecordAfter
*!* 可在此处添加筛选后的处理逻辑
EndProc
```
##### ReadMe
```foxpro
*** <summary>
*** 显示使用说明
*** </summary>
Procedure ReadMe
*!* 显示详细的类库使用说明
EndProc
```
### gridfilter_columncmd 类
#### 主要属性
| 属性 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `IsFiltered` | Logical | .F. | 是否已有筛选 |
| `GridFilter` | Object | .Null. | 关联的 GridFilter 对象 |
| `Column` | Object | .Null. | 对应的列对象 |
| `Picture` | String | "..\image\筛选1.bmp" | 按钮图标 |
## 功能特性
### 1. 多种筛选方式
#### 基本筛选
- 通过复选框选择特定值
- 支持全选、反选、取消选择
#### 关键字筛选
- 支持拼音简写筛选(如 "GZ" 可匹配 "广州")
- 支持多条件过滤,关键字用空格分隔
- 三种匹配模式:
- 同时包含所有关键字
- 包含任一关键字
- 包含整个字符串
#### 高级筛选
- 自定义条件表达式
- 支持多种比较运算符(等于、不等于、大于、小于等)
- 支持范围筛选
- 支持忽略大小写
### 2. 排序功能
- 升序排序
- 降序排序
- 取消排序
- 双击列标题切换排序状态
### 3. 特殊筛选
#### 唯一项筛选
快速筛选字段中的唯一值
#### 重复项筛选
快速筛选字段中的重复值
## 性能优化
### 使用 MyFll 库
为了提高拼音筛选性能,建议使用 MyFll.Fll 库:
```foxpro
*** <summary>
*** 启用性能优化
*** </summary>
Procedure EnablePerformance
If File([MyFll.Fll])
Set Library To MyFll.Fll Additive
EndIf
EndProc
```
### 大数据量处理建议
```foxpro
*** <summary>
*** 大数据量优化配置
*** </summary>
Procedure OptimizeForLargeData
Private All Like l*
Local loGridFilter As gridfilter
With m.loGridFilter
*!* 合理设置筛选表单大小
.AddProperty([UserFilterFormHeight], 500)
.AddProperty([UserFilterFormWidth], 450)
*!* 建议使用临时表进行筛选
*!* 避免直接筛选物理表
EndWith
EndProc
```
## 事件处理
### 自定义事件处理
```foxpro
*** <summary>
*** 自定义 GridFilter 类
*** </summary>
Define Class CustomGridFilter As gridfilter
*** <summary>
*** 筛选前验证
*** </summary>
*** <returns>Logical</returns>
Procedure FilterRecordBefore
*!* 添加自定义业务逻辑验证
If This.CustomValidation() = .F.
Messagebox([数据验证失败,无法执行筛选], 16, [提示])
Return .F.
EndIf
Return .T.
EndProc
*** <summary>
*** 筛选后处理
*** </summary>
Procedure FilterRecordAfter
*!* 筛选后更新界面状态
Local lnFilteredCount
m.lnFilteredCount = Reccount(This.Grid.RecordSource)
This.UpdateStatusBar(m.lnFilteredCount)
EndProc
*** <summary>
*** 自定义验证逻辑
*** </summary>
*** <returns>Logical</returns>
Hidden Procedure CustomValidation() As Boolean
*!* 实现具体验证逻辑
Return .T.
EndProc
*** <summary>
*** 更新状态栏
*** </summary>
Hidden Procedure UpdateStatusBar(tnCount As Integer)
Local lcForm
m.lcForm = This.Grid.Parent.Name
m.lcForm.LblStatus.Caption = [筛选记录数:] + Transform(m.tnCount)
EndProc
EndDefine
```
## 最佳实践
### 1. 错误处理
```foxpro
*** <summary>
*** 安全的 GridFilter 使用模式
*** </summary>
Procedure SafeUsage
Private All Like l*
Local loGridFilter As gridfilter
Local llSuccess
m.llSuccess = .F.
Try
m.loGridFilter = CreateObject([gridfilter])
*!* 验证 Grid 对象
If Vartype(ThisForm.GrdData) # [O] Or ThisForm.GrdData.BaseClass # [Grid]
Throw [无效的 Grid 对象]
EndIf
m.loGridFilter.Grid = ThisForm.GrdData
m.loGridFilter.Enabled = .T.
m.llSuccess = .T.
Catch To loException
Messagebox([初始化失败:] + loException.Message, 16, [错误])
Finally
If Not m.llSuccess And Vartype(m.loGridFilter) = [O]
m.loGridFilter = .Null.
EndIf
EndTry
EndProc
```
### 2. 资源管理
```foxpro
*** <summary>
*** 正确的资源清理
*** </summary>
Define Class MyForm As Form
oGridFilter = .Null.
*** <summary>
*** 释放资源
*** </summary>
Procedure Destroy
*!* 先清除筛选条件
If Vartype(This.oGridFilter) = [O]
This.oGridFilter.ClearFilter()
This.oGridFilter = .Null.
EndIf
DODEFAULT()
EndProc
*** <summary>
*** 表单卸载时清理
*** </summary>
Procedure Unload
This.Destroy()
EndProc
EndDefine
```
## 常见问题解答
### Q1: 为什么筛选按钮不显示?
**A:** 可能的原因:
1. Grid 对象的 RecordSource 未设置或无效
2. 列的数据类型不支持筛选(通用型、备注型等)
3. GridFilter.Enabled 属性为 .F.
4. 列不在可见区域
### Q2: 如何禁用排序功能?
**A:** 设置 EnabledSort 属性为 .F.:
```foxpro
loGridFilter.EnabledSort = .F.
```
### Q3: 如何处理大数据量的性能问题?
**A:** 建议措施:
1. 使用 MyFll.Fll 库提升拼音筛选性能
2. 使用临时表而非物理表进行筛选
3. 合理设置筛选表单大小
4. 避免在筛选前后执行复杂操作
### Q4: 如何自定义筛选表单样式?
**A:** 通过设置用户自定义属性:
```foxpro
loGridFilter.AddProperty([UserFilterFormHeight], 500)
loGridFilter.AddProperty([UserFilterFormWidth], 400)
```
## 技术支持
- **作者**: 宏记
- **QQ**: 121052585
- **邮箱**: 121052585@QQ.COM
- **微信**: 13922252432
- **版本**: V1.6
- **更新日期**: 2022-01-10
## 注意事项
1. **数据安全**: 本类库只能应用于可读写的临时表,请勿用于有业务功能的物理表中
2. **性能考虑**: 对于大数据量,建议使用 MyFll.Fll 库以获得更好的拼音筛选性能
3. **资源管理**: 使用完毕后请及时调用 ClearFilter() 方法释放资源
4. **兼容性**: 支持 VFP 基类 Grid 和用户派生的 Grid 对象
## 版本历史
- **V1.6** (2022-01-10)
- 优化筛选性能
- 修复已知问题
- 增强稳定性
- **V1.5** (2021-12-05)
- 新增拼音简写筛选
- 添加高级筛选功能
- 改进用户界面
---
**免责声明**: 本类库仅供学习和参考使用,作者不对使用本类库造成的任何直接或间接损失承担责任。