1
前言
2
首先,在我进入实质性主题并解释如何建立类之前,我希望保证你知道“对象”。虽然你可以在程序中使用对象而不用知道其正确的规则,但我并不建议如此!对于对象的初学者,接下来的部分将让你了解其概念及内容。已经了解面向对象编程(OOP)的读者可以跳过这章节。
3
导论
4
“对象是什么?”——对象通常代表某种实体,主要是一个变量和函数的集合。
5
“实体是什么?”——字面上说,实体是一个“事物”,我的意思是一个概念或者任何一个物体。例如,一辆汽车是一个实体,因为它是一个物体。你公司销售部门销售产品也是一个实体,当然,你也可以将其拆开来看,销售人员、客户、产品等都是实体。
6
让我们更深入的来看“销售”这个实体(对象)。为了使你更准确地有一个销售的“映像”,你需要知道客户买了什么,是哪个客户,谁是销售人员等等……这看来是一个简单的事件,但假设所有信息是存储在单独的数据库表中的,那么当你需要获得某个销售过程所有相关信息时,你必须在你的数据库中做多次独立查询,再将所有的数据集拢。有没有更简便的办法而一次获得销售的所有信息呢?“对象”。
7
在对象中,你可以植入代码以从其他表中获得数据,你也可以保存对象属性的所有信息,这样,你可以轻松地使用代码管理你的销售数据。例如:
8![](/Images/OutliningIndicators/None.gif)
9
'Open the database connection
10
Set objConn = Server.CreateObject("ADODB.Connection")
11
objConn.Open "MyDSN"
12![](/Images/OutliningIndicators/None.gif)
13
'Create the recordset object
14
Set objRS = Server.CreateObject("ADODB.Recordset")
15![](/Images/OutliningIndicators/None.gif)
16
'Define the SQL query
17
strComplexSQLQuery = "SELECT C.Name, S.Name FROM Customers C, " & _
18
"Salespeople S, Sales Sl WHERE Sl.CustomerID=C.ID AND " & _
19
"Sl.SalespersonID=S.ID AND Sl.ID=" & strIDOfThisSale & ";"
20![](/Images/OutliningIndicators/None.gif)
21
'Open the recordset
22
objRS.Open strComplexSQLQuery, objConn, adOpenForwardOnly, _
23
adLockReadOnly, adCmdText
24![](/Images/OutliningIndicators/None.gif)
25
'Take the customer and sales person names from the recordset
26
strCustomerName = objRS(0)
27
strSalesPersonName = objRS(1)
28![](/Images/OutliningIndicators/None.gif)
29
'Tidy up the objects
30
objRS.Close
31
objConn.Close
32
Set objRS = Nothing
33
Set objConn = Nothing
34![](/Images/OutliningIndicators/None.gif)
35
'Output the data
36
Response.Write "This sale was made by " & strSalesPersonName & _
37
" to " & strCustomerName
38![](/Images/OutliningIndicators/None.gif)
39![](/Images/OutliningIndicators/None.gif)
40
可以使用“对象”来替代:
41![](/Images/OutliningIndicators/None.gif)
42
'Create the "Sale" object
43
Set objSale = New Sale
44![](/Images/OutliningIndicators/None.gif)
45
'Lookup the correct sale
46
objSale.ID = strIDOfThisSale
47![](/Images/OutliningIndicators/None.gif)
48
'Output the data
49
Response.Write "This sale was made by " & objSale.SalesPersonName & _
50
" to " & objSale.CustomerName
51![](/Images/OutliningIndicators/None.gif)
52
'Tidy up the objects
53
objSale.Close
54
Set objSale = Nothing
55
如果你使用“Sale”对象做比打印更多的事,可以让你省去很多的打字时间。
56![](/Images/OutliningIndicators/None.gif)
57
计算中,对象包括“属性”和“方法”。属性主要是储存在对象中的一个变量,其用法与变量相同。唯一的区别在于参数赋值为:strMyVar = "This is a string variant", 而对象属性为 objObject.Property="This is a string variant"。这点非常简单而有用处。方法可以理解为植入对象中的函数与过程,可以使用strMyVar = objObject.MethodName(strMyVar)来代替strMyVar =FunctionName(strMyVar)。写法不同,但功能相同。属性的一个例子是对象Response中的ExpireAbsolute,Response.ExpiresAbsolute = CDate("1 September 1999")。方法的一个例子是对象Response中的Write方法,Response.Write "Hello world!"。
58
VBScript的一个新特性就是其可以创建新的对象而不需要求诸于花销时间都极大的编译器。我将向读者展示如何创建对象的类,并希望提供一个良好的开端。
59![](/Images/OutliningIndicators/None.gif)
60
在VBScript中使用类(二)
61
创建对象
62
在VBScript中创建对象类型(类)时,你首先要知道,这真的很容易!我在一个下午自学,只是阅读了Microsof VB Script 的参考书,但必须承认,这书不是最容易阅读的文档。
63
初学者需要安装VBScript 5.0引擎,可以在Microsoft's Scripting Site下载。
64
我们来看代码。类的定义与函数和子过程非常类似。起始行为Class <MyClassName>,结尾是End Class,所有的对象定义写在中间部门。现在我们可以用所学的来建立第一个类,不实现任何功能的类。
65
Class 4GuysTestObject
66
'你的ASP代码
67
End Class
68
这看上去不是那么回事,但当你写入下面的代码后,你将创建一个对象的实例:
69
Dim objTestObject
70
Set objTestObject = New 4GuysTestObject
71
Set objTestObject = Nothing
72
显然,我们现在还不能用对象做任何事,现在我将解释如何在对象中定义属性和方法。
73
使用对象可以做的最基础的,是建立一组数据。例如,假如要将时间、日期及视频程序标题建立在一起,你可以创建一个包含属性“StartTime”, “ProgramDate”和“ProgramTitle”的对象。代码如下:
74![](/Images/OutliningIndicators/None.gif)
75
Class TVProgram
76![](/Images/OutliningIndicators/None.gif)
77
Public StartTime
78
Public ProgramDate
79
Public ProgramTitle
80![](/Images/OutliningIndicators/None.gif)
81
End Class
82![](/Images/OutliningIndicators/None.gif)
83
Dim objTVShow
84
Set objTVShow = New TVProgram
85![](/Images/OutliningIndicators/None.gif)
86
objTVShow.StartTime = CDate("17:30")
87
objTVShow.ProgramDate = DateSerial(1999,9,17)
88
objTVShow.ProgramTitle = "The Jerry Springer Show"
89![](/Images/OutliningIndicators/None.gif)
90
Response.Write objTVShow.ProgramTitle & " is on at " & _
91
objTVShow.StartTime & " on " & objTVShow.ProgramDate
92![](/Images/OutliningIndicators/None.gif)
93
代码工作的方式是,我们定义StartTime,ProgramDate和ProgramTitle为类TVProgram的属性。这样,这些属性就像其他变量一样来处理,没有设置值则不会执行代码。属性名字前的Public字段有其真实含义,而且非常重要。如果你不特指一个方法或属性为public或private,系统默认值为public,但最好养成定义任何值的良好书写习惯(也方便你之后自己的阅读)。
94![](/Images/OutliningIndicators/None.gif)
95
上面程序的结果大致如下(决定于你的本地服务器配置):
96![](/Images/OutliningIndicators/None.gif)
97
The Jerry Springer Show is on at 5:30pm on 17/09/99.
98![](/Images/OutliningIndicators/None.gif)
99
我在英国,所以日期现实如上。不论你跑什么工程,它的效果都不错,但只有你开始使用其他对象的功能,为你可能需要的所有信息和功能,创建一个完美的接口,以支持你所建对象包围的实体,你才会体会到对象的真正实力。
100
现在,如果你不喜欢上面例子显示日期的方法,而希望以同一种格式现实日期,也没有不要在引用每个ProgramDate属性时加FormatDateTime(),你只需要将此类代码植入属性本身。
101![](/Images/OutliningIndicators/None.gif)
102
这样需要用另一种方法定义属性。同样,我们将使用ProgramDate为外部可见属性,但因为ProgramDate属性将成为一个函数而不是静态值,我们将实际日期保存在另一个属性中internal_ProgramDate。
103![](/Images/OutliningIndicators/None.gif)
104
Class TVProgram
105![](/Images/OutliningIndicators/None.gif)
106
Public StartTime
107
Public internal_ProgramDate
108![](/Images/OutliningIndicators/None.gif)
109
Public Property Get ProgramDate
110
ProgramDate = Day(internal_ProgramDate) & _
111
" " & MonthName(Month(internal_ProgramDate)) & _
112
" " & Year(internal_ProgramDate)
113
End Property
114![](/Images/OutliningIndicators/None.gif)
115
Public ProgramTitle
116
End Class
117![](/Images/OutliningIndicators/None.gif)
118
Dim objTVShow
119
Set objTVShow = New TVProgram
120![](/Images/OutliningIndicators/None.gif)
121
objTVShow.StartTime = CDate("17:30")
122
objTVShow.internal_ProgramDate = DateSerial(1999,9,17)
123
objTVShow.ProgramTitle = "The Jerry Springer Show"
124![](/Images/OutliningIndicators/None.gif)
125
Response.Write objTVShow.ProgramTitle & " is on at " & _
126
objTVShow.StartTime & " on " & objTVShow.ProgramDate & "."
127![](/Images/OutliningIndicators/None.gif)
128![](/Images/OutliningIndicators/None.gif)
129
程序的结果如下:
130![](/Images/OutliningIndicators/None.gif)
131
The Jerry Springer Show is on at 5:30pm on 17 September 1999.
132![](/Images/OutliningIndicators/None.gif)
133
在VBScript中使用类(三)
134![](/Images/OutliningIndicators/None.gif)
135
我们来分析一下(2)中的程序:
136![](/Images/OutliningIndicators/None.gif)
137
Class TVProgram
138![](/Images/OutliningIndicators/None.gif)
139
Public StartTime
140![](/Images/OutliningIndicators/None.gif)
141
Public internal_ProgramDate
142![](/Images/OutliningIndicators/None.gif)
143
Public Property Get ProgramDate
144![](/Images/OutliningIndicators/None.gif)
145
ProgramDate = Day(internal_ProgramDate) & _
146![](/Images/OutliningIndicators/None.gif)
147
" " & MonthName(Month(internal_ProgramDate)) & _
148![](/Images/OutliningIndicators/None.gif)
149
" " & Year(internal_ProgramDate)
150![](/Images/OutliningIndicators/None.gif)
151
End Property
152![](/Images/OutliningIndicators/None.gif)
153
Public ProgramTitle
154![](/Images/OutliningIndicators/None.gif)
155
End Class
156![](/Images/OutliningIndicators/None.gif)
157
Dim objTVShow
158![](/Images/OutliningIndicators/None.gif)
159
Set objTVShow = New TVProgram
160![](/Images/OutliningIndicators/None.gif)
161
objTVShow.StartTime = CDate("17:30")
162![](/Images/OutliningIndicators/None.gif)
163
objTVShow.internal_ProgramDate = DateSerial(1999,9,17)
164![](/Images/OutliningIndicators/None.gif)
165
objTVShow.ProgramTitle = "The Jerry Springer Show"
166![](/Images/OutliningIndicators/None.gif)
167
Response.Write objTVShow.ProgramTitle & " is on at " & _
168![](/Images/OutliningIndicators/None.gif)
169
objTVShow.StartTime & " on " & objTVShow.ProgramDate & "."
170![](/Images/OutliningIndicators/None.gif)
171
当调用对象的属性ProgramDate时,实际上执行了函数ProgramDate,即如上定义的函数,而很快你也将习惯这种在声明部分使用Public或Private关键字的方式。关键字“Property”,告知了编译器如同调用属性一样在外部调用函数。接着的“Get”,表明该函数是输出还是获得一个值。
172![](/Images/OutliningIndicators/None.gif)
173
Get的意思是“允许外部代码去‘获取’一个值”,与其类似的关键字还有“Let”和“Set”,但这两个比较复杂,因而我们以后再讨论。
174![](/Images/OutliningIndicators/None.gif)
175
接下去的代码看来有点难度的,给objectname.internal_ProgramDate赋值并通过objectname.ProgramDate来调用它。如果可以使用相同关键字同时为其赋值并获得它的值不是更好吗?当然,那也可以。
176![](/Images/OutliningIndicators/None.gif)
177
如果定义Get和Let属性的名称相同,可以将它们当作对象相同的属性,但这只限于它们定义了相同数量的成员。(以下代码看来不太相同,仅作为实例参考)
178![](/Images/OutliningIndicators/None.gif)
179
Class TVProgram
180![](/Images/OutliningIndicators/None.gif)
181
Public StartTime
182![](/Images/OutliningIndicators/None.gif)
183
Public internal_ProgramDate
184![](/Images/OutliningIndicators/None.gif)
185
Public Property Get ProgramDate
186![](/Images/OutliningIndicators/None.gif)
187
ProgramDate = Day(internal_ProgramDate) & " " _
188![](/Images/OutliningIndicators/None.gif)
189
& MonthName(Month(internal_ProgramDate)) & _
190![](/Images/OutliningIndicators/None.gif)
191
" " & Year(internal_ProgramDate)
192![](/Images/OutliningIndicators/None.gif)
193
End Property
194![](/Images/OutliningIndicators/None.gif)
195
Public Property Let ProgramDate(ByVal varDateIn)
196![](/Images/OutliningIndicators/None.gif)
197
internal_ProgramDate = CDate(varDateIn)
198![](/Images/OutliningIndicators/None.gif)
199
End Property
200![](/Images/OutliningIndicators/None.gif)
201
Public ProgramTitle
202![](/Images/OutliningIndicators/None.gif)
203
End Class
204![](/Images/OutliningIndicators/None.gif)
205
Dim objTVShow
206![](/Images/OutliningIndicators/None.gif)
207
Set objTVShow = New TVProgram
208![](/Images/OutliningIndicators/None.gif)
209
objTVShow.StartTime = CDate("17:30")
210![](/Images/OutliningIndicators/None.gif)
211
objTVShow.ProgramDate = "17 Sept 99"
212![](/Images/OutliningIndicators/None.gif)
213
objTVShow.ProgramTitle = "The Jerry Springer Show"
214![](/Images/OutliningIndicators/None.gif)
215
Response.Write objTVShow.ProgramTitle & " is on at " & _
216![](/Images/OutliningIndicators/None.gif)
217
objTVShow.StartTime & " on " & objTVShow.ProgramDate & "."
218![](/Images/OutliningIndicators/None.gif)
219
以上代码中Let的声明部分看来似乎是一个多余的元素,当我第一次看到时研究了很长时间。每次我使用“0”作为变量用在每个属性上,我总是得到这个错误信息,“元素数量必须相等”。“它们确实相等!”抓狂之后,我回过头去看程序才觉得自己的愚蠢!:)
220![](/Images/OutliningIndicators/None.gif)
221
原因是,当你试图为ProgramDate赋值时,你会使用这样一行程序:
222![](/Images/OutliningIndicators/None.gif)
223
objTVShow.ProgramDate = dtmMyDate
224![](/Images/OutliningIndicators/None.gif)
225
为了方便,等号右边的值(这里指dtmMyDate)作为了一个程元赋给了函数。因此编译器可能会认为在Get ProgramDate行有0程元,而Let ProgramDate却多一个!分配的值总是被略过而作为属性的最后一个程元,所以即使你使用其他程元,所赋的值总是作为最后一个程元。
226![](/Images/OutliningIndicators/None.gif)
227
现在看程序。无论通过ProgramDate设置日期为文本形式,还是用internal_ProgramDate译成日期变量,程序都没有问题。但能不能只使用一个入口呢?
228![](/Images/OutliningIndicators/None.gif)
229
如果internal_ProgramDate只能在内部有效,而使用Let ProgramDate检查传输的数据类型,我们就可以作出选择。例如:
230![](/Images/OutliningIndicators/None.gif)
231
Class TVProgram
232![](/Images/OutliningIndicators/None.gif)
233
Public StartTime
234![](/Images/OutliningIndicators/None.gif)
235
Private internal_ProgramDate
236![](/Images/OutliningIndicators/None.gif)
237
Public Property Get ProgramDate
238![](/Images/OutliningIndicators/None.gif)
239
ProgramDate = Day(internal_ProgramDate) & " " & _
240![](/Images/OutliningIndicators/None.gif)
241
MonthName(Month(internal_ProgramDate)) & _
242![](/Images/OutliningIndicators/None.gif)
243
" " & Year(internal_ProgramDate)
244![](/Images/OutliningIndicators/None.gif)
245
End Property
246![](/Images/OutliningIndicators/None.gif)
247
Public Property Let ProgramDate(ByVal varDateIn)
248![](/Images/OutliningIndicators/None.gif)
249
If IsDate(varDateIn) Then
250![](/Images/OutliningIndicators/None.gif)
251
internal_ProgramDate = varDateIn
252![](/Images/OutliningIndicators/None.gif)
253
Else
254![](/Images/OutliningIndicators/None.gif)
255
'Place some error handling code in here.
256![](/Images/OutliningIndicators/None.gif)
257
End If
258![](/Images/OutliningIndicators/None.gif)
259
End Property
260![](/Images/OutliningIndicators/None.gif)
261
Public ProgramTitle
262![](/Images/OutliningIndicators/None.gif)
263
End Class
264![](/Images/OutliningIndicators/None.gif)
265
并同样声明StartTime属性:
266![](/Images/OutliningIndicators/None.gif)
267
Class TVProgram
268![](/Images/OutliningIndicators/None.gif)
269
Private internal_StartTime
270![](/Images/OutliningIndicators/None.gif)
271
Public Property Get StartTime
272![](/Images/OutliningIndicators/None.gif)
273
StartTime = Hour(internal_StartTime) & ":" _
274![](/Images/OutliningIndicators/None.gif)
275
& Minute(internal_StartTime)
276![](/Images/OutliningIndicators/None.gif)
277
End Property
278![](/Images/OutliningIndicators/None.gif)
279
Public Property Let StartTime(ByVal varTimeIn)
280![](/Images/OutliningIndicators/None.gif)
281
If IsDate(varTimeIn) Then
282![](/Images/OutliningIndicators/None.gif)
283
internal_StartTime = varTimeIn
284![](/Images/OutliningIndicators/None.gif)
285
End If
286![](/Images/OutliningIndicators/None.gif)
287
End Property
288![](/Images/OutliningIndicators/None.gif)
289
Private internal_ProgramDate
290![](/Images/OutliningIndicators/None.gif)
291
Public Property Get ProgramDate
292![](/Images/OutliningIndicators/None.gif)
293
ProgramDate = Day(internal_ProgramDate) & " " _
294![](/Images/OutliningIndicators/None.gif)
295
& MonthName(Month(internal_ProgramDate)) & _
296![](/Images/OutliningIndicators/None.gif)
297
" " & Year(internal_ProgramDate)
298![](/Images/OutliningIndicators/None.gif)
299
End Property
300![](/Images/OutliningIndicators/None.gif)
301
Public Property Let ProgramDate(ByVal varDateIn)
302![](/Images/OutliningIndicators/None.gif)
303
If IsDate(varDateIn) Then
304![](/Images/OutliningIndicators/None.gif)
305
internal_ProgramDate = varDateIn
306![](/Images/OutliningIndicators/None.gif)
307
End If
308![](/Images/OutliningIndicators/None.gif)
309
End Property
310![](/Images/OutliningIndicators/None.gif)
311
Public ProgramTitle
312![](/Images/OutliningIndicators/None.gif)
313
End Class
314
![](/Images/dot.gif)
315
现在的代码离我们想要的还是有些不太实用,我们将在其他页使用类TVProgram,因此最好将其独立定义,以便所有也面都可以调用。我们将在第四部分讨论这点。
316
在VBScript中使用类(四)
317![](/Images/OutliningIndicators/None.gif)
318
现在的代码离我们想要的还是有些不太实用,我们将在其他页使用类TVProgram,因此最好将其独立定义,以便所有也面都可以调用。创建一个ASP页面,并命名为TVProgramClass.asp,我们在其中定义类TVProgram。
319
--TVProgramClass.asp--
320
<%
321
Class TVProgram
322
Private internal_StartTime
323
Public Property Get StartTime
324![](/Images/OutliningIndicators/None.gif)
325
StartTime = Hour(internal_StartTime) & _
326![](/Images/OutliningIndicators/None.gif)
327
":" & Minute(internal_StartTime)
328![](/Images/OutliningIndicators/None.gif)
329
End Property
330
Public Property Let StartTime(ByVal varTimeIn)
331![](/Images/OutliningIndicators/None.gif)
332
If IsDate(varTimeIn) Then
333![](/Images/OutliningIndicators/None.gif)
334
internal_StartTime = varTimeIn
335![](/Images/OutliningIndicators/None.gif)
336
End If
337![](/Images/OutliningIndicators/None.gif)
338
End Property
339
Private internal_ProgramDate
340
Public Property Get ProgramDate
341
ProgramDate = Day(internal_ProgramDate) & _
342
" " & MonthName(Month(internal_ProgramDate)) & _
343![](/Images/OutliningIndicators/None.gif)
344
" " & Year(internal_ProgramDate)
345![](/Images/OutliningIndicators/None.gif)
346
End Property
347![](/Images/OutliningIndicators/None.gif)
348
Public Property Let ProgramDate(ByVal varDateIn)
349
If IsDate(varDateIn) Then
350
internal_ProgramDate = varDateIn
351
End If
352
End Property
353![](/Images/OutliningIndicators/None.gif)
354
Public ProgramTitle
355![](/Images/OutliningIndicators/None.gif)
356
End Class
357
%>
358
这样就可以在任何ASP中调用我们定义的类了,语法如下:
359
<!-- #include virtual="TVProgramClass.asp" -->
360
<%
361
Dim objTVShow
362
Set objTVShow = New TVProgram
363![](/Images/OutliningIndicators/None.gif)
364
objTVShow.StartTime = CDate("17:30")
365
objTVShow.ProgramDate = DateSerial(1999,9,17)
366
objTVShow.ProgramTitle = "The Jerry Springer Show"
367![](/Images/OutliningIndicators/None.gif)
368
%>
369
<%= objTVShow.ProgramTitle %> is on at <%= objTVShow.StartTime %> on <%= objTVShow.ProgramDate %>.
370
这里有一个建议。如果你重命名你的包含文件.asp,并保证所有重要代码都在<CODE><%
%>< CODE>中,那么就算有人猜到了你包含文件的文件名,也没办法看见里面的内容!
371![](/Images/OutliningIndicators/None.gif)
372
评论:
373
VBScript类在封装的层面上,还是有不少好处的,增加了代码的可读性与可维护性以及清晰度,但是,没有继承和重载等特性,并不是真正意义上的OOP。没有集合,但是据说可以用Scripting.Dictionary,据说更好用、更快。不过,感觉总是鸡类(肋)。
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/None.gif)
7
![](/Images/OutliningIndicators/None.gif)
8
![](/Images/OutliningIndicators/None.gif)
9
![](/Images/OutliningIndicators/None.gif)
10
![](/Images/OutliningIndicators/None.gif)
11
![](/Images/OutliningIndicators/None.gif)
12
![](/Images/OutliningIndicators/None.gif)
13
![](/Images/OutliningIndicators/None.gif)
14
![](/Images/OutliningIndicators/None.gif)
15
![](/Images/OutliningIndicators/None.gif)
16
![](/Images/OutliningIndicators/None.gif)
17
![](/Images/OutliningIndicators/None.gif)
18
![](/Images/OutliningIndicators/None.gif)
19
![](/Images/OutliningIndicators/None.gif)
20
![](/Images/OutliningIndicators/None.gif)
21
![](/Images/OutliningIndicators/None.gif)
22
![](/Images/OutliningIndicators/None.gif)
23
![](/Images/OutliningIndicators/None.gif)
24
![](/Images/OutliningIndicators/None.gif)
25
![](/Images/OutliningIndicators/None.gif)
26
![](/Images/OutliningIndicators/None.gif)
27
![](/Images/OutliningIndicators/None.gif)
28
![](/Images/OutliningIndicators/None.gif)
29
![](/Images/OutliningIndicators/None.gif)
30
![](/Images/OutliningIndicators/None.gif)
31
![](/Images/OutliningIndicators/None.gif)
32
![](/Images/OutliningIndicators/None.gif)
33
![](/Images/OutliningIndicators/None.gif)
34
![](/Images/OutliningIndicators/None.gif)
35
![](/Images/OutliningIndicators/None.gif)
36
![](/Images/OutliningIndicators/None.gif)
37
![](/Images/OutliningIndicators/None.gif)
38
![](/Images/OutliningIndicators/None.gif)
39
![](/Images/OutliningIndicators/None.gif)
40
![](/Images/OutliningIndicators/None.gif)
41
![](/Images/OutliningIndicators/None.gif)
42
![](/Images/OutliningIndicators/None.gif)
43
![](/Images/OutliningIndicators/None.gif)
44
![](/Images/OutliningIndicators/None.gif)
45
![](/Images/OutliningIndicators/None.gif)
46
![](/Images/OutliningIndicators/None.gif)
47
![](/Images/OutliningIndicators/None.gif)
48
![](/Images/OutliningIndicators/None.gif)
49
![](/Images/OutliningIndicators/None.gif)
50
![](/Images/OutliningIndicators/None.gif)
51
![](/Images/OutliningIndicators/None.gif)
52
![](/Images/OutliningIndicators/None.gif)
53
![](/Images/OutliningIndicators/None.gif)
54
![](/Images/OutliningIndicators/None.gif)
55
![](/Images/OutliningIndicators/None.gif)
56
![](/Images/OutliningIndicators/None.gif)
57
![](/Images/OutliningIndicators/None.gif)
58
![](/Images/OutliningIndicators/None.gif)
59
![](/Images/OutliningIndicators/None.gif)
60
![](/Images/OutliningIndicators/None.gif)
61
![](/Images/OutliningIndicators/None.gif)
62
![](/Images/OutliningIndicators/None.gif)
63
![](/Images/OutliningIndicators/None.gif)
64
![](/Images/OutliningIndicators/None.gif)
65
![](/Images/OutliningIndicators/None.gif)
66
![](/Images/OutliningIndicators/None.gif)
67
![](/Images/OutliningIndicators/None.gif)
68
![](/Images/OutliningIndicators/None.gif)
69
![](/Images/OutliningIndicators/None.gif)
70
![](/Images/OutliningIndicators/None.gif)
71
![](/Images/OutliningIndicators/None.gif)
72
![](/Images/OutliningIndicators/None.gif)
73
![](/Images/OutliningIndicators/None.gif)
74
![](/Images/OutliningIndicators/None.gif)
75
![](/Images/OutliningIndicators/None.gif)
76
![](/Images/OutliningIndicators/None.gif)
77
![](/Images/OutliningIndicators/None.gif)
78
![](/Images/OutliningIndicators/None.gif)
79
![](/Images/OutliningIndicators/None.gif)
80
![](/Images/OutliningIndicators/None.gif)
81
![](/Images/OutliningIndicators/None.gif)
82
![](/Images/OutliningIndicators/None.gif)
83
![](/Images/OutliningIndicators/None.gif)
84
![](/Images/OutliningIndicators/None.gif)
85
![](/Images/OutliningIndicators/None.gif)
86
![](/Images/OutliningIndicators/None.gif)
87
![](/Images/OutliningIndicators/None.gif)
88
![](/Images/OutliningIndicators/None.gif)
89
![](/Images/OutliningIndicators/None.gif)
90
![](/Images/OutliningIndicators/None.gif)
91
![](/Images/OutliningIndicators/None.gif)
92
![](/Images/OutliningIndicators/None.gif)
93
![](/Images/OutliningIndicators/None.gif)
94
![](/Images/OutliningIndicators/None.gif)
95
![](/Images/OutliningIndicators/None.gif)
96
![](/Images/OutliningIndicators/None.gif)
97
![](/Images/OutliningIndicators/None.gif)
98
![](/Images/OutliningIndicators/None.gif)
99
![](/Images/OutliningIndicators/None.gif)
100
![](/Images/OutliningIndicators/None.gif)
101
![](/Images/OutliningIndicators/None.gif)
102
![](/Images/OutliningIndicators/None.gif)
103
![](/Images/OutliningIndicators/None.gif)
104
![](/Images/OutliningIndicators/None.gif)
105
![](/Images/OutliningIndicators/None.gif)
106
![](/Images/OutliningIndicators/None.gif)
107
![](/Images/OutliningIndicators/None.gif)
108
![](/Images/OutliningIndicators/None.gif)
109
![](/Images/OutliningIndicators/None.gif)
110
![](/Images/OutliningIndicators/None.gif)
111
![](/Images/OutliningIndicators/None.gif)
112
![](/Images/OutliningIndicators/None.gif)
113
![](/Images/OutliningIndicators/None.gif)
114
![](/Images/OutliningIndicators/None.gif)
115
![](/Images/OutliningIndicators/None.gif)
116
![](/Images/OutliningIndicators/None.gif)
117
![](/Images/OutliningIndicators/None.gif)
118
![](/Images/OutliningIndicators/None.gif)
119
![](/Images/OutliningIndicators/None.gif)
120
![](/Images/OutliningIndicators/None.gif)
121
![](/Images/OutliningIndicators/None.gif)
122
![](/Images/OutliningIndicators/None.gif)
123
![](/Images/OutliningIndicators/None.gif)
124
![](/Images/OutliningIndicators/None.gif)
125
![](/Images/OutliningIndicators/None.gif)
126
![](/Images/OutliningIndicators/None.gif)
127
![](/Images/OutliningIndicators/None.gif)
128
![](/Images/OutliningIndicators/None.gif)
129
![](/Images/OutliningIndicators/None.gif)
130
![](/Images/OutliningIndicators/None.gif)
131
![](/Images/OutliningIndicators/None.gif)
132
![](/Images/OutliningIndicators/None.gif)
133
![](/Images/OutliningIndicators/None.gif)
134
![](/Images/OutliningIndicators/None.gif)
135
![](/Images/OutliningIndicators/None.gif)
136
![](/Images/OutliningIndicators/None.gif)
137
![](/Images/OutliningIndicators/None.gif)
138
![](/Images/OutliningIndicators/None.gif)
139
![](/Images/OutliningIndicators/None.gif)
140
![](/Images/OutliningIndicators/None.gif)
141
![](/Images/OutliningIndicators/None.gif)
142
![](/Images/OutliningIndicators/None.gif)
143
![](/Images/OutliningIndicators/None.gif)
144
![](/Images/OutliningIndicators/None.gif)
145
![](/Images/OutliningIndicators/None.gif)
146
![](/Images/OutliningIndicators/None.gif)
147
![](/Images/OutliningIndicators/None.gif)
148
![](/Images/OutliningIndicators/None.gif)
149
![](/Images/OutliningIndicators/None.gif)
150
![](/Images/OutliningIndicators/None.gif)
151
![](/Images/OutliningIndicators/None.gif)
152
![](/Images/OutliningIndicators/None.gif)
153
![](/Images/OutliningIndicators/None.gif)
154
![](/Images/OutliningIndicators/None.gif)
155
![](/Images/OutliningIndicators/None.gif)
156
![](/Images/OutliningIndicators/None.gif)
157
![](/Images/OutliningIndicators/None.gif)
158
![](/Images/OutliningIndicators/None.gif)
159
![](/Images/OutliningIndicators/None.gif)
160
![](/Images/OutliningIndicators/None.gif)
161
![](/Images/OutliningIndicators/None.gif)
162
![](/Images/OutliningIndicators/None.gif)
163
![](/Images/OutliningIndicators/None.gif)
164
![](/Images/OutliningIndicators/None.gif)
165
![](/Images/OutliningIndicators/None.gif)
166
![](/Images/OutliningIndicators/None.gif)
167
![](/Images/OutliningIndicators/None.gif)
168
![](/Images/OutliningIndicators/None.gif)
169
![](/Images/OutliningIndicators/None.gif)
170
![](/Images/OutliningIndicators/None.gif)
171
![](/Images/OutliningIndicators/None.gif)
172
![](/Images/OutliningIndicators/None.gif)
173
![](/Images/OutliningIndicators/None.gif)
174
![](/Images/OutliningIndicators/None.gif)
175
![](/Images/OutliningIndicators/None.gif)
176
![](/Images/OutliningIndicators/None.gif)
177
![](/Images/OutliningIndicators/None.gif)
178
![](/Images/OutliningIndicators/None.gif)
179
![](/Images/OutliningIndicators/None.gif)
180
![](/Images/OutliningIndicators/None.gif)
181
![](/Images/OutliningIndicators/None.gif)
182
![](/Images/OutliningIndicators/None.gif)
183
![](/Images/OutliningIndicators/None.gif)
184
![](/Images/OutliningIndicators/None.gif)
185
![](/Images/OutliningIndicators/None.gif)
186
![](/Images/OutliningIndicators/None.gif)
187
![](/Images/OutliningIndicators/None.gif)
188
![](/Images/OutliningIndicators/None.gif)
189
![](/Images/OutliningIndicators/None.gif)
190
![](/Images/OutliningIndicators/None.gif)
191
![](/Images/OutliningIndicators/None.gif)
192
![](/Images/OutliningIndicators/None.gif)
193
![](/Images/OutliningIndicators/None.gif)
194
![](/Images/OutliningIndicators/None.gif)
195
![](/Images/OutliningIndicators/None.gif)
196
![](/Images/OutliningIndicators/None.gif)
197
![](/Images/OutliningIndicators/None.gif)
198
![](/Images/OutliningIndicators/None.gif)
199
![](/Images/OutliningIndicators/None.gif)
200
![](/Images/OutliningIndicators/None.gif)
201
![](/Images/OutliningIndicators/None.gif)
202
![](/Images/OutliningIndicators/None.gif)
203
![](/Images/OutliningIndicators/None.gif)
204
![](/Images/OutliningIndicators/None.gif)
205
![](/Images/OutliningIndicators/None.gif)
206
![](/Images/OutliningIndicators/None.gif)
207
![](/Images/OutliningIndicators/None.gif)
208
![](/Images/OutliningIndicators/None.gif)
209
![](/Images/OutliningIndicators/None.gif)
210
![](/Images/OutliningIndicators/None.gif)
211
![](/Images/OutliningIndicators/None.gif)
212
![](/Images/OutliningIndicators/None.gif)
213
![](/Images/OutliningIndicators/None.gif)
214
![](/Images/OutliningIndicators/None.gif)
215
![](/Images/OutliningIndicators/None.gif)
216
![](/Images/OutliningIndicators/None.gif)
217
![](/Images/OutliningIndicators/None.gif)
218
![](/Images/OutliningIndicators/None.gif)
219
![](/Images/OutliningIndicators/None.gif)
220
![](/Images/OutliningIndicators/None.gif)
221
![](/Images/OutliningIndicators/None.gif)
222
![](/Images/OutliningIndicators/None.gif)
223
![](/Images/OutliningIndicators/None.gif)
224
![](/Images/OutliningIndicators/None.gif)
225
![](/Images/OutliningIndicators/None.gif)
226
![](/Images/OutliningIndicators/None.gif)
227
![](/Images/OutliningIndicators/None.gif)
228
![](/Images/OutliningIndicators/None.gif)
229
![](/Images/OutliningIndicators/None.gif)
230
![](/Images/OutliningIndicators/None.gif)
231
![](/Images/OutliningIndicators/None.gif)
232
![](/Images/OutliningIndicators/None.gif)
233
![](/Images/OutliningIndicators/None.gif)
234
![](/Images/OutliningIndicators/None.gif)
235
![](/Images/OutliningIndicators/None.gif)
236
![](/Images/OutliningIndicators/None.gif)
237
![](/Images/OutliningIndicators/None.gif)
238
![](/Images/OutliningIndicators/None.gif)
239
![](/Images/OutliningIndicators/None.gif)
240
![](/Images/OutliningIndicators/None.gif)
241
![](/Images/OutliningIndicators/None.gif)
242
![](/Images/OutliningIndicators/None.gif)
243
![](/Images/OutliningIndicators/None.gif)
244
![](/Images/OutliningIndicators/None.gif)
245
![](/Images/OutliningIndicators/None.gif)
246
![](/Images/OutliningIndicators/None.gif)
247
![](/Images/OutliningIndicators/None.gif)
248
![](/Images/OutliningIndicators/None.gif)
249
![](/Images/OutliningIndicators/None.gif)
250
![](/Images/OutliningIndicators/None.gif)
251
![](/Images/OutliningIndicators/None.gif)
252
![](/Images/OutliningIndicators/None.gif)
253
![](/Images/OutliningIndicators/None.gif)
254
![](/Images/OutliningIndicators/None.gif)
255
![](/Images/OutliningIndicators/None.gif)
256
![](/Images/OutliningIndicators/None.gif)
257
![](/Images/OutliningIndicators/None.gif)
258
![](/Images/OutliningIndicators/None.gif)
259
![](/Images/OutliningIndicators/None.gif)
260
![](/Images/OutliningIndicators/None.gif)
261
![](/Images/OutliningIndicators/None.gif)
262
![](/Images/OutliningIndicators/None.gif)
263
![](/Images/OutliningIndicators/None.gif)
264
![](/Images/OutliningIndicators/None.gif)
265
![](/Images/OutliningIndicators/None.gif)
266
![](/Images/OutliningIndicators/None.gif)
267
![](/Images/OutliningIndicators/None.gif)
268
![](/Images/OutliningIndicators/None.gif)
269
![](/Images/OutliningIndicators/None.gif)
270
![](/Images/OutliningIndicators/None.gif)
271
![](/Images/OutliningIndicators/None.gif)
272
![](/Images/OutliningIndicators/None.gif)
273
![](/Images/OutliningIndicators/None.gif)
274
![](/Images/OutliningIndicators/None.gif)
275
![](/Images/OutliningIndicators/None.gif)
276
![](/Images/OutliningIndicators/None.gif)
277
![](/Images/OutliningIndicators/None.gif)
278
![](/Images/OutliningIndicators/None.gif)
279
![](/Images/OutliningIndicators/None.gif)
280
![](/Images/OutliningIndicators/None.gif)
281
![](/Images/OutliningIndicators/None.gif)
282
![](/Images/OutliningIndicators/None.gif)
283
![](/Images/OutliningIndicators/None.gif)
284
![](/Images/OutliningIndicators/None.gif)
285
![](/Images/OutliningIndicators/None.gif)
286
![](/Images/OutliningIndicators/None.gif)
287
![](/Images/OutliningIndicators/None.gif)
288
![](/Images/OutliningIndicators/None.gif)
289
![](/Images/OutliningIndicators/None.gif)
290
![](/Images/OutliningIndicators/None.gif)
291
![](/Images/OutliningIndicators/None.gif)
292
![](/Images/OutliningIndicators/None.gif)
293
![](/Images/OutliningIndicators/None.gif)
294
![](/Images/OutliningIndicators/None.gif)
295
![](/Images/OutliningIndicators/None.gif)
296
![](/Images/OutliningIndicators/None.gif)
297
![](/Images/OutliningIndicators/None.gif)
298
![](/Images/OutliningIndicators/None.gif)
299
![](/Images/OutliningIndicators/None.gif)
300
![](/Images/OutliningIndicators/None.gif)
301
![](/Images/OutliningIndicators/None.gif)
302
![](/Images/OutliningIndicators/None.gif)
303
![](/Images/OutliningIndicators/None.gif)
304
![](/Images/OutliningIndicators/None.gif)
305
![](/Images/OutliningIndicators/None.gif)
306
![](/Images/OutliningIndicators/None.gif)
307
![](/Images/OutliningIndicators/None.gif)
308
![](/Images/OutliningIndicators/None.gif)
309
![](/Images/OutliningIndicators/None.gif)
310
![](/Images/OutliningIndicators/None.gif)
311
![](/Images/OutliningIndicators/None.gif)
312
![](/Images/OutliningIndicators/None.gif)
313
![](/Images/OutliningIndicators/None.gif)
314
![](/Images/OutliningIndicators/None.gif)
![](/Images/dot.gif)
315
![](/Images/OutliningIndicators/None.gif)
316
![](/Images/OutliningIndicators/None.gif)
317
![](/Images/OutliningIndicators/None.gif)
318
![](/Images/OutliningIndicators/None.gif)
319
![](/Images/OutliningIndicators/None.gif)
320
![](/Images/OutliningIndicators/None.gif)
321
![](/Images/OutliningIndicators/None.gif)
322
![](/Images/OutliningIndicators/None.gif)
323
![](/Images/OutliningIndicators/None.gif)
324
![](/Images/OutliningIndicators/None.gif)
325
![](/Images/OutliningIndicators/None.gif)
326
![](/Images/OutliningIndicators/None.gif)
327
![](/Images/OutliningIndicators/None.gif)
328
![](/Images/OutliningIndicators/None.gif)
329
![](/Images/OutliningIndicators/None.gif)
330
![](/Images/OutliningIndicators/None.gif)
331
![](/Images/OutliningIndicators/None.gif)
332
![](/Images/OutliningIndicators/None.gif)
333
![](/Images/OutliningIndicators/None.gif)
334
![](/Images/OutliningIndicators/None.gif)
335
![](/Images/OutliningIndicators/None.gif)
336
![](/Images/OutliningIndicators/None.gif)
337
![](/Images/OutliningIndicators/None.gif)
338
![](/Images/OutliningIndicators/None.gif)
339
![](/Images/OutliningIndicators/None.gif)
340
![](/Images/OutliningIndicators/None.gif)
341
![](/Images/OutliningIndicators/None.gif)
342
![](/Images/OutliningIndicators/None.gif)
343
![](/Images/OutliningIndicators/None.gif)
344
![](/Images/OutliningIndicators/None.gif)
345
![](/Images/OutliningIndicators/None.gif)
346
![](/Images/OutliningIndicators/None.gif)
347
![](/Images/OutliningIndicators/None.gif)
348
![](/Images/OutliningIndicators/None.gif)
349
![](/Images/OutliningIndicators/None.gif)
350
![](/Images/OutliningIndicators/None.gif)
351
![](/Images/OutliningIndicators/None.gif)
352
![](/Images/OutliningIndicators/None.gif)
353
![](/Images/OutliningIndicators/None.gif)
354
![](/Images/OutliningIndicators/None.gif)
355
![](/Images/OutliningIndicators/None.gif)
356
![](/Images/OutliningIndicators/None.gif)
357
![](/Images/OutliningIndicators/None.gif)
358
![](/Images/OutliningIndicators/None.gif)
359
![](/Images/OutliningIndicators/None.gif)
360
![](/Images/OutliningIndicators/None.gif)
361
![](/Images/OutliningIndicators/None.gif)
362
![](/Images/OutliningIndicators/None.gif)
363
![](/Images/OutliningIndicators/None.gif)
364
![](/Images/OutliningIndicators/None.gif)
365
![](/Images/OutliningIndicators/None.gif)
366
![](/Images/OutliningIndicators/None.gif)
367
![](/Images/OutliningIndicators/None.gif)
368
![](/Images/OutliningIndicators/None.gif)
369
![](/Images/OutliningIndicators/None.gif)
370
![](/Images/OutliningIndicators/None.gif)
![](/Images/dot.gif)
371
![](/Images/OutliningIndicators/None.gif)
372
![](/Images/OutliningIndicators/None.gif)
373
![](/Images/OutliningIndicators/None.gif)