使用 Corel 查询语言 (CQL) 在 CorelDRAW 和 Corel DESIGNER 文档中搜索对象
介绍
在为 CorelDRAW
和 Corel DESIGNER
编写宏时,搜索具有特定属性的对象是一项常见任务。通常,如果您需要搜索特定大小或填充的对象,您需要遍历页面上的所有形状,检查每个形状的属性并确定它是否符合条件。
例如,删除所有没有填充和轮廓的对象的宏可能如下所示:
Sub DeleteInvisible()
Dim s As Shape
Dim sr As New ShapeRange
For Each s In ActivePage.Shapes.FindShapes()
If s.Outline.Type = cdrNoOutline And s.Fill.Type = cdrNoFill Then
sr.Add s
End If
Next s
sr.Delete
End Sub
对于更复杂的条件,需要进行更多检查。请注意,需要对我们在页面上找到的每个形状进行这些检查。
您还可以在 Shapes.FindShapes
方法中使用一个特殊的查询表达式 ,该表达式允许您过滤该方法返回的形状。提供的表达式使用 CQL
来指定形状必须满足的条件集才能包含在搜索结果中。因此,要使用这种新方法完成删除没有填充和轮廓的对象的相同任务,我们可以像这样重写上面的宏:
Sub DeleteInvisible()
Dim sr As ShapeRange
Set sr = ActivePage.Shapes.FindShapes(Query:="@outline.type = 'none' and @fill.type = 'none'")
sr.Delete
End Sub
可在 FindShapes
的 Query
参数中使用的条件 可能比这复杂得多。例如,以下宏选择在其填充或轮廓的任何位置具有红色的所有对象:
Sub SelectShapesWithRedColor()
ActivePage.Shapes.FindShapes(Query:="@colors.find('red')").CreateSelection
End Sub
CQL 数据类型
CQL 是一种面向对象的查询语言。这意味着它所操作的所有数据都是某种类型的对象,并且这些对象具有可以调用以访问这些对象的属性的某些方法。有许多代表数字、字符串等的预定义数据对象,以及专门用于 CQL 所用的特定任务的自定义对象。由于 CQL 不仅可以用于查找文档中的形状,还可以用于其他方面(例如,它可以用于查找具有某些属性(如字体、大小和颜色)的文本字符)。
CQL
常用的内置数据对象有以下几种。这些对象存在于 CQL 的任何实现中:
- null:表示对象不存在的属性的空对象。
- bool:布尔值( true或 false)。
- int :一个整数值(介于 -2147483648 ... 2147483647 之间)。
- double:浮点值(大约在 10 -308 ... 10 308之间
- string : Unicode 文本字符串。
- unit :计量单位。目前可以使用线性测量单位,例如英寸 (in)、毫米 (mm) 和其他一些单位。
- com: COM 对象的包装器。这允许为形状、填充、轮廓、颜色等对象调用 VBA 对象模型方法。CorelDRAW 和 Corel DESIGNER 对象的 CQL 实现不具有通过对象模型可用的所有属性,因此该对象可以是用于调用对象模型以获取有关对象的附加信息。
- array :数组 任何 CQL 类型的对象列表。
- custrom :自定义由 CQL 的特定实现提供的任何其他对象类型。用于在文档中查找形状的 CQL 专门提供自定义对象,例如 形状、填充、 轮廓和 颜色。
CQL语法
计算每个 CQL 表达式以生成单个值(对象)。在文档中查找形状时,会针对文档中的每个形状评估查询表达式,并将结果值转换为布尔值(真或假)以确定给定形状是否符合条件。如果结果为“真”,则将该形状添加到找到的形状列表中,否则将被忽略。
但是,一般来说,CQL 表达式可以计算为任何对象类型,例如整数、字符串、对象数组等。以下是有效 CQL 表达式的几个示例:
1 + 2
2 * (2.3 + 1.2)
'Hello' + 'world'
CorelDRAW 和 Corel DESIGNER 的 VBA 对象模型有一些辅助方法,可让您评估 CQL 表达式和解决查询问题。 Application.Evaluate
就是其中之一;它计算 CQL 表达式并返回计算结果。
Sub TestEvaluate()
MsgBox Evaluate("2*(2.3+1.2)")
End Sub
上面的宏只会显示一个包含“7”的消息框,这是算术表达式的结果。此方法可用于快速检查 CQL 表达式的有效性或确认结果值。
表达式中的每个操作数都是一个对象,即使是 1 或“Hello”等常量也是如此。对于常量,数据类型是自动确定的。每个对象都可以有自己的一组方法和属性。要调用对象的方法,使用以下语法:
对象.方法(参数)
不需要任何参数的方法可以在不使用括号的情况下调用。以下两个表达式均有效:
'world'.length()
'world'.length
以上两个表达式的计算结果均为数值 5,即字符串“world”的长度。