教你7步实现flex自定义Event及参数传递
Flex应用开发过程中如需要灵活的在不同组件(如A与B,父与子)之间响应事件,传递参数等功能时就会使用自定义事件(Event)机制,下面通过一个事例分七步,通过自定义Event和EventDispatcher两种机制实现事件交互和参数传递;
事例描述: 有一个父亲“parentApp.mxml”有两个儿子“comBrotherA.mxml”和"comBrotherB.mxml",新年降至,两个儿子为表孝心分别给他们老爸存入(事件)一笔过节费(事件参数),并通知老爸我存钱进去了,老爸在收到两个儿子的钱后汇总后同时告诉(事件)两个儿子钱我已收到总数(事件参数)是多少...
1、第一步:引入自定义注册事件参数传递扩展类(来自网络)
view plaincopy to clipboardprint?
1.package myeventhelper
2.{
3. //自定义注册事件参数传递扩展类
4. public class EventArgExtend
5. {
6. public function EventArgExtend()
7. {
8. }
9. public static function create(f:Function,...arg):Functi
on //动态参数创建
10. {
11. var F:Boolean = false;
12. var _f:Function = function(e:*,..._arg)
13. {
14. _arg = arg;
15. if(!F)
16. {
17. F = true;
18. _arg.unshift(e);
19. }
20. f.apply(null,_arg);
21. };
22. return _f;
23. }
24. public static function toString():String
25. {
26. return "Class JEventDelegate";
27. }
28. }
29.}
2、第二步:自定义事件触发类:
view plaincopy to clipboardprint?
1.package myeventhelper
2.{
3. import flash.events.EventDispatcher;
4.
5. import mx.core.UIComponent;
6. //自定义事件触发类
7. public class MyEventDispatcher extends EventDispatcher
8. {
9. private static var _instance:MyEventDispatcher;
10. public static const EXEC_PARENT_METHOD:String="ExecPare
ntMethod"; //执行Parent方法
11. public static function getInstance():MyEventDispatcher
12. {
13. if(_instance==null){
14. _instance=new MyEventDispatcher();
15. }
16. return _instance;
17. }
18. public var Source:UIComponent; //事件源对象
19. public var Parsms:Object; //主要用于参数传递
20. }
21.}
3、第三步:用户自定义事件类
view plaincopy to clipboardprint?
1.package myeventhelper
2. {
3. import mx.events.FlexEvent;
4. //用户自定义事件类
5. public class MyExtendEvent extends FlexEvent
6. {
7. public static const EXEC_BROTHER_METHOD:String="Exe
cBrotherMethod";//执行兄弟方法
8.
9. public var param:Object;
10. public function MyExtendEvent(o:Object,type:String,
bubbles:Boolean=false, cancelable:Boolean=false)
11. {
12. super(type, bubbles, cancelable);
13. this.param = o;//也可通过这样的方式传递参数
14. }
15. }
16. }
4、第四步:完成儿子A“comBrotherA.mxml”:
view plaincopy to clipboardprint?
1.
2.
3.
4.
24. }
25.
26. ]]-->
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
5、第五步:完成儿子B“comBrotherB.mxml”:
view plaincopy to clipboardprint?
1.
2.
3.
4.
9. private var execParent:MyEventDispatcher; //触发父
亲节点事件
10. function init():void
11. {
12. execParent = MyEventDispatcher.getInstance();
13. }
14. public function onGetParentTotal(e:Event,...agrs):v
oid //响应父亲类的触发的事件
15. {
16. https://www.wendangku.net/doc/d53071074.html,bTotal.text = String(agrs[0].totalValue)
;
17. }
18.
19. public function onParentEvent(event:Event):void //
通过自定义事件触发类传递参数
20. {
21. execParent.Parsms = txtValue.text;
22. execParent.Source = this;
23. execParent.dispatchEvent(new Event(MyEventDispa
tcher.EXEC_PARENT_METHOD));
24. }
25. ]]-->
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
6、第六步:完成父亲类"parentApp.mxml":
view plaincopy to clipboardprint?
1.
2. ayout="absolute" height="323" xmlns:ns1="component.*" creationC omplete="init();" width="574"> 3. 4. 20. addEventListener(MyExtendEvent.EXEC_BROTHER_MET HOD,EventArgExtend.create(comB.onGetParentTotal,this)); 21. } 22. function getSonValue(e:Event):void 23. { 24. if(parentDP.Source == comA) 25. { 26. txtA.text = String(parentDP.Parsms); 27. } 28. else 29. { 30. txtB.text = String(parentDP.Parsms); 31. } 32. } 33. 34. //将结果返回儿子节点 35. private var nodeEvent:MyExtendEvent; 36. function onSumToNode(e:Event):void//触发事件将结果 返回儿子节点 37. { 38. totalValue = Number(txtA.text) + Number(txtB.te xt); 39. txtTotal.text = String(totalValue); 40. nodeEvent.param = totalValue; 41. dispatchEvent(nodeEvent); 42. } 43. ]]--> 44. 45. olor="#729AAC"> 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60.
7、执行(存入分别“调用父亲方法”,"触发儿子事件")最终结果:
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);
在C++中,参数传递的方式是“实虚结合”。 ?按值传递(pass by value) ?地址传递(pass by pointer) ?引用传递(pass by reference) 按值传递的过程为:首先计算出实参表达式的值,接着给对应的形参变量分配一个存储空间,该空间的大小等于该形参类型的,然后把以求出的实参表达式的值一一存入到形参变量分配的存储空间中,成为形参变量的初值,供被调用函数执行时使用。这种传递是把实参表达式的值传送给对应的形参变量,故称这种传递方式为“按值传递”。 使用这种方式,调用函数本省不对实参进行操作,也就是说,即使形参的值在函数中发生了变化,实参的值也完全不会受到影响,仍为调用前的值。 [cpp]view plaincopy 1./* 2. pass By value 3.*/ 4.#include
如果在函数定义时将形参说明成指针,对这样的函数进行调用时就需要指定地址值形式的实参。这时的参数传递方式就是地址传递方式。 地址传递与按值传递的不同在于,它把实参的存储地址传送给对应的形参,从而使得形参指针和实参指针指向同一个地址。因此,被调用函数中对形参指针所指向的地址中内容的任何改变都会影响到实参。 [cpp]view plaincopy 1.#include
函数参数传递的原理 参数传递,是在程序运行过程中,实际参数就会将参数值传递给相应的形式参数,然后在函数中实现对数据处理和返回的过程,方法有按值传递参数,按地址传递参数和按数组传递参数。 形参:指出现在Sub 和Function过程形参表中的变量名、数组名,该过程在被调用前,没有为它们分配内存,其作用是说明自变量的类型和形态以及在过程中的作用。形参可以是除定长字符串变量之外的合法变量名,也可以带括号的数组名。 实参:实参就是在调用Sub 和Function过程时,从主调过程传递给被调用过程的参数值。实参可以是变量名、数组名、常数或表达式。在过程调用传递参数时,形参与实参是按位置结合的,形参表和实参表中对应的变量名可以不必相同,但它们的数据类型、参数个数及位置必须一一对应。 等号、函数名称、括弧和参数,是函数的四个组成部分。 函数“=SUM(1,2,3)”,1、2和3就是SUM函数的参数,没有参数1、2、3,函数SUM 则无从求值。 函数“=VLOOKUP(2,A:C,3,)”,没有参数2、A:C和3,函数VLOOKUP如何在A:C 区域查找A列中是2那一行第3列的数值? 当然,也有不需要参数的函数,如“=PI()”、“=NOW()”、“TODAY()”等。 函数参数传递的原理C语言中参数的传递方式一般存在两种方式:一种是通过栈的形式传递,另一种是通过寄存器的方式传递的。这次,我们只是详细描述一下第一种参数传递方式,另外一种方式在这里不做详细介绍。 首先,我们看一下,下面一个简单的调用例程: int Add (int a,int b,int c) { return a+b+c; }
MSFlexGrid控件属性及使用方法整理 ================================================= MSFlexGrid总行数和总列数的定义: MSFlexGrid1.Rows = 5 '规定表格的总行数为5行 MSFlexGrid1.Cols = 2 '规定表格的总列数为2行 MSFlexGrid某一单元格的文本内容 MSFlexGrid1.TextMatrix(3, 0) ="网站地址" '定义第3行的左边表头文本内容为:“网站地址”MSFlexGrid1.TextMatrix(3, 2) ="https://www.wendangku.net/doc/d53071074.html, " 定义第3行第2列的文本内容为:“https://www.wendangku.net/doc/d53071074.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控件显示和操作表格数据。其对包含字符串和图片的表格提供了灵活的排序、插入数据和格式编排功能。当与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属性
第9章使用Bootstrap实现网页响应式布局 课程名称Web前端开发项目名称 使用Bootstrap实现 网页响应式布局任务名称使用Bootstrap实现网页响应式布局课时 6 项目性质□演示性□验证性□设计性√综合性 授课班级授课日期授课地点 教学目标能力目标: 1. 具备应用Bootstrap实现响应式布局的能力 2. 具备灵活运用Bootstrap的能力 知识目标: 1. 掌握Bootstrap框架的基本语法 2. 掌握运用Bootstrap实现各种响应式布局的方法素质目标: 1. 培养学生信息搜集能力 2. 培养学生团结合作、互帮互助的能力 教学内容1. 任务描述 2. 任务展示与实现 (1)实现云景旅游公司首页Bootstrap布局(2)学生动手操作 3. 教师讲解本任务涉及的知识点 4. 任务小结 教学重点 1. Bootstrap框架的基本语法 2. Bootstrap框架实现响应式网页
教学难点 1. Bootstrap框架实现响应式网页 教学准备1. 装有Sublime或者Hbuilder的电脑 2. 教学课件PPT 3. 教材:《Web前端技术项目式教程》 作业设计1.使用Bootstrap实现公司二级页面“公司概况”的响应式效果。 教学过程 教学环节 教学内容与过程 (教学内容、教学方法、组织形式、教学手段) 课前组织 做好课前“5分钟”教学管理(多媒体、实训室),做好上课前的各项准备工作(打开电脑、打开课件、打开软件、打开U盘中的素材位置、打开授课计划、教案等),吸引学生注意力。 课程说明【课前说明】 分别从Bootstrap语法基础,Bootstrap框架的使用方法,讲解响应式网页的实现方法。 【目的】 使学生从了解本单元的学习目标、学习重点、考评方式等方面明确学习本单元知识的要求和目标。掌握Bootstrap框架的基础,掌握使用Bootstrap框架实现响应式网页的方法。
Flex笔记 RIA(Rich Internet Applications) 1.Flex用到的2种语言:MXML 和actionScript ,由于flash player 只支持actionScript3.0和actionScript 2.0,所以MXML会编译成actionScript类; 2.MXML内部嵌入actionSript,实例:
网易校招前端一面和二面 一面 1.对前端安全的理解 讲了讲XSS、CSRF、点击劫持、社会工程学等等的特点、攻防方式 2.对模块化的了解 讲了讲amd、cmd、es6的模块特点和区别,后面想想应该加上angular模块和懒加载的部分 3.angular双向绑定的原理 4.左边固定右边自适应CSS布局: ?浮动 ?绝对布局 ?表格与表格布局 ?inline-block ?flex ?grid 5.对HTML5标签语义化的理解 6.css动画,追问:js动画写过吗?position有哪些基本值?它们有什么区别? 简单说了说translate/transform/animation,没有写过js动画。 a/r/f/s…相对于页面/自身/屏幕/默认定位 7.异步的几种方式 8.自己实现bind函数 // 简单的辅助绑定函数 function bind(fn, obj) { return function() { return fn.apply( obj, arguments ); };
} 9.谈谈项目和优化的地方? 直接拿成绩有毒给他们演示,讲了一个懒加载列表+事件代理解决加载列表卡顿的情况。追问:怎么控制事件触发频率?怎么实现的? 二面 1.手写一个select组件,就是点一下select出来一个列表,点击列表项select自动填充。 我:可以有一个Select、List、ListItem类,然后传统的DOM驱动的写法是先获取到它们的DOM节点再监听事件,触发事件后执行相应的逻辑,MVVM的写法是使用数据来控制它们的行为…然后开始写 面试官:你写的太复杂了,这题根本不需要用到面向对象,简化一下 我:请提示一下? 面试官:select和列表都在一个父元素里 我:父元素设为relative定位,里面的列表设为absolute定位,然后写一个函数,参数是源dom和目标dom,可以把源dom的值展现到目标dom上去。 面试官:嗯…然后继续手头上的工作 (代码暂时先不贴,这一块到底怎么写才优雅我现在还有点疑惑) 2.模版用过没有?&*%、%¥(没听懂,应该是一些模板)字符串怎么解析成模板的?特别是带逻辑的那一块? 我:Angular的字符串解析模板了解一点,是用装饰器…但我还没说完就叫停了考官:没用过就算了吧,不过怎么可能没用过呢? 这个时候我已经开始出冷汗了… 3.手写用setTimeout模拟setInterval 开始我说setTimeout里面再调用setTimeout 面试官:不对 我想了一会:自定义一个mySetInterval函数 function mySetInterval(cb,time){ let temp = function(){ setTimeout(temp,time) cb.apply(null) } setTimeout(temp,time) } 面试官:嗯…又是一段沉默,然后继续做他的事情
Flex综合测试题 1)下面关于RIA的概念说法错误的是() A)RIA将桌面应用程序的强交互性与传统Web应用灵活的结合起来 B)RIA的富客户端采用异步的方式同服务器端通讯 C)RIA在通讯中会传输所有的数据,增加了数据的信息量 D)RIA可以整合声音,视频等桌面元素 2)一下关于Flex程序说法不正确的是() A)Flex程序由*.MXML、*.as、*.css文件组成 B)MXML语言专用于Flex程序中,是用于描述界面表现的一种XML标记语言 C)ActionScript是针对Adobe Flash Player运行环境的编程语言 D)MXML提供了一系列标签供用户使用,MXML不区分大小写 3)一下关于Applicaton布局的说话,错误的是() A)Application默认的布局是BasicLayout B)HorizonatalLayout表示水平布局方式 C)VertiacalLayout表示竖直布局方式 D)TileLayout表示主题布局方式 4)关于一下代码的说法,不正确的是() 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控件事件 总结Java方法(函数)传值和传引用的问题 java方法中传值和传引用的问题是个基本问题,但是也有很多人一时弄不清。 (一)基本数据类型:传值,方法不会改变实参的值。 public class TestFun { public static void testInt(int i){ i=5; } public static void main(String[] args) { int a=0 ; TestFun.testInt(a); System.out.println("a="+a); } } 程序执行结果:a=0 。 (二)对象类型参数:传引用,方法体内改变形参引用,不会改变实参的引用,但有可能改变实参对象的属性值。 举两个例子: (1)方法体内改变形参引用,但不会改变实参引用,实参值不变。 public class TestFun2 { public static void testStr(String str){ str="hello";//型参指向字符串“hello” } public static void main(String[] args) { String s="1" ; TestFun2.testStr(s); System.out.println("s="+s); //实参s引用没变,值也不变 } } 执行结果打印:s=1 (2)方法体内,通过引用改变了实际参数对象的内容,注意是“内容”,引用还是不变的。 import java.util.HashMap; import java.util.Map; public class TestFun3 { public static void testMap(Map map){ map.put("key2","value2");//通过引用,改变了实参的内容 } public static void main(String[] args) { Map map = new HashMap(); map.put("key1", "value1"); new TestFun3().testMap(map); System.out.println("map size:"+map.size()); //map内容变化了 } } 执行结果,打印:map size:2 。可见在方法testMap()内改变了实参的内容。 (3)第二个例子是拿map举例的,还有经常涉及的是 StringBuffer : public class TestFun4 { Flex 4 样式与布局 第一篇 Flex 4 与自定义布局(Layout) Flex 4/Spark组件架构的新功能之一是可以定制一个容器的布局而不必改变容器本身。您需要做的就是定义一个自定义布局。 Flex 4/Spark架构中的容器并不控制它们自己的布局。相反,每种容器具有一个布局属性,用于确定如何在屏幕上设置子元素的布局。可以使用一个单独的Group容器,并赋予其一个垂直布局、水平布局或平铺布局,这取决于您将如何创建它。代码很简单,如下所示: (参考文章:Flex 4与自定义布局: 译文:https://www.wendangku.net/doc/d53071074.html,/lihe111/archive/2009/07/06/4325571.aspx 原文:https://www.wendangku.net/doc/d53071074.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. //全部摘自别的博客,以前对值传递很迷糊,看完豁然开朗,整理下,来百度文库赚点分。 一、三道考题 开讲之前,我先请你做三道题目。(嘿嘿,得先把你的头脑搞昏才行……唉呀,谁扔我鸡蛋?) 考题一,程序代码如下: void Exchg1(int x, int y) { inttmp; tmp = x; x = y; y = tmp; printf("x = %d, y = %d\n", x, y); } main() { int a = 4,b = 6; Exchg1(a, b); printf("a = %d, b = %d\n", a, b); return(0); } 输出的结果为: x = ____, y=____. a = ____, b=____. 问下划线的部分应是什么,请完成。 考题二,程序代码如下: void Exchg2(int *px, int *py) { inttmp = *px; *px = *py; *py = tmp; printf("*px = %d, *py = %d.\n", *px, *py); } main() { int a = 4; int b = 6; Exchg2(&a, &b); printf("a = %d, b = %d.\n", a, b); return(0); } 输出的结果为为: *px=____, *py=____. a=____, b=____. 问下划线的部分应是什么,请完成。 考题三,程序代码如下: void Exchg3(int&x, int&y) { inttmp = x; x = y; y = tmp; printf("x = %d,y = %d\n", x, y); } main() { int a = 4; int b = 6; Exchg3(a, b); printf("a = %d, b = %d\n", a, b); return(0); } 输出的结果为: x=____, y=____. a=____, b=____. 问下划线的部分应是什么,请完成。你不在机子上试,能作出来吗?你对你写出的答案有多大的把握?正确的答案,想知道吗?(呵呵,让我慢慢地告诉你吧!) 好,废话少说,继续我们的探索之旅了。 我们都知道:C语言中函数参数的传递有:值传递、地址传递、引用传递这三种形式。题一为值传递,题二为地址传递,题三为引用传递。不过,正是这几种参数传递的形式,曾把我给搞得晕头转向。我相信也有很多人与我有同感吧? 下面请让我逐个地谈谈这三种传递形式。 二、函数参数传递方式之一:值传递 (1)值传递的一个错误认识 先看考题一中Exchg1函数的定义: void Exchg1(int x, int y) /* 定义中的x,y变量被称为Exchg1函数的形式参数*/ { 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。该功能使用户既能够查看大量的数据,也可以查看压缩形式的信息。如果一个带区是可开展的,那么该带区的左上角会显示出一个缺省的扩展(+) 或收缩(-) 位图。无论垂直带区还是水平带区都可以使用扩展和收缩功能。 当带区处于扩展状态的时候,出现的将是收缩(-) 位图。在扩展状态下,带区显示出最大数量的数据。当带区处于收缩状态的时候,出现的将是收缩(+) 位图。在扩展状态下,带区显示出最少量的数据。 在收缩状态下,带区中可能显示未被填充数据的区域。对未填充区域的格式也有专门的规定。 收缩状态的带区 当一个带区处于收缩状态时,它的任何一个记录都不会显示出来,该带区中的列也不会显示出来。当用户将带区展开时,这些列将显示出来。展开状态的带区具有统一的高度。在必要的情况下, 二.参数传递 函数的形参的初始化和变量的初始化一样,如果形参具有非引用类型,则复制实参的值,如果形参为引用类型,则它是实参的别名。 1.非引用实参 普通的非引用类型的函数通过复制对应的实参实现初始化。当用实参副本初始化形参时,函数并没有调用所传递的实参本身,因此不会修改实参的值。 注解:非引用形参表示对应实参的局部副本,对这类行参的修改仅仅改变了局部副本的值,一旦函数执行结束,这些局部变量的值也就没有了。 a. 指针形参 指针形参与其他非引用类型的行参一样,如果将新指针赋给行参,主调函数使用的实参指针的值没有改变。事实上被复制的指针只影响对指针的赋值。指针形参是const类型还是非const类型,将影响函数调用所使用的实参。 b. const行参 在调用函数时,如果该函数使用非引用的非const形参,则既给该函数传递const实参也可传递非const的实参(因为改变形参不影响const的实参,所以const实参不会被改变)。如果将形参定义为非引用的const类型,则在函数中,不可以改变实参的局部副本,由于实参是以副本的形式传递,因此传递给函数形参既可是const也可是非const对象。 注意:尽管函数的形参是const,但是编译器却将该行参声明视为普通的int型。 void fcn(const int i); void fcn(int i); 为了兼顾C语言,认为这两种定义并不区别。 c. 复制实参的局限性 不适合复制实参的情况包括: 当需要在函数中修改实参的值时 当需要以大型对象作为实参传递时,对实际的应用而言,复制对象所付出的时间和存储空间代价往往很大。 但没有办法实习对象的复制时 对于以上几种情况,有效的办法是将形参定义为引用或指针。 2.引用实参 与所有引用一样,引用形参直接关联到其所绑定的对象,而并非这些对象的副本。定义引 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打开文件的很多代码。当然你可以直接给 C语言函数调用三种方式传值调用,引用调用和传地址调 我想,你只要看了C语言上关于传值函数调用的测试题,一切都会了然于胸:1. 考题一:程序代码如下: void Exchg1(int x, int y) { int tmp; tmp=x; x=y; y=tmp; printf(“x=%d,y=%d\n”,x,y) } void main() { int a=4,b=6; Exchg1 (a,b) ; printf(“a=%d,b=%d\n”,a,b) } 输出的结果: x=____, y=____ a=____, b=____ 问下划线的部分应是什么,请完成。 2. 考题二:代码如下。 Exchg2(int *px, int *py) { int tmp=*px; *px=*py; *py=tmp; print(“*px=%d,*py=%d\n”,*px,*py); } main() { int a=4; int b=6; Exchg2(&a,&b); Print(“a=%d,b=%d\n”, a, b); } 输出的结果为: *px=____, *py=____ a=____, b=____ 问下划线的部分应是什么,请完成。 3. 考题三: Exchg2(int &x, int &y) { int tmp=x; x=y; y=tmp; print(“x=%d,y=%d\n”,x,y); } main() { int a=4; int b=6; Exchg2(a,b); Print(“a=%d,b=%d\n”, a, b); } 二.函数参数传递方式之一:值传递 1.值传递的一个错误认识 先看题一中Exchg1函数的定义: void Exchg1(int x, int y) //定义中的x,y变量被称为Exchg1函数的形式参数{ int tmp; tmp=x; x=y; y=tmp; printf(“x=%d,y=%d\n”,x,y) } 问:你认为这个函数是在做什么呀 答:好像是对参数x,y的值对调吧 请往下看,我想利用这个函数来完成对a,b两个变量值的对调,程序如下:void main() {MSFlexGrid控件
总结Java方法(函数)传值和传引用的问题
Flex_4_样式与布局小结
c语言值传递的3种形式
FlexGrid控件的使用(二)
C语言中参数传递
FlexCell控件例子
c语言函数调用三种方式传值调用,引用调用和传地址调