第一篇:Odoo(OpenERP)视图继承总结Odoo
Odoo(OpenERP)视图继承总结
ODOO支持的视图类型:form、tree、search...支持的定位方法:
支持的规则:before、after、replace、inside、attributes 插入:
position='before' position=“after”
position=“replace”
在预
手测
数数量>0“icon=”terp-accessories-archiver+“domain=”[('qty_available','>',0)]“/> 量>0”icon=“terp-accessories-archiver+”domain=“[('virtual_available','>',0)]”/> 内部创建:? position=“inside”
修改属性:修改属性能够实现的功能,不要使用replace position=“attributes”
在预
手测
数数量>0“icon=”terp-accessories-archiver+“domain=”[('qty_available','>',0)]“/> 量>0”icon=“terp-accessories-archiver+”domain=“[('virtual_available','>',0)]”/>
第二篇:oracle视图总结
oracle视图总结(转)
视图简介: 视图是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改。视图基于的表称为基表。视图是存储在数据字典里的一条select语句。通过创建视图可以提取数据的逻辑上的集合或组合。
视图的优点:
1.对数据库的访问,因为视图可以有选择性的选取数据库里的一部分。2.用户通过简单的查询可以从复杂查询中得到结果。3.维护数据的独立性,试图可从多个表检索数据。4.对于相同的数据可产生不同的视图。
视图的分类:
视图分为简单视图和复杂视图。
两者区别如下:
1.简单视图只从单表里获取数据,复杂视图从多表获取数据; 2.简单视图不包含函数和数据组,复杂视图包含; 3.简单视图可以实现DML操作,复杂视图不可以。
视图的创建:
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name [(alias[, alias]...)] AS subquery [WITH CHECK OPTION [CONSTRAINT constraint]] [WITH READ ONLY] 其中:
OR REPLACE:若所创建的试图已经存在,ORACLE自动重建该视图; FORCE:不管基表是否存在ORACLE都会自动创建该视图; NOFORCE:只有基表都存在ORACLE才会创建该视图: alias:为视图产生的列定义的别名;
subquery:一条完整的SELECT语句,可以在该语句中定义别名;
WITH CHECK OPTION : 插入或修改的数据行必须满足视图定义的约束; WITH READ ONLY : 该视图上不能进行任何DML操作。
例如: Sql代码
1.CREATE OR
REPLACE
VIEW dept_sum_vw
2.(name,minsal,maxsal,avgsal)
3.AS SELECT d.dname,min(e.sal),max(e.sal),avg(e.sal)
4.FROM
emp e,dept d
5.WHERE e.deptno=d.deptno
6.GROUP BY d.dname;
视图的定义原则:
1.视图的查询可以使用复杂的SELECT语法,包括连接/分组查询和子查询; 2.在没有WITH CHECK OPTION和 READ ONLY 的情况下,查询中不能使用 ORDER BY 子句;
3.如果没有为CHECK OPTION约束命名,系统会自动为之命名,形式为SYS_Cn;4.OR REPLACE选项可以不删除原视图便可更改其定义并重建,或重新授予对象权限。
查询视图:
视图创建成功后,可以从视图中检索数据,这点和从表中检索数据一样。示例:
SQL>SELECT * FROM dept_sum_vw;
修改视图:
通过OR REPLACE 重新创建同名视图即可。
删除视图:
DROP VIEW VIEW_NAME语句删除视图。删除视图的定义不影响基表中的数据。
只有视图所有者和具备DROP VIEW权限的用户可以删除视图。视图被删除后,基于被删除视图的其他视图或应用将无效。
查询视图定义:
SELECT view_name,text from user_views;其中text显示的内容为视图定义的SELECT语句,可通过DESC USER_VIEWS 得到相关信息。
视图上的DML 操作: DML操作应遵循的原则:
1.简单视图可以执行DML操作; 2.在视图包含GROUP 函数,GROUP BY子句,DISTINCT关键字时不能删除数据行; 3.在视图不出现下列情况时可通过视图修改基表数据或插入数据:
a.视图中包含GROUP 函数,GROUP BY子句,DISTINCT关键字; b.使用表达式定义的列; c.ROWNUM伪列。
d.基表中未在视图中选择的其他列定义为非空且无默认值。WITH CHECK OPTION 子句
通过视图执行的INSERTS和UPDATES操作不能创建该视图检索不到的数据行,因为它会对插入或修改的数据行执行完整性约束和数据有效性检查。(也就是说在执行INSERTS、UPDATES时,WHERE条件中除需要INSERT、UPDATE本身的限制条件之外,还需要加上视图创建时的WHERE条件。)
例如:
CREATE OR REPLACE VIEW vw_emp20 AS SELECT * FROM emp WHERE deptno=20 WITH CHECK OPTION constraint vw_emp20_ck;视图 已建立。
查询结果:
SELECT empno,ename,job FROM vw_emp20;EMPNO
ENAME
JOB---------------------
--------------
-------------7369
SMITH
CLERK 7566
JONES
MANAGER 7902
FORD
ANALYST 修改:
UPDATE vw_emp20 SET
deptno=20 WHERE empno=7902;将产生错误:
UPDATE vw_emp20 * ERROR 位于第一行:
ORA-01402:视图WITH CHECK OPTION 违反WHERE 子句
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1,Oracle是可以通过视图来修改Base table的。所谓base table就是用来构建视图的表,也就是视图的数据来源表。但是这种修改是有条件的。比如: create view v_emp as select empno,ename,job,deptno from emp where deptno=10 with check option constraint emp_cnst;如果有这个限制,那么通过视图v_emp 插入数据的deptno字段的值必须是10,否则就会报“ORA-01402: 视图 WITH CHECK OPTIDN 违反 where 子句”的异常。
2,联结视图:
create view dept1_staff as select e.ename, e.empno, e.job, d.deptno, d.dname from emp e,dept d where e.deptno in(10,30)and e.deptno = d.deptno; 将两个表的数据联结起来,看起来应该是一个内联结(Inner joint)。
对于联结视图(Joint view)的修改规则稍显复杂,设计到所谓key_preserved table的概念。通过联结视图来修改基表,只有那些key_preserved 的表才能被修改。上述创建视图语句中emp和dept通过deptno进行联结构成视图时,emp就是key_preserved 表,而dept不是。为什么?因为在dept1_staff 中empno的值唯一的而deptno不是唯一的。所以emp是key_preserved 而dept不是。因此只能通过该视图来修改emp,而不能修改dept的数据。
3,Oracle视图非常强大的功能之一在于其可以创建一个带有错误的视图。比如说视图里的字段在基表里不存在,该视图仍然可以创建成功,但是非法的且无法执行。当基表里加入了该字段,或者说某个字段修改成视图里的该字段名称,那么视图马上就可以成为合法的。这个功能很有意思。例子:
创建基表: create table v_test(name varchar2(32),age number(12));创建带错误的视图:
create force view view_test as select name,age,address from v_test;(注意加上force选项)
由于address字段在v_test里不存在,所以会报warning: View created with compilation errors的警告,而且执行select * from view_test;时会报“ORA-04063: view “SCOTT.VIEW_TEST” 有错误”的异常。但是如果在v_test里加上address字段,那么视图就会合法。对基表进行修改:
alter table v_test add(address varchar2(128));
现在再执行select * from view_test;就会执行成功了。
from:http://www.blogjava.net/jinhualee/archive/2006/07/14/58115.html
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
其他问题总结:
1、视图上是否可以创建索引?
一般视图上不用建立索引,对视图的操作最终会转化为对表的操作。一个讨论:http://www.itpub.net/viewthread.php?tid=150019&extra=&page=1
第三篇:UML九种视图总结
1.UML关系
UML类图中的关系分为四种:泛化关系、依赖关系、关联关系、实现关系;关联关系又可以细化为聚合和组合。
1.1 泛化(Generalization)泛化是父类和子类之间的关系,子类继承父类的所有结构和行为。在子类中可以增加新的结构和行为,也可以覆写父类的行为。
1.2.依赖(Dependencies)
依赖关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的事物,反之不成立。在你想显示一个事物使用另一个事物时使用,两个元素之间的一种关系,其中一个元素(服务者)的变化将影响另一个元素(客户),或向它(客户)提供所需信息。它是一种组成不同模型关系的简便方法。依赖表示两个或多个模型元素之间语义上的关系。它只将模型元素本身连接起来而不需要用一组实例来表达它的意思。它表示了这样一种情形,提供者的某些变化会要求或指示依赖关系中客户的变化。
根据这个定义,关联和泛化都是依赖关系,但是它们有更特别的语义,故它们有自己的名字和详细的语义。我们通常用依赖这个词来指其他的关系。依赖用一个从客户指向提供者的虚箭头表示,用一个构造型的关键字来区分它的种类,通常情况下,依赖关系体现在某个类的方法使用另一个类作为参数。
1.3.关联(Association)
关联是一种结构化的关系,指一种对象和另一种对象有联系。给定有关联的两个类,可以从一个类的对象得到另一个类的对象。
类与类之间由弱到强关系是: 没关系 > 依赖 > 关联 > 聚合 > 组合。
类和类之间八竿子打不着那就是没关系,这个没啥歧义。依赖(dependency)
可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、、临时性的、非常弱的,但是B类的变化会影响到A;比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖;表现在代码层面,为类B作为参数被类A在某个method方法中使用。用带虚线的箭头。
关联(association)
他体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的、关联可以是单向、双向的;表现在代码层面,为被关联类B以类属性的形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量;
依赖和关联区别:我用锤子修了一下桌子,我和锤子之间就是一种依赖,我和我的同事就是一种关联。依赖是一种弱关联,只要一个类 用到另一个类,但是和另一个类的关系不是太明显的时候(可以说是“uses”了那个类),就可以把这种关系看成是依赖,依赖也可说是一种偶然的关系,而不是必然的关系。关联是类之间的一种关系,例如老师教学生,老公和老婆这种关系是非常明显的。依赖是比较陌生,关联是我们已经认识熟悉了。
1.3.1 聚合(Aggregation)
聚合是一种特殊的关联。它描述了“has a”关系,表示整体对象拥有部分对象。
关联关系和聚合关系来语法上是没办法区分的,从语义 上才能更好的区分两者的区别。聚合是较强的关联关系,强调的是整体与部分 之间的关系。
与关联关系一样,聚合关系也是通过类的成员变量 来实现的。
1.3.2 组合(Composition)
组合是聚合的一种形式,它具有更强的拥有关系,强调整体与部分的生命周期 是一致的。整体负责部分的生命周期的管理。如果整体被销毁,部分也必须跟着一起被销毁,如果所有者被复制,部分也必须一起被复制。
与关联关系一样,组合关系也是通过类的成员变量 来实现的。
1.4.实现(Realization)
实现关系指定两个实体之间的一个合约。换言之,一个实体定义一个 合约,而另一个实体保证履行该 合约。
1.5 扩展关系(extends)1.6 包含(include)
1.7 精化关系(refine)UML视图
说明:
构件事物是名词,是模型的静态部分。行为事物是动态部分,表示行为。分组事物是组织部分。注释事物是解释部分。
依赖:一个事物变化会引起另一个事物变化。聚集:特殊的关联,描述整体与部分的组合关系。
泛化:是一种特殊与一般的关系,如子元素(特殊)与父元素(一般),箭头指向父元素。实现:类元之间的关系,其中一个类元指定了由另一个类元保证执行的契约。一般用在接口和实现他们的类之间或用例和实现它们的协作之间。
2.1 类图
用于展现系统中的类以及其之间的关系
对象图:显示了单独的对象及其关系。对象图有助于记录测试用例以及讨论用例。
•静态图:包括类图和对象图。
类图描述系统中类的静态结构,不仅定义系统中的类,表示类之间的联系,如关联、依赖、聚合等,也包括类的属性和操作,类图描述的是一种静态关系,在系统的整个生命周期都是有效的。
对象图是类图的实例,几乎使用与类图完全相同的标识。一个对象图是类图的一个实例。由 于对象存在生命周期,因此对象图只能在系统某一时间段存在。2.1.1 包
包可直接理解为命名空间,文件夹,是用来组织图形的封装,包图可以用来表述功能组命名空间的组织层次。
•在面向对象软件开发的视角中,类显然是构建整个系统的基本构造块。但是对于庞大的应用系统而言,其包含的类将是成百上千,再加上其间“阡陌交纵”的关联关系、多重性等,必然是大大超出了人们可以处理的复杂度。这也就是引入了“包”这种分组事物构造块。•包的作用是:
1)对语义上相关的元素进行分组; 2)定义模型中的“语义边界”; 3)提供配置管理单元;
4)在设计时,提供并行工作的单元;
5)提供封装的命名空间,其中所有名称必须惟一
上图解释
•首先根据《use》关系,可以发现Client包使用Server包,Server包使用System.Data.SqlClient包,结合其元素,不难得知Client负责Order(订单)的输入,并通过Server来管理用户的登录(LoggingService)和数据库存储(DataBase),而Server包还将通过.NET的SQL Server访问工具包来实现与数据库的实际交互。•接着再看两个《import》,从包的命名和其所属的元素不难发现Rule负责处理一些规则,并引用一个具体的窗体(Window),而Client包则通过引用Rule来实现整个窗体和表单的显示、输入等。并且还将暂存Order(订单)信息。•最后来看包的泛化关系,GUI有两个具体实现,一个是针对C/S的WindowsGUI,一个是实现B/S的WebGUI。依赖关系
•《use》使用关系:是一种默认的依赖关系,说明客户包(发出者)中的元素以某种方式使用提供者包(箭头指向的包)的公共元素,也就是说客户包依赖于提供者包
•《import》引用关系:最普遍的包依赖类型,说明提供者包(箭头指向的包)的命名空间(包本身代表命名空间)将被添加到客户包(发出者)的命名空间中,客户包中的元素也能够访问提供者包的所有公共元素
•《access》访问关系:只想使用提供者包中的元素,而不想将其命名空间合并则应使用该关系
•《trace》追溯关系:想表示一个包到另一个包的历史发展,则需要使用《trace》关系来表示
例子描述
•分析系统工作流程:
1)通过Internet连接到股票信息服务器,获取实时的股票信息,并存入数据库中。2)根据用户的输入和选择,从数据库中获取相应的信息,展现在屏幕中。3)在数据的展现过程中,将需要绘制大量的图表 •根据功能模块组织包:
包之间的依赖关系
2.2 状态图
展示了一个状态机,由状态、转换、事件和活动组成。强调事件行为的顺序。如下图(摘自网络):
2.2.1 事件
事件是指某个时刻发生的事情。
信号是指从一个对象到另一个对象的明确的单向信号流动。
信号事件:是指发送或者接受信号的事件。
区别:信号是对象间的消息,而信号事件是指某个时刻发生的事情。
变更事件:是指满足布尔表达式而引起的事件。
时间事件:是指在绝对时间上或者在某个时间间隔内发生的事情而引起的事件。
2.2.2 状态
是对象取值和链接的抽象。根据对象的总体行为,将取值和链接的集合组成一个状态。
事件表示时间点,状态表示时间段。
2.2.3 迁移
是指从一种状态到另一种状态的瞬时变化。
2.2.4 电话状态图
2.2.5 活动 2.2.6 增加了活动的电话状态图 2.2.7 嵌套状态图
嵌套状态
2.3 用例图
描述一组用例、参与者以及它们之间的关系,其展示的是该系统在它 的外面环境中所提供的外部可见服务
2.3.1 用例中的包含
包含关系:使用包含(Inclusion)用例来封装一组跨越多个用例的相似动作(行为片断),以便多个基(Base)用例复用。基用例控制与包含用例的 关系,以及被包含用例的事件流是否会插入到基用例的事件流中。基用例可以依赖包含用例执行的结果,但是双方都不能访问对方的属性。2.3.2 扩展
将基用例中一段相对独立并且可选的动作,用扩展(Extension)用例加以封装,再让它从基用例中声明的扩展点(Extension Point)上进行扩展,从而使基用例行为更简练和目标更集中。扩展用例为基用例添加新的行为。扩展用例可以访问基用例的属性,因此它能根据基用例中扩展点的当前状态来判断是否执行自己。但是扩展用例对基用例不可见。
2.3.3 泛化
泛化关系:子用例和父用例相似,但表现出更特别的行为;子用例将继承父用例的所有结构、行为和关系。子用例可以使用父用例的一段行为,也可以重载它。父用例通常是抽象的。在实际应用中很少使用泛化关系,子用例中的特殊行为都可以作为父用例中的备选流存在。2.3.4 实例
2.4 交互图
场景是指系统在某个特定的执行期内发生的一系列事件。
包括序列图(顺序图)和协作图,两者对应,顺序图是强调消息时间顺序,有对象生命线和控制焦点。
协作图是强调接收和发送消息的对象的结构组织,有路径和顺序号
交互图强调的是对象到对象的控制流,而活动图则强调的是从活动到活动的控制流
•活动图是一种表述过程基理、业务过程以及工作流的技术。它可以用来对业务过程、工作流建模,也可以对用例实现甚至是程序实现来建模
2.4.1 顺序图
显示了交互的参与者以及参与者之间的消息顺序。也显示了系统为了执行全部或部分用例而与参与者的交互。
2.4.2 活动图
显示了组成复杂过程的步骤序列。
活动图的主要元素
•初始节点和活动终点:用一个实心圆表示初始节点,用一个圆圈内加一个实心圆来表示活动终点
•活动节点:是活动图中最主要的元素之一,它用来表示一个活动
•转换:当一个活动结束时,控制流就会马上传递给下一个活动节点,在活动图中称之为“转换”,用一条带箭头的直线来表示 活动图的主要元素
•分支与监护条件:分支是用菱形表示的,它有一个进入转换(箭头从外指向分支符号),一个或多个离开转换(箭头从分支符号指向外)。而每个离开转换上都会有一个监护条件,用来表示满足什么条件的时候执行该转换。
•分岔与汇合:
修改后的简单活动图
带泳道的活动图
带对象流的活动图 复杂活动图 •辅助活动图:
•汇合描述:当汇合的所有入流均到点汇合点时,就将执行汇合点指向的活动节点。但是有些时候,你希望对其做一些约束,这时就可以借助汇合描述来完成。汇合描述实际上是一个约束,其格式就是“{约束条件}”。•发送信号与接收信号:
•如何绘制活动图 绘制活动图
•“活动图” 比较直观易懂;与传统的流程图十分的相近,只要能够读懂活动图,就不难画出活动图
•绘制时首先决定是否采用泳道:主要根据活动图中是否要体现出活动的不同实施者 •然后尽量使用分支、分岔和汇合等基本的建模元素来描述活动控制流程
•如果需要,加入对象流以及对象的状态变化,利用一些高级的建模元素(如辅助活动图、汇合描述、发送信号与接收信号、引脚、扩展区)来表示更多的信息
•活动图的建模关键是表示出控制流,其它的建模元素都是围绕这一宗旨所进行的补充 工作流程,控制流程,业务流程中使用。
• •活动图应用说明
活动图应用说明
•对工作流建模:用于业务建模的时候,每一条泳道表示一个职责单位,该图能够有效地体现出所有职责单位之间的工作职责,业务范围及之间的交互关系、信息流程 建模时应遵循以下策略: •为工作流建立一个焦点,除非你所涉及的系统很小,否则不可能在一张图中显示出系统中所有的控制流
•选择对全部工作流中的一部分有高层职责的业务对象,并为每个重要的业务对象创建一条泳道
•识别工作流初始节点的前置条件和活动终点的后置条件,这可有效地实现对工作流的边界进行建模。
•从该工作流的初始节点开始,说明随时间发生的动作和活动,并在活动图中把它们表示成活动节点
•将复杂的活动或多次出现的活动集合归到一个活动节点,并通过辅助活动图或子活动图来表示它们
•找出连接这些活动节点的转换,首先从工作流的顺序开始,然后考虑分支,接着再考虑分岔和汇合
•如果工作流中涉及重要的对象,则也可以将它们加入到活动图中 •若工作流中有多次启用的,则可采用展开区表示
•对操作建模:每一个对象占据一个泳道,而活动则是该对象的成员方法 •建模时应遵循以下策略:
--收集操作所涉及的抽象概念,包括操作的参数、返回类型、所属类的属性以及某些邻近的类
--识别该操作的初始节点的前置条件和活动终点的后置条件。也要识别在操作执行过程中必须保持的信息
--从该操作的初始节点开始,说明随着时间发生的活动,并在活动图中将它们表示为活动节点
--如果需要,使用分支来说明条件语句及循环语句
--仅当这个操作属于一个主动类时,才在必要时用分岔和汇合来说明并行的控制流程 构件图
2.5 构件图
类是最基础的“模块化”元素,它封装了属性和成员的方法,就像是物理世界中的“分子”。但是,对于复杂的软件系统而言,往往拥有成百上千的各种类。因此,类的粒度太小了,引入更粗的粒度的概念—“构件”
构件是系统中可替换的物理部分,它包装了实现而且遵从并提供一组接口的实现。通俗的说,构件是系统设计的一个模块化元素,它隐藏了内部的实现,对外提供一组外部接口。在系统中,满足相同接口的组件可以自由地替换。
1、构件的表示方法
和类的名称相近,构件的名称也是一个正文字符串,它可以是简单名,也可以是带路径的全名。
2、构件图实例:
2.6 部署图
1、部署图描述了一个系统运行时的硬件节点,在这些节点上运行的软件构件将在何处物理运行以及它们将如何彼此通信的静态视图。
部署图包括两种基本模型元素:节点和节点间的连接。每个模型中,仅包含一个部署图。节点包括两种类型:处理器和设备。
处理器指本身具有计算能力且能执行各各软件的节点,如服务器。
处理器具有处理能力,所以在描述处理器方面应当包含了处理器的调度和进程。
调度指在处理器处理其进程中为实现一定的目的而对共同使用的资源进行时间分配。调度方式包含:抢占,无优先级,循环,算法控制,手动执行。进程表示一个单独的控制纯种,是系统中一个重量级的并发和执行单元。
设备指本身不具备处理能力的节点,如打印机。
连接用来表示两个节点之间的硬件连接。节点之间的连接可以通过光缆直接进行,或通过卫星等方式非直接连接,通常连接都是双向的。连接用实线表示,实线上可加连接名和构造型。
系统开发人员和部署人员可以利用部署图去了解系统的物理运行情况。如果,开发的软件系统只需在一台计算机上运行,且使用的标准设备,则不需要为它画出系统部署图。部署图只需要给那些复杂的物理运行情况进行建模。
部署图显示了系统的硬件,安装在硬件上的软件,用于连接硬件的各种协议和中间件等。
2、部署模型的目的:
描述一个具体应用的主要部署结构,通过对各种硬件,在硬件中的软件以及各种连接协议的显示,可以很好的描述系统是如何部署的;平衡系统运行时的计算资源分布;可以通过连接描述组织的硬件网络结构或者是嵌入式系统等具有多种硬件和软件相关的系统运行模型。
3、部署图实例:
第四篇:MFC视图切换全总结
MFC视图切换全总结
交流的朋友请加我QQ:451072182 我的百度空间:http://hi.baidu.com/%BB%B6stephen/home 单纯视图之间的切换
单文档多视图切换是我在学习MFC中遇到的一个老大难问题,在今天总算是一一破解了。我觉得视图切换分为三个等级,第一是在未切分窗格的情况下切换视图类;第二是在分割窗格的一个窗格内实行视图切换;第三是在分割窗格和未分割之间的切换和视图切换。
在MFC创建SDI的伊始,MFC默认的视图类是CView,如果CView满足你的需求,可以直接单击finish,如果你不想让CView成为你的默认视图类,你可以在下图这个地方修改。
如果你忘记了修改默认的视图类这也没关系,我们可以在代码中改变: 在App类里面有个函数叫InitInstance(),在这里面有一段代码
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(Cprogram8Doc),RUNTIME_CLASS(CMainFrame),RUNTIME_CLASS(CView1));
//这里更改你的默认视图类,注意不要忘记包含头文件哦
if(!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
说完了默认视图类的更改,我们现在进入主题。
1、首先创建你需要切换的视图类,AddClass进入或者创建一个控件然后AddClass创建控件关联类,后者适用于Form之类的控件。
2、控制之处,比如菜单项单击、单击鼠标什么的,我是使用菜单项来切换窗口的
void CMainFrame::OnView1(){
// TODO: Add your command handler code here
SwitchToForm(IDD_FORMVIEW1);}
void CMainFrame::OnView2(){
// TODO: Add your command handler code here
SwitchToForm(IDD_FORMVIEW2);}
3、SwitchToForm这个函数主要用于视图切换 在这个函数中主要做以下几个动作:
1、获得当前视图类指针和需要转换的视图类指针,如果是第一次使用需要New一个,并且与文档类关联;
2、改变活动视图;
3、显示新视图和隐藏旧视图;
4、设置控件ID;
5、调整框架视图。
void CMainFrame::SwitchToForm(int nForm){
CView *pOldActiveView=GetActiveView();
//1
CView *pNewActiveView=(CView*)GetDlgItem(nForm);
if(NULL==pNewActiveView)
{
switch(nForm)
{
case IDD_FORMVIEW1:
pNewActiveView=(CView*)new CView1;
break;
case IDD_FORMVIEW2:
pNewActiveView=(CView*)new CView2;
break;
case IDD_FORMVIEW3:
pNewActiveView=(CView*)new CView3;
break;
case IDD_FORMVIEW4:
pNewActiveView=(CView*)new CView4;
break;
default:
break;
}
CCreateContext context;
context.m_pCurrentDoc=pOldActiveView->GetDocument();
pNewActiveView->Create(NULL,NULL,WS_CHILD | WS_BORDER,CFrameWnd::rectDefault,this,nForm,&context);
pNewActiveView->UpdateData();
}
SetActiveView(pNewActiveView);
//2
pNewActiveView->ShowWindow(SW_SHOW);
//
3pOldActiveView->ShowWindow(SW_HIDE);
if(pOldActiveView->GetRuntimeClass()==RUNTIME_CLASS(CView1))
//4
pOldActiveView->SetDlgCtrlID(IDD_FORMVIEW1);
else if(pOldActiveView->GetRuntimeClass()==RUNTIME_CLASS(CView2))
pOldActiveView->SetDlgCtrlID(IDD_FORMVIEW2);
else if(pOldActiveView->GetRuntimeClass()==RUNTIME_CLASS(CView3))
pOldActiveView->SetDlgCtrlID(IDD_FORMVIEW3);
else if(pOldActiveView->GetRuntimeClass()==RUNTIME_CLASS(CView4))
pOldActiveView->SetDlgCtrlID(IDD_FORMVIEW4);
pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
RecalcLayout();//5 }
在看网上其他人的帖子的时候发现在RecalcLayout();前面还要加一句delete pOldActiveView;我自己觉得这样有些浪费资源,视图类创建完成了隐藏起来,用的时候重新显示。这样的方法应该比每次使用都要创建好一些。小弟不才,有讨论的朋友可以联系我。带有分割窗格的视图切换
切换视图第二层就是带有分割窗格的视图切换
分割窗格的视图切换,我觉得难点是不容易在有限区域进行视图切换。
1、首先分割窗格,这里我不多解释,详情看下面链接;
2、再给每个视图一个唯一的ID号;
m_splitter.CreateStatic(this,1,2);
m_splitter.CreateView(0,0,RUNTIME_CLASS(CTree1),CSize(100,100),pContext);
m_splitter.CreateView(0,1,RUNTIME_CLASS(CForm1),CSize(100,100),pContext);
CWnd *pWnd=m_splitter.GetPane(0,1);
m_pViews[0]=(CView*)m_splitter.GetPane(0,1);
pWnd->SetDlgCtrlID(IDD_FORM1);
pWnd->ShowWindow(SW_HIDE);
m_splitter.CreateView(0,1,RUNTIME_CLASS(CForm2),CSize(100,100),pContext);
pWnd=m_splitter.GetPane(0,1);
m_pViews[1]=(CView*)m_splitter.GetPane(0,1);
pWnd->SetDlgCtrlID(m_splitter.IdFromRowCol(0,1));
pWnd->ShowWindow(SW_SHOW);
RedrawWindow();
return true;
注:我这里CreateView一个新视图,就覆盖掉前一个视图,最终显示的是最后一个视图,前面的视图只是隐藏起来,等到使用的时候显示出来就好了。返回值要覆盖返回到基类的语句
return CFrameWndEx::OnCreateClient(lpcs, pContext);将这句话注解,然后return true;
3、在哪里激活切换功能自己设计,我使用的是菜单;
4、响应主要包括下面几个步骤:
1、首先获得窗格中的当前视图;
2、使用IsKindOf判断这个类是否是将要切换到的类;
3、获得框架长宽和窗格长宽;
CView *pView=(CView*)m_splitter.GetPane(0,1);
//1
m_bTest=pView->IsKindOf(RUNTIME_CLASS(CForm2));
//
2CRect rcFrame,rcClient;
//3
m_splitter.GetClientRect(&rcClient);
GetClientRect(&rcFrame);
上面的全部是准备工作,下面才是真正的切换;
4、删除原有视图
5、创建当前视图
6、调整框架
if(m_bTest)
{
m_splitter.DeleteView(0,1);
m_splitter.CreateView(0,1,RUNTIME_CLASS(CForm1),CSize(rcClient.Width(),rcFrame.Height()),NULL);
m_splitter.RecalcLayout();
}
else
{
m_splitter.DeleteView(0,1);
m_splitter.CreateView(0,1,RUNTIME_CLASS(CForm2),CSize(rcClient.Width(),rcFrame.Height()),NULL);
m_splitter.RecalcLayout();
}
仔细一看,貌似这个还要比单纯视图切换还要简单一些,这也没办法,CSplitterWnd提供了这么一个便捷的方法。
带分割视图与未分割视图之间的切换
这个是三部曲中我认为最难的,并不是说程序有多么难,只是想到这个切分方式真的不容易,今天就把这三部曲的最后一曲分享给大家,也为互联网做一点贡献。
首先说一下程序的思想,为分割窗口层专门独立创建一个基于CFrameWnd的类,然后在这里面写分割视图的代码,再与其他未分割的视图类进行切换。
下面我们来看一下实现的过程:
1、创建一个基于CFrameWnd的派生类CSplitterFrame;
2、添加要填充分割窗口的视图类和与分割视图切换的视图类;
3、为这个派生类重载OnCreateClient函数,构造分割视图
m_Splitter.CreateStatic(this,1,2);
m_Splitter.CreateView(0,0,RUNTIME_CLASS(CLeftTree),CSize(300,0),pContext);
m_Splitter.CreateView(0,1,RUNTIME_CLASS(CRightList),CSize(300,0),pContext);return true;这里我不解释了,想必大家都很熟悉了,这里我要说一点我自己犯过的错误。我本来想在这里GetClientRect获得窗口大小,但失败了,左思右想不明白,后来才发现,这又不是CMainFrame,所以根本不能获得,要是用API函数。
4、在CMainFrame类里面添加框架和视图类指针变量
CSplitterFrame *m_pSplitterFrame;
//分割视图框架指针
CView *m_pView;
//单独视图类,基于CView类
CView *m_pForm;
//单独视图类,基于CFormView类
int m_nCurrentID;
//记录当前视图
5、在CMainFrame类里面重载OnCreateClient函数,创建视图及分割框架
CRect rcClient;GetClientRect(&rcClient);m_pView=new CViewShow;m_pView->Create(NULL,NULL,AFX_WS_DEFAULT_VIEW &~WS_BORDER,rcClient,this,NULL,pContext);m_pView->ShowWindow(SW_SHOW);m_pView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);pContext->m_pNewViewClass=(CRuntimeClass*)m_pView;
//设置默认视图类
m_pForm=new CFormShow;m_pForm->Create(NULL,NULL,AFX_WS_DEFAULT_VIEW &~WS_BORDER,rcClient,this,IDD_FORMSHOW,pContext);m_pForm->ShowWindow(SW_HIDE);m_pSplitterFrame=new CSplitterFrame;m_pSplitterFrame->Create(NULL,NULL,AFX_WS_DEFAULT_VIEW &~WS_BORDER,rcClient,this,NULL,0,pContext);m_pSplitterFrame->ShowWindow(SW_HIDE);return true;
6、创建视图切换函数
bool CMainFrame::Switch(int nID){ if(nID==m_nCurrentID)
return false;switch(nID){ case IDD_FORMSHOW:
m_pForm->ShowWindow(SW_SHOW);
m_pForm->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
m_pView->ShowWindow(SW_HIDE);
m_pView->SetDlgCtrlID(AFX_IDW_PANE_FIRST+2);
m_pSplitterFrame->ShowWindow(SW_HIDE);
m_pSplitterFrame->SetDlgCtrlID(AFX_IDW_PANE_FIRST+1);
m_nCurrentID=IDD_FORMSHOW;
break;case AFX_IDW_PANE_FIRST+1:
m_pSplitterFrame->ShowWindow(SW_SHOW);
m_pSplitterFrame->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
m_pForm->ShowWindow(SW_HIDE);
m_pForm->SetDlgCtrlID(IDD_FORMSHOW);
m_pView->ShowWindow(SW_HIDE);
m_pView->SetDlgCtrlID(AFX_IDW_PANE_FIRST+2);
m_nCurrentID=AFX_IDW_PANE_FIRST+1;
break;case AFX_IDW_PANE_FIRST+2:
m_pView->ShowWindow(SW_SHOW);
m_pView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
m_pForm->ShowWindow(SW_HIDE);
m_pForm->SetDlgCtrlID(IDD_FORMSHOW);
m_pSplitterFrame->ShowWindow(SW_HIDE);
m_pSplitterFrame->SetDlgCtrlID(AFX_IDW_PANE_FIRST+1);
m_nCurrentID=AFX_IDW_PANE_FIRST+2;
break;default:
break;} RecalcLayout();return true;}
7、创建调用方法
void CMainFrame::OnForm(){ // TODO: Add your command handler code here Switch(IDD_FORMSHOW);} void CMainFrame::OnView(){ // TODO: Add your command handler code here Switch(AFX_IDW_PANE_FIRST+2);} void CMainFrame::OnSplitter(){ // TODO: Add your command handler code here Switch(AFX_IDW_PANE_FIRST+1);}
第五篇:张继承技能人才总结
张继承技能人才总结
我叫张继承,是分公司机车车间水管班一名班长,从事的是内燃机车水管路系统的检修与组装。工种是内燃钳工。
本人自聘为技能人才以来,认真学习专业知识,充分发挥自己的积极性和主观能动性,努力把学习的技术知识融入到自己的工作中,力求以自己的实际行动来实现自身价值,全面提高自己的综合素质和实际工作能力。通过几年的工作实践,自己在各方面都取得了一定的进步,现将自己聘为技能人才以来的工作情况总结如下:
一、不断学习,提高个人修养
“活到老,学到老”这句话是我的座右铭。科学技术不断发展的今天,一天不学,就被落后。特别是机车修理这一块,没有谁能百分百的什么都精通,它是不断地在开发在更新,所以我平时只要有时间就多看看专业书籍。这些年来,我搜集了大量的新的相关专业书籍资料,不断地充实自己,不断地掌握新知。例如:《电焊工基础》《液压传动与维修》《CAD制作》《金属工艺与热处理》等等,在学习这些知识的过程中,我学到了很多新的知识。2012年4月至5月在洛阳技师学校参加南车集团组织的钳工技师提高班。2013年1月至3月在襄阳铁路学校参加分公司组织的多能工电焊工培训班。在学习中使我受益匪浅,不仅拓宽了我的知识面,还在很大程度上提高了我的技术水平,也使我对更高层次的理论及技术知识的学习产生了浓厚的兴趣。在工作之余,积极指导班组员工工作和相关专业知识的学习。为班
组培养多能工。管路的组装和电气焊是紧密相连不可分离的,在工作中经常使用。带领员工学习电焊工基础知识。能够更快、更好的去完成工作。
二、踏实工作,攻克难关
我们公司承修的8B型内燃机车,在后工序或机车回段后反馈。可曲挠橡胶球接头组装错位,造成可曲挠胶管裂漏。特别是乌局乌段的3台8B型机车,大热交换器出口水管与冷却器球接头水管软连接错位严重,派人到段处理。在此之前,内燃机车油水管路系统采用的可曲挠像胶接头组装技术要求为厂家试验标准,而铁标无具体要求。在装车时,我们操作完全按照厂家提供的技术标准,但在机车动态运行中易出现裂漏现象。虽然大热交换器与冷却器连接部件不多,但工序比较复杂,在生产作业操作过程中比较困难。我带领班组有经验的员工和班组技术郭镇勃经过错位反复研究与试验,总结出一套正确的错位消除法。生产中较好的解决了错位问题。经过一些机车的调整安装,厂内外由于单双球错位引起的质量事故大大减少,出厂发生变形的引起裂漏没再发生。
为适应市场需求,我们公司也在不断的在开发新车型。在新车型的开发过程中,我作为一名班组的技术骨干,积极指导班组员工工作。首先要把班组很多相关的准备工作做好,才能更好的带动大家完成各项工作。2013年8月,我公司承揽的0035号的DF10DD机车,是我们公司新开发的车型。从机车到厂后看车——拍照(留第一手资料)——给员工讲解水系统工作原理。机车上台位后检修管
路——查看照片——给员工讲解水系统工作原理——管路检修组装——水系统试压——落成检验一次过关。从机车进厂到各检修、组装、试验、一步一个“钉子”,紧盯着不放,每一项工作都落实到位。从落成、返修、试验、出厂,可以说干的是一台三“无”产品车,无返修票,无泄漏,无质量事故,圆满的完成了班组的各项工作任务。
对于乌局的8B型机车暖风机的加装,其他厂有过加装的图纸,但对于他们的加装,车间技术组给与否定,因为有很多不足和缺陷问题存在。工厂下发的技术图纸及要求,在工作中基本无法完成,其原因有二:
1、原车加装了单元式滤清器;管路基本无法通过动力间;
2、管路在电气间的走向不规范,一旦管路有泄漏就容易造成电器及线路烧损或短路现象。车间技术也给予了否定。车间技术组给出要求让班组拿出方案。要求
一、管路走向要美观。要求
二、管路走向要合理、规范。要求
三、管路走向要暗线不能走明线。要求
四、节点要保证。
我利用星期
六、日两天时间,在车上量尺寸,比长度,算结果,并很快拿出了方案:
1、管路的走向从车体左侧地板下走,把制动系统管路外移,暖水管并行;
2、从Ⅰ机到Ⅱ机管路用单管串联的方法,连接热风机;
3、进水口从主发高温水管处取口,从高温水泵前取回水口;
4、为不影响司机室后墙手制动的情况下,热风机的高度不超过80cm,离后墙不超过20cm;
5、管路使用管径为32的管子。
方案提出后技术组通过实地测量和比对,肯定了我的方案,在后面的工作中,虽然工作量及难度很大,但还比较顺利,最后通过试验,达到各项技术要求。
三、小创意,解决大困难
作为企业,要与时俱进,就要用积极的态度进行挖潜工作,靠思路创新、技术创新、管理创新和措施创新。当然,这些创新不只是指从国外引进的先进设备,也不只是科技人员研制技术含量高的新产品,它更包含企业员工的小攻关、小发明、小设计、小改革、小节约、小回收、小维修、小建议等等。因为,企业员工的小改小革,对于节能降耗、增收节支,甚至将科技成果转化成生产力等方面都有很大的作用。“小改小革”在企业中所取得的成就。就我公司而言,近几年来,结合公司的实际状况,我公司仅仅依靠科技进步和创新,不断进行各项“小改小革”,已大大提高了经济效益,同时也获得了很好的现场效益。
思路来源于现场,产物服务于现场。分公司在2013年8月份修车28台,9月份修车首次突破30台车,在落成区几乎没有耽误节点。在以往月修20台车到落成区动作试验几乎忙的是不亦悦乎。主要是我和李开强,郭镇勃制作的移动式风源试验小车起了大作用。以往落成区只有两个风源口,并且只能两台车在车间内使用。远远满足不了车间生产现状的需求。现在使用移动式风源试验小车,可在车间外和落成区同时7台车一起使用风源做动作试验,互不影响。大大的解决了落成区生产线中的瓶颈问题。
移动式风源试验小车在2013年9月分公司创意改善活动荣获一等奖。
总之,各方面努力提高自己,并本着求真务实的精神,踏踏实实工作,力争在工作中实现自己的人生价值。虽然自己在各方面都取得了一定的成绩,但也还存在的很多不足,需要在以后的工作中进一步提高。今后,将以更高的工作热情,扎扎实实的工作态度,创造性的开展各项工作。
2013-10-16