搜档网
当前位置:搜档网 › Flex与Twaver资料

Flex与Twaver资料

Flex与Twaver资料
Flex与Twaver资料

TWaver Flex数据模型

TWaverFlex的基本数据元素是twaver.IData,基本数据容器定义为twaver.DataBox,基于这两类基本元素,TWaverFlex预定义了一系列业务对象,视图网元和管理容器,例如告警(twaver.IAlarm)和告警容器(twaver.AlarmBox),图层(twaver.ILayer)与图层管理容器(https://www.sodocs.net/doc/1618357038.html,yerBox),拓扑网元(twaver.IElement)和拓扑管理容器(twaver.ElementBox)......

数据元素结构图

数据管理容器结构图

其中拓扑管理容器(twaver.ElementBox)整合了其他几种容器,提供了丰富的拓扑元素(Dummy, Node, Link, Bus, ShapeNode, ShapeLink, Follower, Rack, Shelf, Slot, Card, Port, Grid, Group, SubNetwork......),为网管界面开发提供了强大的设计模型和业务功能的基础支持。

TWaver Flex数据元素

TWaverFlex以twaver.IData为最基本的数据单元,扩展定义了一系列具有图形和业务意义的数据类型,包括IAlarm, ILayer, IElement...

twaver.IData

IData是TWaverFlex的数据元素基类接口,twaver.Data是对其实现类,定义了id, name, icon, toolTip, parent, children等基本属性,对事件派发做了封装,并支持xml数据的导入导出,为TWaver各平台间数据的可序列化奠定了基础。

Data继承于flash.events.EventDispatcher,这使他具有事件派发和监听的功能,可以通过调用下面的方法派发事件或者添加实现监听器:

flash.events.EventDispatcher#public

dispatchEvent(event:Event):Boolean

flash.events.EventDispatcher#addEventListener(type:String,

listener:Function,

useCapture:Boolean=false, priority:int=0,

useWeakReference:Boolean=false):void

Data还实现了twaver.IData接口,实现了对属性变化事件的派发和监听

function dispatchPropertyChangeEvent(property:String, oldValue:Object, newValue:Object):Boolean;

function addPropertyChangeListener(listener:Function, priority:int = 0

, useWeakReference:Boolean = false):void;

function removePropertyChangeListener(listener:Function):void;

此外,Data中还定义了其他功能函数

function get childrenCount():int;

function get hasChildren():Boolean;

function isDescendantOf(data:IData):Boolean;

function isParentOf(data:IData):Boolean;

function isRelatedTo(data:IData):Boolean;

function toXML(context:XMLContext, newInstance:IData):void;

function parseXML(context:XMLContext, xml:XML):void;

function setPropertyValue(property:String, value:Object):void;

function getPropertyValue(property:String):Object;

下面分别介绍各个实现类

twaver.ILayer

图层,用于TWaver的图层管理,Layer实现了twaver.ILayer接口,有三个特殊属性:visible, editable, movable。TWaverFlex中的层次关系由LayerBox来管理,默认的层次顺序由父子关系和先后顺序决定,在拓扑图中,每个Element通过设置layerId与某个layer相关联以控制网元的显示层次。

twaver.IAlarm

告警,用来表示网管系统中设备故障或者网络异常的数据模型,基本实现类是Alarm。告警与Element相关联,用以反映网元的告警状态,Alarm中定义了级别,是否已清除,是否已确认以及相关联的网元编号。

TWaverFlex预定义了六种告警级别,告警级别的value属性可表示告警的严重程度,默认value 值越大,告警越严重。

TWaver中告警使用AlarmBox进行管理,告警与网元通过AlarmBox来相关联,两者不直接引用,与网元直接引用的是AlarmState,用来反映新发告警的级别和数量

twaver.IElement

IElement是TWaver中最重要的数据元素,Element是其实现类,用于表示拓扑图中的网元对象,如节点,连线,子网,分组,板卡.......

TWaver预定义了丰富的网元类型(Dummy, Node, Link, Bus, ShapeNode, ShapeLink, Follower, Rack, Shelf, Slot, Card, Port, Grid, Group, SubNetwork......),每一种网元对应一个ElementUI 类,对应网元在拓扑图中的呈现组件类型,两者构成一个模型与视图分离的模型结构。

通过设置网元的属性和样式可以表现出丰富的呈现效果和特性,用户也可以扩展这些预定义的Element,或者定制自己的ElementUI,已应对特殊的业务呈现需求。

Element数据可以用ElementBox管理,ElementBox可以驱动https://www.sodocs.net/doc/1618357038.html,work, twaver.Tree, twaver.Table等多种视图

Dummy

在拓扑图中不可见,可在树,表格中显示,通常用来表示无拓扑意义的逻辑分组

Node

表示拓扑图中的一个节点,是其他节点的基类

Link

表示连线,是其他连线类型的基类

Follower

表示跟随者,可以附着在另一个Node(称之为宿主节点)上,宿主节点移动,Follower也跟随着移动

Bus

继承于ShapeNode,是一种布局类型节点,可以与连接在它上面的节点们排布出总线布局那样的效果

ShapeNode

由一系列控制点决定形状,可以表现丰富的形态

ShapeLink

继承于Link,与Link不同,其走向有一系列控制点决定,可以定制出特殊的连线布局

Grid

在拓扑图上表现为网格,可以指定行列数,是Rack, Shelf, Slot, Card, Port的基类,可以用来表示设备面板

Group

表示分组,包含孩子网元,可以展开合并,孩子的位置和范围决定Group展开后的位置和范围

SubNetwork

子网在拓扑图中有重要意义,拓扑图通常并不会一次显示所有的网元,而只显示当前子网中的元素,通过切换子网和数据的延时加载可以解决大数据量的问题

Rack

设备面板中表示机架

Shelf

设备面板中表示机框

Slot

设备面板中表示板卡槽位

Card

设备面板中表示一个板卡

Port

设备面板中表示端口

TWaver Flex数据管理容器

数据管理容器,顾名思义就是用来管理数据的容器,TWaverFlex中的DataBox就是用来管理所有Data数据的容器,在TWaverFlex的设计模式中担当者Model的重要角色,一个DataBox 可以驱动多个视图,DataBox中数据的变化都能够自动的反映到其关联的所有视图组件上。TWaverFlex中的DataBox支持的视图包括:twaver.controls.Tree, twaver.controls.Table,此外ElementBox还有专门的视图组件https://www.sodocs.net/doc/1618357038.html,work。

DataBox

DataBox继承于EventDispatcher,对容器变化以及容器内数据的变化都做了监听,这样就可以通过监听DataBox掌握所有DataBox中元素的变化,用户也可以通过重写on***Changed事件回调函数处理这些事件

public function addDataBoxChangeListener(listener:Function,

priority:int = 0

, useWeakReference:Boolean = false):void

public function removeDataBoxChangeListener(listener:Function):void

public function addDataPropertyChangeListener(listener:Function,

priority:int = 0, useWeakReference:Boolean = false):void

public function

removeDataPropertyChangeListener(listener:Function):void

public function addPropertyChangeListener(listener:Function, priority:int = 0

, useWeakReference:Boolean = false):void

public function removePropertyChangeListener(listener:Function):void

public function addHiberarchyChangeListener(listener:Function, priority:int = 0

, useWeakReference:Boolean = false):void

public function removeHiberarchyChangeListener(listener:Function):void

protected function onDataPropertyChanged(data:IData,

e:PropertyChangeEvent):void

protected function onClientChanged(styleProp:String, oldValue:*, newValue:*):void

一个容器,自然要提供数据管理的方法,DataBox中定义了下面的方法进行数据增删操作

public function add(data:IData, index:int = -1):void

public function remove(data:IData):void

public function removeByID(id:Object):void

public function clear():void

public function getDataByID(id:Object):IData

public function contains(data:IData):Boolean

对数据的遍历查找也提供了简便的方法

public function forEach(callbackFunction:Function):void

public function forEachByDepthFirst(callbackFunction:Function, data:IData = null):void

private function depthFirst(callbackFunction:Function,

data:IData):void

public function forEachByBreadthFirst(callbackFunction:Function, data:IData = null):void

DataBox还管理着数据的层次模型,提供了下面的方法方便数据的移动和插入操作

public function moveUp(data:IData):void

public function moveDown(data:IData):void

public function moveToTop(data:IData):void

public function moveToBottom(data:IData):void

public function moveTo(data:IData, newIndex:int):void

此外DataBox对数据元素的选中机制做了封装,实现了数据的选中模型(SelectionModel),并提供了便捷操作的方法

public function get selectionModel():SelectionModel

public function moveSelectionUp(sm:SelectionModel = null):void

public function moveSelectionDown(sm:SelectionModel = null):void public function moveSelectionToTop(sm:SelectionModel = null):void public function moveSelectionToBottom(sm:SelectionModel = null):void

TWaverFlex中定义了LayerBox, AlarmBox, ElementBox分别用于图层管理,告警管理和网元管理,其中前两种容器都是为ElementBox服务的,用于管理网元的图层和告警信息

LayerBox

LayerBox是管理图层的容器,需要与一个ElementBox关联,其中定义了添加删除层的方法,还预定义了一个默认层

function LayerBox(elementBox:ElementBox)

public function get elementBox():ElementBox

public function get defaultLayer():ILayer

AlarmBox

AlarmBox是管理告警的容器,首先需要与一个ElementBox相关联

function AlarmBox(elementBox:ElementBox)

public function get elementBox():ElementBox

AlarmBox还定义了AlarmElementMapping用来定义网元与告警之间的对应关系,用户可以定制这一关系,实现一个告警影响多个网元的业务需求

public function get/set alarmElementMapping():IAlarmElementMapping

此外还提供了下面的属性

//网元在ElementBox中被删除时,告警是否从AlarmBox中删除

removeAlarmWhenElementIsRemoved

//告警设置为清除级别时,是否自动删除告警

removeAlarmWhenAlarmIsCleared

ElementBox

ElementBox中包含告警容器,图层容器,是管理网元数据的容器,TWaverFlex中为ElementBox 定义了专有的视图组件,用于图形化的显示网元的拓扑关系。

ElementBox中封装了很多功能,是TWaverFlex中最重要和最常用的类,我们将在以后的章节中详细介绍。

ElementBox HelloWorld 示例

xmlns:twaver="https://www.sodocs.net/doc/1618357038.html,/2008/twaver/flex"

layout="vertical" pageTitle="TWaverFlex" creationComplete="init()">

import twaver.Link;

import twaver.Node;

import twaver.ElementBox;

private function init():void{

var box:ElementBox=new ElementBox();

var node1:Node=new Node();

https://www.sodocs.net/doc/1618357038.html,="srouce";

node1.setLocation(20,20);

box.add(node1);

var node2:Node=new Node();

https://www.sodocs.net/doc/1618357038.html,="target";

node2.setLocation(200,100);

box.add(node2);

var link:Link=new Link(node1,node2);

https://www.sodocs.net/doc/1618357038.html,="Hello World";

box.add(link);

network.elementBox=box;

tree.dataBox=box;

}

]]>

TWaver 视图组件

Network组件介绍

Network组件概要

Network组件用于图形化呈现网元信息,具有网元过滤,子网切换,背景图支持,缩放查看,多图层机制,Attachment组件显示等功能,还提供了丰富的鼠标交互和动画效果,是网管系统中最直观、最美观的展示平台。此外Network还提供了上百个函数和属性,用户可以灵活的配置和扩展,以满足特殊的应用需求。

下面先展示一张示例截图,简要介绍Network中几个常用的功能,详细功能将在以后的章节介绍。

利用Network组件可以轻易的做出下面拓扑图效果

Network的组件模型和层次结构

Network继承于flex的Canvas,其下包含多个容器组件,分别放置不同类型的组件。network 组件结构:

Network

-> rootCanvas //根容器面板

-> topCanvas //顶层面板

-> attachmentCanvas //附件面板

-> layerCanvas //网元视图面板,用于放置ElementUI,

-> layer n //ElementUI的层次关系由https://www.sodocs.net/doc/1618357038.html,yerBox来管理

-> layer ...

-> layer 0

-> bottomCanvas //底层容器面板

-> backgroundCanvas //背景层面板

拓扑图中的网元组件

Network中每个网元对应一个ElementUI的视图组件,通过操作网元的数据模型(Element)可以反映到这个视图组件的呈现效果,Network中可以通过下面的方法得到网元对应的这个组件。

public function getElementUI(element:IElement):ElementUI

Attachment组件

拓扑图中的网元不只能关联ElementUI组件,还可以绑定多个附件(Attachment)组件来表现属性,如网元标签,告警冒泡都是通过附件机制实现的,用户可以给网元定义新的附件以表现网元的属性

Attachment继承于UIComponent,上面可以添加任意Flex组件,通过设置showInAttachmentCanvas属性可以控制其是添加到ElementUi还是独立加入到拓扑图中的附件层画布(attachmentCanvas)中https://www.sodocs.net/doc/1618357038.html,work.ui.Attachment

//Attachment构造函数

public function Attachment(elementUI:ElementUI, showInAttachmentCanvas:Boolean = false)

https://www.sodocs.net/doc/1618357038.html,work

//network中的附件层画布,附件组件可以添加到ElementUI组件下,

//也可以与ElementUI组件分离,直接添加在拓扑图的附件层画布中,这样可以保证附件置顶显示

public function get attachmentCanvas():Canvas

https://www.sodocs.net/doc/1618357038.html,work.ui.ElementUI

//ElementUI中可以获取网元附件的集合

public function get attachments():ICollection

Network常用功能

切换交互模式

Network中切换交互模式,能实现不同模式下不同的鼠标交互效果,最常用到的是选择模式(也叫默认模式)和编辑模式,用户也可以通过实现InteractionHandler接口,处理鼠标键盘事件,以定制自己的交互模式,这些InteractionHandler可以叠加使用,各种交互可以灵活编制在一起。

//切换到为默认交互模式

public function setDefaultInteractionHandlers(lazyMode:Boolean = false):void

//切换到编辑模式

public function setEditInteractionHandlers(lazyMode:Boolean = false):void

//切换到创建节点交互模式

public function setCreateNodeInteractionHandlers(nodeClass:Class = null):void

//切换到创建连线的交互模式

public function setCreateLinkInteractionHandlers(linkClass:Class = null):void

//切换到创建ShapeNode交互模式

public function

setCreateShapeNodeInteractionHandlers(shapeNodeClass:Class =

null):void

过滤器的使用

network.visibleFunction = function(node:IElement):Boolean{

retrun node.childrenCount > 0;

};

列举部分属性

Network有上百个属性,这里列举一部分

//设置当前子网

public function get/set currentSubNetwork():ISubNetwork

//进入上级子网

public function upSubNetwork(animate:Boolean = false):void

//添加/删除交互(鼠标键盘)监听器

public function addInteractionListener(listener:Function,

priority:int = 0, useWeakReference:Boolean = false):void

public function removeInteractionListener(listener:Function):void

//刷新网元视图

public function invalidateElementUI(element:IElement):void

//获得网元视图

public function getElementUI(element:IElement):ElementUI{

//缩放操作

public function get zoom():Number

public function zoomIn():void

public function zoomOut():void

public function zoomReset():void

public function zoomOverview():void

//获得拓扑图组件中的面板容器

public function get rootCanvas():Canvas

public function get topCanvas():Canvas

public function get attachmentCanvas():Canvas

public function get layerCanvas():Canvas

public function get bottomCanvas():Canvas

public function get backgroundCanvas():Canvas

Table组件介绍

twaver.controls.Table组件继承于Flex的DataGrid,实现了与DataBox的数据绑定,可以作为任何DataBox(LayerBox, AlarmBox, ElementBox)模型的视图组件。

twaver.controls.Table对列配置和操作做了简化处理,可以更方便的显示网元的样式属性,还扩展了一些Renderer和Editor,使用户能更简洁的创建表格,展示数据信息。

table示例截图

Table的使用与DataGrid相同

需要注意的是列配置部分,twaver.controls.Table中对列做了改进,如dataField="C:number" 表示将通过调用item.getClient("number"), item.setClient("number",value)来获得和修改单元格的数值,这样就方便于用表格呈现网元的样式属性

过滤器的使用

table.visibleFunction = function(data:IData):Boolean{

retrun data.childrenCount > 0;

};

下面的例子显示两列

自定义列

package table

{

import mx.controls.dataGridClasses.DataGridColumn;

import mx.core.ClassFactory;

public class DataColumn extends DataGridColumn

{

public function DataColumn(columnName:String=null)

{

super(columnName);

this.itemRenderer = new ClassFactory(DataRenderer);

this.editable = false;

this.dataField = "id";

this.headerText = "Element";

}

}

}

自定义renderer

package table

{

import flash.display.BitmapData;

import flash.geom.Matrix;

import mx.containers.HBox;

import mx.controls.TextInput;

import mx.core.UIComponent;

import twaver.IData;

import twaver.Utils;

import twaver.controls.Table;

public class DataRenderer extends HBox

{

public static const size:Number = 18;

private var image:UIComponent = new UIComponent();

private var textInput:TextInput = new TextInput();

public function DataRenderer()

{

textInput.percentWidth = 100;

this.addChild(image);

this.addChild(textInput);

this.horizontalScrollPolicy = "off";

this.verticalScrollPolicy = "off";

this.textInput.mouseEnabled = false;

this.textInput.mouseChildren = false;

this.textInput.setStyle("borderStyle", "none");

this.textInput.setStyle("backgroundAlpha", 0);

this.setStyle("paddingLeft", 3);

this.setStyle("paddingRight", 3);

this.setStyle("horizontalGap", 2);

}

override public function set data(value:Object):void {

super.data = value;

var d:IData = null;

if(this.data is IData){

d = this.data as IData;

}

else if(this.data && this.owner is Table){

d = Table(this.owner).dataBox.getDataByID(this.data.id); }

image.graphics.clear();

if(d != null){

this.textInput.text = Utils.getQualifiedClassName(d);

var bd:BitmapData = Utils.getImage(d.icon);

var matrix:Matrix = new Matrix();

matrix.scale(size/Number(bd.width), size/Number(bd.height)); image.graphics.beginBitmapFill(bd, matrix);

image.graphics.drawRect(0, 0, size, size);

image.graphics.endFill();

image.width = size;

image.height = size;

}else{

this.textInput.text = label;

image.width = 0;

image.height = 0;

}

}

}

}

表格显示上面的列和name列,并设置name列可编辑

xmlns:tw="https://www.sodocs.net/doc/1618357038.html,/2009/twaver/flex"

xmlns:demo="table.*"

applicationComplete="init()">

import twaver.*;

private function init():void{

var box:DataBox = table1.dataBox;

var from:Node = new Node();

https://www.sodocs.net/doc/1618357038.html, = "from";

from.location = new Point(20, 20);

box.add(from);

var to:Node = new Node();

https://www.sodocs.net/doc/1618357038.html, = "to";

to.location = new Point(150, 60);

box.add(to);

var link:Link = new Link(from,to);

https://www.sodocs.net/doc/1618357038.html, = "hello TWaver!";

box.add(link);

}

]]>

运行界面

Tree组件介绍

twaver.controls.Tree继承于Flex的Tree组件,可以与任意DataBox数据容器(LayerBox, AlarmBox, ElementBox...)绑定,树视图的层次关系由数据容器中元素的父子关系决定,树图组件有自己的选中模型,也可以使用DataBox的选中模型,这样可以达到同步选中的效果。

树图组件的使用非常简单,只要关联上DataBox类型的数据容器,就可以展示这个容器中的层次结构

过滤器的使用

tree.visibleFunction = function(data:IData):Boolean{

retrun data.childrenCount > 0;

};

示例:

xmlns:twaver="https://www.sodocs.net/doc/1618357038.html,/2008/twaver/flex"

layout="vertical" pageTitle="TWaverFlex" creationComplete="init()">

import twaver.Link;

import twaver.Data;

import twaver.DataBox;

private function init():void{

var box:DataBox=new DataBox();

var node:Data=new Data();

https://www.sodocs.net/doc/1618357038.html,="hello world";

box.add(node);

var parentNode:Data=new Data();

https://www.sodocs.net/doc/1618357038.html,="parent";

box.add(parentNode);

var child:Data=new Data();

https://www.sodocs.net/doc/1618357038.html,="child";

child.parent=parentNode;

box.add(child);

tree.dataBox=box;

tree.callLater(function():void{

tree.expandChildrenOf(tree.rootTreeData, true);

});

}

]]>

运行结果

数据序列化

TWaver Flex支持数据容器的导入导出,便于数据的保存和传输。TWaver Flex使用XMLSerializer来完成这项工作,提供serialize/deserialize方法实现DataBox中数据的序列化和反序列化。

构建一个XMLSerializer

var xmlSerializer:XMLSerializer=new XMLSerializer(box);

序列化与反序列化

public function serialize():String

public function deserialize(xmlString:String, rootParent:IData = null):void

XMLSerializer还可以设置哪些属性可以输出,哪些不输出

不输出元素id

xmlSerializer.settings.registerProperty("id",null);

Microsoft flexGrid control Microsoft flexGrid control控件比较常见。

Microsoft flexGrid control控件比较常见。 【实现步骤】 1.当鼠标点击表格控件的某一格时,首先判断该列的属性,是直接编辑呢,还是用下拉列表进行选择。 2.显示隐藏的文本控件或者下拉列表控件,显示的位置和大小与选中格的位置大小完全相同,这样可以覆盖选中格 3.将选中格的内容填到文本控件或者下拉列表控件中 4.修改完毕后,将新的内容填到选中格中,同时隐藏文本控件或者下拉列表控件。 【主要程序段及说明】 变量定义: CComboBox m_ChangeCombo;--下拉列表控件,初始时不可见 CEdit m_Change;---------------文本控件,初始时不可见 CSring m_sChange;----------------与文本控件关联的字符串 CMSFlexGrid m_FlexGrid;-----表格控件 程序段: 表格点击事件:选中某一格后,就要显示相应的文本控件或者列表控件 void CChartInfoEditDlg::OnClickMsflexgrid() { //点击无效区,返回 long lRow = m_FlexGrid.GetRowSel();//获取点击的行号 long lCol = m_FlexGrid.GetColSel(); //获取点击的列号 if(lRow>m_SAttrInfo.attrNum) //如果点击区超过最大行号,则点击是无效的

return; if(lRow == 0) //如果点击标题行,也无效 return; // CRect rect; m_FlexGrid.GetWindowRect(rect); //获取表格控件的窗口矩形 ScreenToClient(rect); //转换为客户区矩形 // MSFlexGrid 控件的函数的长度单位是"缇(twips)", //需要将其转化为像素,1440 缇= 1 英寸 CDC* pDC =GetDC(); //计算象素点和缇的转换比例 int nTwipsPerDotX = 1440 / pDC->GetDeviceCaps(LOGPIXELSX) ; int nTwipsPerDotY = 1440 / pDC->GetDeviceCaps(LOGPIXELSY) ; //计算选中格的左上角的坐标(象素为单位) long y = m_FlexGrid.GetRowPos(lRow)/nTwipsPerDotY; long x = m_FlexGrid.GetColPos(lCol)/nTwipsPerDotX; //计算选中格的尺寸(象素为单位)。加1是实际调试中,发现加1后效果更好 long width = m_FlexGrid.GetColWidth(lCol)/nTwipsPerDotX+1; long height = m_FlexGrid.GetRowHeight(lRow)/nTwipsPerDotY+1; //形成选中个所在的矩形区域 CRect rc(x,y,x+width,y+height);

Flex打印问题

Flex打印问题 使用两个类解决打印问题:FlexPrintJob和PringDataGrid。 ? FlexPrintJob。这个类需要在实例化之后用作要打印对象的容器。 ? PringDataGrid。是DataGrid的一个子类,用来打印必须以网格或表格形式显示的数据,支持多页面打印。 简单的打印实例: < ?xml version="1.0" encoding="utf-8"?> < mx:Application xmlns:mx=https://www.sodocs.net/doc/1618357038.html,/2006/mxml layout="absolute"> < /mx:Application> 见源代码:printDemo.mxml。 创建单独的Print容器: < ?xml version="1.0" encoding="utf-8"?> < mx:Application xmlns:mx=https://www.sodocs.net/doc/1618357038.html,/2006/mxml layout="absolute" creationComplete="bookDataCall.send()">

(完整版)MSFlexGrid控件属性及使用方法整理

MSFlexGrid控件属性及使用方法整理 ================================================= MSFlexGrid总行数和总列数的定义: MSFlexGrid1.Rows = 5 '规定表格的总行数为5行 MSFlexGrid1.Cols = 2 '规定表格的总列数为2行 MSFlexGrid某一单元格的文本内容 MSFlexGrid1.TextMatrix(3, 0) ="网站地址" '定义第3行的左边表头文本内容为:“网站地址”MSFlexGrid1.TextMatrix(3, 2) ="https://www.sodocs.net/doc/1618357038.html, " 定义第3行第2列的文本内容为:“https://www.sodocs.net/doc/1618357038.html,” 右键选中MSFlexGrid的 Private Sub MSFlexGrid1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) If Button = vbRightButton Then MSFlexGrid1.Row = y / MSFlexGrid1.RowHeight(0) - 0.5 MSFlexGrid1.RowSel = MSFlexGrid1.Row '右键选种当前行---备用u3u3: 'MSFlexGrid1.Col = 0 'MSFlexGrid1.ColSel = MSFlexGrid1.Cols - 1 '右键选种当前单元格---备用u3u3: 'MSFlexGrid1.Col = x / MSFlexGrid1.ColWidth(0) - 0.5 'MSFlexGrid1.Col = MSFlexGrid1.Col 'Text1.Text = MSFlexGrid1.Text End If End Sub

MSFlexGrid控件详解

MSFlexGrid控件 目录 概述 属性 方法 事件 属性常数 概述 属性 方法 事件 属性常数 展开 编辑本段概述 MSFlexGrid控件显示和操作表格数据。其对包含字符串和图片的表格提供了灵活的排序、插入数据和格式编排功能。当与Data控件绑定时,MSFlexGrid控件只显示只读数据。 你可以在MSFlexGrid中的任何单元放置文本、图片或这二者。Row和Col属性指定MSFlexGrid控件的当前单元。你可以在代码中指定当前单元,也可以在运行时使用鼠标或键盘改变当前单元。Text属性引用了当前单元中的文本。 如果单元中的文本太长以致不能在单元中一行显示,将WordWrap属性置为True将在单元中分多行显示文本。要在单元中显示多行文本,你需要增大单元的宽度(ColWidth属性)或行高度(RowHeight属性)。 使用Cols和Rows属性确定MSFlexGrid控件中的行数和列数。 编辑本段属性 OLEDropMode属性(ActiveX控件),Height, Width属性(ActiveX 控件),Index属性(ActiveX控件),Left, Top属性(ActiveX控件),Tag属性(ActiveX控件),Visible属性(ActiveX控件),Object属性(ActiveX控件),ColPos属性,ColPositon, RowPosition属性,Cols, Rows 属性(MSHFlexGrid),ColSel,RowSel属性,ColWidth属性(MSHFlexGrid),FillStyle属性(MSHFlexGrid),FixedCols, FixedRows属性

Flex与Twaver资料

TWaver Flex数据模型 TWaverFlex的基本数据元素是twaver.IData,基本数据容器定义为twaver.DataBox,基于这两类基本元素,TWaverFlex预定义了一系列业务对象,视图网元和管理容器,例如告警(twaver.IAlarm)和告警容器(twaver.AlarmBox),图层(twaver.ILayer)与图层管理容器(https://www.sodocs.net/doc/1618357038.html,yerBox),拓扑网元(twaver.IElement)和拓扑管理容器(twaver.ElementBox)...... 数据元素结构图 数据管理容器结构图 其中拓扑管理容器(twaver.ElementBox)整合了其他几种容器,提供了丰富的拓扑元素(Dummy, Node, Link, Bus, ShapeNode, ShapeLink, Follower, Rack, Shelf, Slot, Card, Port, Grid, Group, SubNetwork......),为网管界面开发提供了强大的设计模型和业务功能的基础支持。 TWaver Flex数据元素 TWaverFlex以twaver.IData为最基本的数据单元,扩展定义了一系列具有图形和业务意义的数据类型,包括IAlarm, ILayer, IElement... twaver.IData

IData是TWaverFlex的数据元素基类接口,twaver.Data是对其实现类,定义了id, name, icon, toolTip, parent, children等基本属性,对事件派发做了封装,并支持xml数据的导入导出,为TWaver各平台间数据的可序列化奠定了基础。 Data继承于flash.events.EventDispatcher,这使他具有事件派发和监听的功能,可以通过调用下面的方法派发事件或者添加实现监听器: flash.events.EventDispatcher#public dispatchEvent(event:Event):Boolean flash.events.EventDispatcher#addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):void Data还实现了twaver.IData接口,实现了对属性变化事件的派发和监听 function dispatchPropertyChangeEvent(property:String, oldValue:Object, newValue:Object):Boolean; function addPropertyChangeListener(listener:Function, priority:int = 0 , useWeakReference:Boolean = false):void; function removePropertyChangeListener(listener:Function):void; 此外,Data中还定义了其他功能函数 function get childrenCount():int; function get hasChildren():Boolean; function isDescendantOf(data:IData):Boolean; function isParentOf(data:IData):Boolean; function isRelatedTo(data:IData):Boolean; function toXML(context:XMLContext, newInstance:IData):void; function parseXML(context:XMLContext, xml:XML):void; function setPropertyValue(property:String, value:Object):void; function getPropertyValue(property:String):Object; 下面分别介绍各个实现类 twaver.ILayer

flex个人总结

Flex笔记 RIA(Rich Internet Applications) 1.Flex用到的2种语言:MXML 和actionScript ,由于flash player 只支持actionScript3.0和actionScript 2.0,所以MXML会编译成actionScript类; 2.MXML内部嵌入actionSript,实例: 这句话的意思是把其作为内容引用,比如< > &在xml中都有特殊的用法; 3.ActionScript3.0的语言运算符: ①算术用于各类数值的运算:+ 加,- 减,* 乘,/ 除,% 求余,++ 自增,-- 自减 ②逻辑运算:&& 与,|| 或,!非 ③关系运算符:> 大于,< 小于,== 等于,>= 大于等于,<= 小于等于,!=不等于 ④位运算符:& 位与,| 位或,~ 位非,^ 位异或, << 左移, >> 右移 ⑤特殊运算符:()括号,[] 小标,取XML 的属性值”@“ ⑥赋值运算符:简单赋值=;复合算术赋值符:+= ,-=,*=,/=,%=;复合位运算赋值:&=,|=,^=,>>=,<<= ⑦条件运算符: ? ⑧逗号运算符用于把若干表达式组合成一个表达式,运算符为”,“ 4.Flex中的数字类型:int ,Number, uint Number: 在ActionScript3.0中,Number数据类型可以表示整数、无符号整数和浮点数。但是,为了尽可能提高性能,应将Number数据类型仅用于浮点数,或者用于int和uint 类型可以存储的、大于32位的整数值。要存储浮点数,数字中应包括一个小数点。如果您省略了小数点,数字将存储为整数。 Int:Flex数据类型中int数据类型在内部存储为32位整数,它包含一组介于-2,147,483,648(-231)和2,147,483,647(231-1)之间的整数(包括-2,147,483,648和2,147,483,647)。早期的ActionScript版本仅提供Number数据类型,该数据类型既可用于整数又可用于浮点数。在ActionScript3.0中,现在可以访问32位带符号整数和无符号整数的低位机器类型。如果您的变量将不会使用浮点数,那么,使用int数据类型来代替Number 数据类型应会更快更高效。 对于小于int的最小值或大于int的最大值的整数值,应使用Number数据类型。Number 数据类型可以处理-9,007,199,254,740,992和9,007,199,254,740,992(53位整数值)之间的值。int数据类型的变量的默认值是0。 Uint:uint数据类型在内部存储为32位无符号整数,它包含一组介于0和4,294,967,295(232-1)之间的整数(包括0和4,294,967,295)。uint数据类型可用于要求非负整数的特殊情形。例

flex4.0标签

Flex 4 读取xml文件,xml文件的格式: 根节点 叶子 信息 test-left test-middle fx:Binding可以使用 标签将某个对象的数据绑定到另一个对象。 可以使用 标签在 MXML 文件中定义内联单元格渲染器或单元格fx:Component 编辑器。 fx:Declarations可以使用 标签声明当前类的非默认、不可视属性。 可以在 标签内使用 标签定义图形子对象,然后fx:Definition 可以将子对象用于应用程序的其他部分中。 fx:DesignLayer 标签仅供内部使用。 fx:Library可以使用 标签声明当前类的非默认、非可视属性。 fx:Metadata使用 标签可以在 MXML 文件中插入 metadata 标签。 fx:Model可以使用 标签在 MXML 中声明数据模型。 fx:Private可以使用 标签提供有关 MXML 或 FXG 文档的元数据信息。 作为视图状态更改的一部分,可以使用 标签更改某个组件的父容fx:Reparent 器。 fx:Script可以使用 标签定义 ActionScript 代码块。 fx:Style可以使用 标签定义适用于当前文档及其子项的样式。 fx:XML可以使用 标签在 MXML 中声明 XML 格式的数据模型。 可以使用 标签在 MXML 中通过文本格式的模型创建 E4X XMLList fx:XML List 对象。 fx:Binding在使用标签时,需要提供源属性和目标属性。可以使用标签将视图或用户界面与模型完全分离。通过标签,您还可以将不同的source 属性绑定到同一个destination 属性。

MSFlexGrid控件

MSFlexGrid控件 MSFlexGrid控件显示和操作表格数据。其对包含字符串和图片的表格提供了灵活的排序、插入数据和格式编排功能。当与Data控件绑定时,MSFlexGrid控件只显示只读数据。 你可以在MSFlexGrid中的任何单元放置文本、图片或这二者。Row和Col属性指定MSFlexGrid控件的当前单元。你可以在代码中指定当前单元,也可以在运行时使用鼠标或键盘改变当前单元。Text属性引用了当前单元中的文本。 如果单元中的文本太长以致不能在单元中一行显示,将WordWrap属性置为True将在单元中分多行显示文本。要在单元中显示多行文本,你需要增大单元的宽度(ColWidth属性)或行高度(RowHeight属性)。 使用Cols和Rows属性确定MSFlexGrid控件中的行数和列数。 MSFlexGrid特有事件 ※注1:MSFlexGrid控件的特有事件全部是不带参数的,要注意与DataGrid控件的同名事件区分 ※注2:执行顺序:LeaveCell → SelChange → EnterCell → RowColChange ◇SelChange事件 (DISPID = 69) Private Sub object_SelChange() void OnSelChange(void); ◇RowColChange事件 (DISPID = 70) Private Sub object_RowColChange() void OnRowColChange(void); ◇EnterCell事件 (DISPID = 71) Private Sub object_EnterCell() void OnEnterCell(void); ◇LeaveCell事件 (DISPID = 72) Private Sub object_LeaveCell() void OnLeaveCell(void); ◇Scroll事件 (DISPID = 73) Private Sub object_Scroll() void OnScroll(void); ◇Compare事件 Private Sub object_Compare(row1, row2, cmp) void OnCompare(long nRow1, long nRow2, CMP_FUNC pFunc) ActiveX控件事件

Flex3.0面试题

1.as2与as3.的最主要区别是什么? 答:首先,as2和as3是完全不同的语言,几乎没有兼容性可言。as2编译用的AVM1虚拟机,as3用的AVM2,速度快,提供了一些基础异常处理。 as3是纯的OOP,强类型语言。as2不是。具体的差别有太多太多。 2.flex的开发框架有哪些,它们有什么优缺点? 答:最常见的当然是Cairngorm、Puremvc了,此外还有Mate,Swiz等等,据说被广泛应用的已经有10几款了。Cairngorm作为Adobe官方出品,有着贵族血统的它比较全面,是这些框架中已知bug最少的,但是基于他的应用相对臃肿复杂一些,需要对每个可以被触发的事件写一个对应的Command,编码量巨大,并且单元测试很不容易,不适合敏捷开发。Puremvc应该是现在用的最多的as 框架了。比较完善、并且与Cairngorm相比,更适合中小型应用的开发,它与Cairngorm一样,也是以MVC模式为中心,并以Fa?ade作为中央存储器的单件类的形式进行开发的。说下Mate,它是一个比较奇怪的框架,是基于标签的事件驱动型的。也就是说你不能再随意的写as类的,在使用Mate的情况下,只能用MXML来做这些事情。Swiz是Mate的孪生兄弟,长的挺像,没具体用过,不大了解。 3.在flex开发中,很多代码都写在mxml文件里,为了做到mvc模式,你是怎么处理的。 我认为mxml并不影响mvc模式啊。分两种情况来讨论,首先,是自己创建整个应用结构的时候,那我们可以手动将UI所在的mxml归为一类,然后由Mediator去操作或者说控制这些组件既可了,然后Mediator又统一交给Controller去操作。如果采用其他框架来进行开发的话,那就更不用来考虑这个问题了,像Cairngorm、Puremvc之类的框架已经很好的为我们解决了这些问题。只要按照它们的使用规范来进行开发,自然没有问题。 4.如果发生内存泄露,你是如何解决的? 在profile观察中已经内存泄漏是没有很好的解决办法的,至少我不知道,我能做的只是尽量去避免这种情况的发生,比如说注意不要循环引用,特别是在使用Timer的时候要格外注意,不要忘记全局对象上的引用的清除,在创建控制器和模型的时候要注意一定要使用单件模式。在addEventListener时候尽量采用弱引用、自引用、或者子对象引用,以避免内存泄漏。 5。as3.0垃圾回收器是如何工作的? flash player 8之前采用的是引用计数法,在flash player 8 之后用的是标记法,简单的说就是:从应用的根节点开始,遍历所有其上的引用,标记每个它所发现的 对象。然后迭代遍历每个被标记的对象,标记它们的子对象。这个过程第归进行,直到Player遍历了应用的整个对象树并标记了它所发现的每个东西。在这个过

Flex_4_样式与布局小结

Flex 4 样式与布局 第一篇 Flex 4 与自定义布局(Layout) Flex 4/Spark组件架构的新功能之一是可以定制一个容器的布局而不必改变容器本身。您需要做的就是定义一个自定义布局。 Flex 4/Spark架构中的容器并不控制它们自己的布局。相反,每种容器具有一个布局属性,用于确定如何在屏幕上设置子元素的布局。可以使用一个单独的Group容器,并赋予其一个垂直布局、水平布局或平铺布局,这取决于您将如何创建它。代码很简单,如下所示:

(参考文章:Flex 4与自定义布局: 译文:https://www.sodocs.net/doc/1618357038.html,/lihe111/archive/2009/07/06/4325571.aspx 原文:https://www.sodocs.net/doc/1618357038.html,/2009/05/flex-4-custom-layouts.html) 第二篇 Flex 4 SkinClass 改变组件外观 在Flex 4中,SkinClass指向的文件通常用一个使用s:skin标签(或者sparkskin)的MXML 文件进行定义。通过skinclass来改变外观的spark组件通常也是skinclass引用的Host component。Flex 4 中新的改变外观架构可以在很大的程度上将组件和组件的外观设计分开,这样组件外观设计的代码通过改变小部分的代码就可以得到重用了。 一、SkinClass必须包含的三样东西: 1、HostComponent metadata SkinClass文件需要引用HostComponent对象,而HostComponent是指需要改变外观的组件。我们可以通过metadata标签来指定HostComponent。如:我们需要设置Button 的外观,那么Button就是HostComponent。 Code: 1. 2. 5. 2、States 如果HostComponent中有SkinState(一般用metadata标签来声明),例如:

FlexGrid控件的使用(二)

FlexGrid控件的使用(二) 时间:2007-05-05 缩进带区 如果带区以垂直方式显示,那么可以使带区缩进若干列。这样就可以使用户查看带区信息的时候更加清楚。每个带区前面被缩进的列中包含了空白的、未被使用的单元格。因此,用户不能够将焦点移到这些区域中。这些单元格的格式特点是由若干缩进格式定义属性,如GridLinesIndent定义的。请参阅前面的“改变带区的布局”中的“垂直方式的带区显示”图片。 要缩进带区 1. 右击Hierarchical FlexGrid,然后从快捷菜单中选择“属性”。出现Hierarchical FlexGrid的“属性页”对话框。 2. 在“带区”选项卡中,选择“带区缩进”并指定带区需要缩进的列数。 3. 单击“确定”,将带区属性应用于Hierarchical FlexGrid并关闭“属性页”对话框。 对非分层结构的Recordset使用带区功能 使用Hierarchical FlexGrid的“属性页”对话框,也可以设置非分层结构的Recordset 带区的格式。非分层结构的Recordset中只包含一个带区,即Band 0。没有其他的带区,因为带区是以Command 分层结构中的Recordsets 为基础的。 使用带区的扩展和收缩功能 扩展和收缩功能有助于方便地查看Recordset的组织情况,便于滚动查看Hierarchical FlexGrid。该功能使用户既能够查看大量的数据,也可以查看压缩形式的信息。如果一个带区是可开展的,那么该带区的左上角会显示出一个缺省的扩展(+) 或收缩(-) 位图。无论垂直带区还是水平带区都可以使用扩展和收缩功能。 当带区处于扩展状态的时候,出现的将是收缩(-) 位图。在扩展状态下,带区显示出最大数量的数据。当带区处于收缩状态的时候,出现的将是收缩(+) 位图。在扩展状态下,带区显示出最少量的数据。 在收缩状态下,带区中可能显示未被填充数据的区域。对未填充区域的格式也有专门的规定。 收缩状态的带区 当一个带区处于收缩状态时,它的任何一个记录都不会显示出来,该带区中的列也不会显示出来。当用户将带区展开时,这些列将显示出来。展开状态的带区具有统一的高度。在必要的情况下,

JFLex用户手册中文版

JFLEX词法分析 安装与配置 1.下载jflex-1.4.3.zip,解压缩到本地目录(c:/jflex)。 2.找到jflex\bin\jflex.bat文件,配置JAVA HOME和JFLEX HOME 3.把x:\jflex\bin写入系统环境变量path中 运行 可视化方式 直接运行jflex\bin\jflex.bat文件,打开可视化界面操作即可。 命令行方式 配置 把x:\jflex\bin以及x:\jflex\lib\ JFlex.jar配置到系统环境变量的CLASSPATH中。 格式 java JFlex.Main 运行参数 -d 生成文件的输出目录 --skel 使用外部的骨架文件生成扫描器类,它大多数情况下用于JFLEX的维护和低级别定制。只有在你知道自己正在作什么时候才使用它。JFLEX的源码中带有一个骨架文件,预先编写骨架

文件才能使用此命令。 --nomin 在扫描器生成的过程中,跳过DFA简化步骤。 --jlex 完全兼容jlex --dot 为NFA, DFA and minimised DFA生成扩展名为.dot的graphviz图型文件。该参数还在最初阶段,尚未完全实现。 --dump 在控制台显示NFA转换表,初始DFA和最简DFA。 --verbose or –v 显示生成过程信息。 --quiet or –q 仅显示生成错误信息 --time 显示代码生成耗时信息(不十分精确) --version 打印JFLex版本号

flex开发规范文档

Flex开发规范 开发规范对可以使用项目中所有的文件进行统一,增加可读性,减少错误出现的几率。规范的编码减少人员变动带来的维护成本,可以让程序员尽快而彻底的理解新的代码。 为了方便维护,特定flex开发规范,每个人必须执行。 1.总体要求 所有As功能代码部分,每个方法需要有相应的注释。核心功能代码要求每个处理都要有注释。注释内容包括:方法功能用途,编写人,时间。 所有标签代码,需进行代码格式化。(myeclipse中的格式化)。 对于后期修改的代码,要注明为后期修改,并写明具体修改时间,修改人。 项目开发必须严格按照开发规范进行编写。 2.命名规则 2.1.项目结构及文件夹命名规则 文件夹命名需小写。除特殊运用框架的工程之外,项目中的文件目录结构应为: com >>assets 图片文件夹 >>common 常用组件文件夹 >>styles 样式文件夹 >>configs 配置文件夹 >>其他业务文件夹 2.2.类命名规则 类命名首字母需大写,取名需按照业务功能的字面意思进行取名。例如LoginPage。所有弹出页面均要加上XXXPop后缀。 2.3.配置文件命名规则 所有配置文件需按字面意思进行命名,首字母大写。例如MapConfig.xml。若文件是某个类专用读取属性于地址目录的配置文件,则要与该类同名。例如HireLine.mxml与HireLine.xml。

2.4.方法命名 除构造方法外,一般方法首字母需小写,后采用驼峰式命名方法,方法命名需体现方法功能。禁止方法名超长。标准应为如下:onMapClick():void, querryCarInfo():void, 2.5.类变量命名 变量命名需简短,明意。首字母需小写,并采用驼峰式命名方法。对于特定关键代码的变量命名后缀需与参照其类型名。例如集合与数组:messageArr。Object类为:infoObj。事件为:clickEvt。字符串为:querryStr等。 2.6.临时变量命名 尽量不与类变量同名,命名方法参照类变量,循环体内的自增变量需采用I,j,k,m,n,也可写成index。对于引用自定义类的变量,命名取该类型的缩写或取其名称的一部分。例如自定义类为CarInfoSearchPop,则变量名为cisp或carpop。 2.7.Bean命名 采用驼峰命名方法,命名需体现业务意思,以Bean结尾,例如:CarInfoBean。 2.8.Remote方法命名 Remote方法命名需与Java端方法同名。 2.9.标签命名 标签的命名所有字母都需大写 3.注释 3.1.类注释 因类包含mxml与纯class,所以均在script中进行注释。因项目中类较多,因此注释可简化为以下项: /**

FlexCell控件例子

FlexCell控件例子 FlexCell控件另一个比较强的特点是支持多种文件格式,这节我们来正式开始使用该控件。我做了个类似FlexCell控件自带演示程序的界面,使用CVI来使用实现该控件的所有操作。 1、添加菜单 从本节开始,我们将全面进行该控件的操作。菜单的制作方法我这里就不再说明,不知道的朋友可以参考我的视频教程,其中有菜单制作的所有过程。 2、格式说明 FlexCell控件支持自己格式的导入导出(.Cel)。XML文件的导入。EXCEL格式的导出,HTML格式的导出,XML格式的导出,CSV文件的导出。可以发现控件不能支持读取EXECL 文件是一个比较遗憾的地方。所有的这些功能控件都已经为我们封装好了函数,无需我们CVI来操心。 //新建文件 void CVICALLBACK NewFile (int menuBar, int menuItem, void *callbackData, int panel) { int Row,Colunm; //得到当前行列数 FlexCell__GridGetRows (FlexTable, NULL, &Row); FlexCell__GridGetCols (FlexTable, NULL, &Colunm); FlexCell__GridNewFile (FlexTable, NULL, NULL);

//设置行列数 FlexCell__GridSetRows (FlexTable, NULL, Row); FlexCell__GridSetCols (FlexTable, NULL, Colunm); } 函数名称大家可以自己修改。这个函数比较有用,当你的控件已经进行了大量的读取和赋值后此时如果要清除所有单元格中的数据我们上一节使用过这种方法: //设置为100行 FlexCell__GridSetRows (FlexTable, NULL, 101); //选择处理的行列范围 FlexCell__GridRange (FlexTable, NULL, 1, 1, 100, 10, FlexTableRange); //删除现有行 FlexCell__RangeDeleteByRow (FlexTableRange, NULL); //添加新的100行 FlexCell__GridSetRows (FlexTable, NULL, 101); 我们先心中当前所有的单元格,将它们删除,然后再添加同样的行数。这个方法在行列数多时会极大影响速度。现在我们使用控件提供的新建文件的方法来实现。 FlexCell__GridNewFile (FlexTable, NULL, NULL);这个函数不需要任何其它参数,给出控件的CA对象句柄即可。此时大家可以看到控件马上恢复为添加控件时初始状态。但是这样做会自己恢复为控件默认的5列10行。这和我们在CVI定义的100行10列不一样。每个用户也都有自己的初始数量。因此,我们在使用该函数前先得到下目前控件的行列数量,在新建文件后马上设置回来。这里的新建文件和WORD中新建文件是一样的,它之所以就像清除所有单元格是因为该控件是一个单文档界面,所以新建文件就等于清除了现在的内容直接显示为一个新的表格。在多文档形式中这样新建会出现一个新的窗口,当前的窗口内容没有变化。 //打开文件 void CVICALLBACK OpenedFile (int menuBar, int menuItem, void *callbackData, int panel) { FlexCell__GridOpenFile (FlexTable, NULL, "", NULL); } 该控件给我们高度封装了很多函数,我们后面使用的函数都是如此,这个打开文件的函数也不给任何参数,给了一个空字符串,函数定义如果给的是空字符串函数会自己先调用API 的打开文件对话框(CVI中函数为FileSelectPopup)电你选择好需要打开的文件后函数 自己处理将你选中的文件打开。省去了我们CVI打开文件的很多代码。当然你可以直接给

词法分析器flex中文手册

FLEX 中文手册 这是flex手册的部分中文翻译,仅供参考 ?一些简单的例子 ?输入文件的格式 ?模式 ?如何匹配输入 ?动作 ?生成的扫描器 ?开始条件 ?文件结尾规则 ?与yacc一起使用 一些简单的例子 首先给出一些简单的例子,来了解一下如何使用flex。下面的flex输入所定义的扫描器,用来将所有的“ username”字符串替换为用户的登陆名字: %% username printf("%s", getlogin()); 默认情况下,flex扫描器无法匹配的所有文本将被复制到输出,所以该扫描器的实际效果是将输入文件 复制到输出,并对每一个“username”进行展开。在这个例子中,只有一个规则。“username”是模式 (pattern),“printf”是动作(action)。“%%”标志着规则的开始。 这里是另一个简单的例子: int num_lines = 0, num_chars = 0; %% \n ++num_lines; ++num_chars; . ++num_chars; %% int main(void) { yylex(); printf("# of lines = %d, # of chars = %d\n", num_lines, num_chars);

} 该扫描器计算输入的字符个数和行数(除了最后的计数报告,并未产生其它输出)。第一行声明了两 个全局变量,“num_lines”和“num_chars”,可以在yylex()函数中和第二个“%%”后面声明的main()函数中 使用。有两个规则,一个是匹配换行符(“\n”)并增加行数和字符数,另一个是匹配所有不是换行符的 其它字符(由正规表达式“.”表示)。 一个稍微复杂点的例子: /* scanner for a toy Pascal-like language */ %{ /* need this for the call to atof() below */ #include %} DIGIT [0-9] ID [a-z][a-z0-9]* %% {DIGIT}+ { printf( "An integer: %s (%d)\n", yytext, atoi( yytext ) ); } {DIGIT}+"."{DIGIT}* { printf( "A float: %s (%g)\n", yytext, atof( yytext ) ); } if|then|begin|end|procedure|function { printf( "A keyword: %s\n", yytext ); } {ID} printf( "An identifier: %s\n", yytext );

FlexGrid控件的使用(三)

FlexGrid控件的使用(三) 时间:2007-05-05 定制标准区域的显示方式 Hierarchical FlexGrid标准区域的显示方式是可以定制的,这样提供给用户的信息将更加清晰、便于访问。标准区域中包含被绑定到数据的单元格。 要定制Hierarchical FlexGrid标准区域的显示方式 1. 单击Hierarchical FlexGrid,然后从快捷菜单中选择“属性”。出现Hierarchical FlexGrid的“属性页”对话框。 2. 在“通用”选项卡上,设置下列标准属性: 3. 在Style选项卡上,设置下列标准属性: 4.在Font选项卡上,设置下列标准属性:

5.单击“确定”,将标准属性应用于Hierarchical FlexGrid并关闭“属性页”对话框。 定制固定区域的显示方式 可以创建固定显示在Hierarchical FlexGrid中的行或者列。为了便于用户阅读,应该使用一个固定的区域来显示一个标头集合,而不是在每个带区中使用重复的列标头。该区域将是静态的,它标识了下面的行或者右边的列。 要定制Hierarchical FlexGrid的固定区域的显示方式 1. 单击Hierarchical FlexGrid,然后从快捷菜单中选择“属性”。出现Hierarchical FlexGrid的“属性页”对话框。 2. 在“通用”选项卡上,指定“固定行”和“固定列”文本框中各自的行数和列数,然后单击“应用”。 3. 在“样式”选项卡上,从“固定文本样式”框中为固定文本选择显示风格,然后单击“应用”。 4. 在“字体”选项卡中,设置下列标准属性: 5. 从“颜色”选项卡中,为每一个固定属性指定一个颜色。为此,首先需要选择一个“颜色设置”。然后,单击需要改变的属性(例如BackColorFixed),单击“调色板”中的一种颜色,最后单击“应用”。对需要改变的每一个固定区域重复上述操作。 注意如果使用了“Windows 缺省”颜色,那么Hierarchical FlexGrid中显示的颜色将是在“显示控制面板”中指定的颜色。除了将HierarchicalFlexGrid属性的颜色改变为标准的或Windows 缺省颜色之外,也可以创建自己的颜色定义(单击“Edit Custom Color”,使用随之弹出的“颜色”对话框。)关于每个属性的有关信息,请参阅HierarchicalFlexGrid的属性主题。 6. 单击“确定”,将固定属性应用于Hierarchical FlexGrid并关闭“属性页”对话框。 定制标头的显示方式 在Hierarchical FlexGrid中,可以改变带区标头的格式和显示属性。 要定制Hierarchical FlexGrid的标头显示方式 1. 右击Hierarchical FlexGrid,然后从快捷菜单中选择“属性”。出现Hierarchical FlexGrid的“属性页”对话框。 2. 在“带区”选项卡中,从“文本样式标头”框中选择一种标头样式,然后选择“ColumnHeaders”。注意为了防止Hierarchical FlexGrid显示重复的标头,必须在“通用”选项卡中将Fixed Row 文本框设置为0。此外,如果希望在HierarchicalFlexGrid的顶部只显示带区的一组标头,那么必须

相关主题