|
|
元件的创建其实就是简单的画图过程,因为在Visual Graph中,页面是一个元件,图库中的元件就是图形文件中的页面,因此我们只要绘图,并且把它保存,下次把它作为元件库打开就行了。
1、元件的画法
一、在集成开发环境中,用鼠标单击元件库列表窗口中的元件小图标,在页面任一点按下左键、或拖动鼠标即可。如果画图过程中按了ESC键,则取消操作。这个操作过程相当于执行脚本程序NewUnit(元件名,0)。
二、在集成开发环境中,按下鼠标左键,把元件库窗口中的元件直接拖动到页面中,这个操作相当于执行脚本NewUnit(元件名,1)。
三、用页面的AddUnit函数动态创建元件,其中第一个参数是元件的类别,也就是元件库中的页面名。
四、用LoadFromBuffer函数从字符串动态创建图形。
在插入元件的时候,将顺序执行元件的Initialize(初始化)、OnCreate(创建元件)、OnLoad(所有图形载入)、OnShow(元件显示)程序。最后元件若被释放,执行OnDestroy。
如果元件含有OnResize事件,新插入的元件允许用鼠标改变大小,同时执行这个事件。如果该元件不含有OnResize事件,用鼠标拖动改变大小时,内部图形单元的大小将按比例改变。
2、元件的形态
元件的形态有下面七种:
一、组合元件。这是由若干图形组合成的一种元件,视图类的函数MergeElement就可以把一组选中的图形组合生成一个元件。这也是最简单的一种元件。可以用SplitElement函数加以拆分。当SelectMode属性为0(有选择框)时,这种元件有八个控制点,可以用鼠标改变大小。此时,内部图形单元的大小按比例改变。只有对于这种元件,IsCombined函数才返回true。下面这个简单元件是由两个圆形和两条线组成:
![]()
我们可以简单地访问组合元件的内部图形,例如,假设上面这个元件名为A,它内部包含一个圆形Circle1,我们可以用下面的Visual Graph脚本语句修改这个圆形的颜色:
A.Circle1.BackColor = 255
在其他编程语言中,当我们得到元件对象A以后,因为无法直接访问Circle1这个关键字(这是Visual Graph内部的名字,预编译的COM接口不可能认识),我们可以下面的语句实现同样的功能:
A.UnitByName( "Circle1" ).BackColor = 255
二、内含脚本语言的元件。这种元件被封装,无法拆分,例如下面这个元件:
![]()
它有自己的功能,完全类似Windows的滚动条,但因为已含脚本语句,所以无法拆分。要访问内部的图形,除非这个元件提供了这方面的接口,例如元件A设计时自定义了一个二类属性B,它的值等于内部的一个矩形单元Rect1,这样,我们就可以用如下的Visual Graph脚本修改这个矩形的背景颜色:
A.B.BackColor = 255
在其他编程语言中,当我们得到元件对象A以后,因为无法直接访问B这个关键字(这是Visual Graph内部的名字,预编译的COM接口不可能认识),我们可以用下面的语句实现同样的功能:
A.UnitByName( "Rect1" ).BackColor = 255,注意这里不能写A.UnitByName( "B" ).BackColor = 255,因为B只是一个属性,不是元件内部的图形。
三、含控制点的元件。这种元件内部的某个线条编写了OnNodeChange事件,因此会显示如下的形态:

该元件的下面有一个文字单元,文字单元中心位置有一个黄色的菱形,用鼠标拖动它,可以拖动改变文字单元的位置,这是因为在元件内部,文字单元上方放了一个点(其实是线条,一个顶点的线条,参看线条单元)。而这个点的OnNodeChange事件中编写了代码如下:
text1.MoveTo( line1.x[0] - text1.width / 2, line1.y[0] - text1.height / 2 )
四、含自定义连接点的元件。这种元件内部的某些线条的LinkMode被设置成非0,也就是允许跟其他图形连接,这样,这个元件也就允许在这些线条的末端跟其他图形连接了。
![]()
上图所示的元件包含三条线,每条线的LinkMode都被设置成了1,因此,整个元件就有三个被连接点。每个连接点都位于线条的末端。
当SystemParams.CenterLink为true时,每个元件将多一个中心连接点。
五、部分内部图形不在选择框内的元件。再次观察三卷变压器那个元件,我们发现,当这个元件被选中时,它内部的文字单元和那个控制点却不在选择框的范围内。这是因为,设计元件时,该文字单元和那个控制点都被加锁了(Locked)
六、类似线条一样的元件。下图中的尺寸线,其实也是一个元件,但是当该元件被选中时,不出现八个选择框,而是只出现三个控制点,这是因为内部包含两个以上控制点,而这些控制点同时又都是连接点。

七、拥有文字标签的元件。这种元件内部包含文字单元,如果它是简单的组合元件,那么在设计态,它的文字单元可以得到输入光标进行编辑(双击元件的文字单元)。如果这个元件里面有一些脚本程序,因此是一个复杂元件,这种情况下,文字单元都无法得到输入光标了。但是当我们给元件添加了某种自定义的二类属性,仍然可以通过鼠标双击文字单元的方式对它进行编辑。

上面这个元件包含一个二类属性Label,它声明如下:
property Label read FLabel
然后,在Initialize事件中声明:
FLabel = Text1。
在运行态下,当文字标签的ReadOnly属性为false时才可以用鼠标选中编辑。
2、元件的链接和嵌入
元件在图形文件中的存在形态有两种,一种是嵌入,一种是链接,系统默认的方式是嵌入方式
系统参数SystemParams.ElementEmbed值是True表示嵌入,否则表示链接。修改此值后,画面上新增加的元件将按照嵌入或者链接的方式存放。
一、嵌入
嵌入是将整个元件嵌入到图形文件中,包括它的细节。
下图表示一个变压器元件“嵌入”页面:
![]()
我们来看这个图形的原文件:
<?xml version="1.0" encoding="utf-8"?>
<vg version="700" range="0,0,800,544" backcolor="$FFFFFF">
<sheet name="sheet1">
<变压器 name="变压器1" bounds="46,28,88,134" origin="67,46" color="0">
<circle name="Circle4" bounds="46,46,88,88" origin="56,26"/>
<circle name="Circle5" bounds="46,73,88,116" origin="56,26"/>
<line name="L1" origin="56,26.5" linkmode="1">
<points>
67,46,6
67,28,2
</points>
</line>
<line name="L2" origin="56,26" linkmode="1">
<points>
67,115,6
67,134,2
</points>
</line>
</变压器>
</sheet>
</vg>
我们通常对使用较少的元件采用嵌入的方式,嵌入的优点在于无需附带图库就可以使用文件,用户只需对这一个文件进行编辑即可,方便了应用。缺点是如果重复量较大的图形仍采用嵌入方式,就会导致文件过大。
二、链接
所谓元件的链接是指插入元件时元件细节并没有被保存在视图文件中,而是链接到图库。
下图表示一个变压器“链接”到页面:
![]()
我们再来看这个图形的原文件:
<?xml version="1.0" encoding="utf-8"?>
<vg version="700" range="0,0,800,544" backcolor="$FFFFFF">
<sheet name="sheet1">
<变压器 name="变压器1" lib="E:\电力设备.tbl" bounds="46,28,88,134" origin="53,45"/>
</sheet>
</vg>
对于大量重复使用的元件,一般采用链接的方式。链接的优点在于文件较小,以及修改图库后,再次打开文件,其中的图形也会变化。缺点是必须附带图库。
在嵌入状态下元件的Lib属性等于空串,而在链接状态下Lib是链接的那个图库文件名。
3、元件无法变形的情况
一、元件保护属性Protect设置禁止改变宽度或高度。
二、元件内包含禁止改变宽度或高度的图形单元。
三、元件内包含旋转的图形。
四、在OnResize事件中写了脚本,但这个程序不起改变大小的作用。例如,仅写一个单引号(注释)。
五、当元件的SelectMode为1时,由于选中元件后无法出现选择框,因此不能用鼠标改变元件的大小。
4、关于元件脱壳
在设计元件的时候,有一个特殊的情况,就是元件没有写任何脚本程序,而且只包含一个图形。以后当该元件被插入新的页面的时候,元件壳(也就是元件所在的那个页面)将被剥去,只插入它内部的那个图形而不是这种元件。
利用这个功能,我们可以制作图片库,把一些常用的图片放在元件库里面使用。还可以制作自定义基本图形库,如把自定义文字单元、自定义矩形、自定义线条等等放在元件库里面使用。只要绘制这些自定义单元的时候预先设置好各种属性或者添加自定义属性就可以了。在绘制自定义线条的时候,如果绘制的图形点数不同,日后从元件库取出的时候如何使用会有差别。例如:
新建两个页面,在每个页面上放一个基本图形,在sheet1上放一个椭圆,名为circle1,在sheet2上放两个椭圆,保存。接着把此文件当作元件库使用,添加名为sheet1的这个元件。我们将得到一个椭圆,而添加名为sheet2的这个元件,我们得到的是一个元件。
5、自定义属性
一个元件被放到页面上后,我们可以编辑、修改其属性。下图是一个刀闸:
![]()
在“属性列表”里可以看到它的自定义属性(红色部分):
![]()
把IsOff属性改为false,图形变成下面这样:
![]()
元件虽然有非常丰富的自定义属性,但却是在设计元件库时添加的,那么如何修改元件的属性呢?
如果元件是链接到图库的,我们只能打开图库文件,修改相应的页面,参见页面。
如果元件是嵌入页面的,在元件上按右键,弹出下面的菜单:

选择“进入编辑元件”,打开一个新文件,元件的内部呈现出来,此新文件和要编辑的元件有一定的联系,无法添加、复制、删除页面,只能给页面改名,页面的名字就是要编辑的元件的类型(Type),当我们修改完成后,选择菜单“文件/保存”,实际上并不是保存文件,而只是刷新了要编辑的那个元件。
6、事件
在脚本语言体系内,每个图形都有自己的各种事件,参见事件。
由于元件设计时可以添加自定义事件,也可以修改事件的类型,因此,有可能跟列表中所示不同,例如,若OnLButtonDown是元件中的一个写了代码的私有函数(默认就是私有的),那么元件就看不到这个事件了。
@2004-2007 北京图王Visual Graph.版权所有. |