首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >VFP AI 插件之宏记 GridFilter 类库帮助文档

VFP AI 插件之宏记 GridFilter 类库帮助文档

作者头像
firstxinjie
发布2025-11-13 17:22:42
发布2025-11-13 17:22:42
1030
举报
文章被收录于专栏:X#(XSharp)X#(XSharp)

声明:本文档由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)

- 新增拼音简写筛选

- 添加高级筛选功能

- 改进用户界面

---

**免责声明**: 本类库仅供学习和参考使用,作者不对使用本类库造成的任何直接或间接损失承担责任。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-10-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 xinjie的VFP 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档