38)问:事件OnChange和OnScorll都可以描述滚动条的滚动事件,他们有什么区别吗? 答:事件OnChange和OnScorll是有区别的。只要属性Position的值发生改变,那么无论这个值是用户操作滚动条引起的还是通过程序修改的,都会产生OnChange事件。而OnScorll事件只有在用户操作滚动条时才发生。当用户操作滚动条时,首先发生OnScorll事件,然后OnChange事件才会发生。 下面我们共同看一个程序来加深对滚动条的理解。 在窗体上放置一个水平滚动条ScrollBar1和一个垂直滚动条ScrollBar2,以及一个记录滚动条事件的Memo组件。当用户操作滚动条时,在Memo组件中就会显示发生的事件。 选择Memo组件,把它的ScrollBars属性设置为ssVertical。 选择水平滚动条组件,双击OnScroll的Value域,系统将生成事件处理模板,输入这样一段代码。 void __fastcall TForm1::ScrollBar1Scroll(TObject *Sender, TScrollCode ScrollCode, int &ScrollPos){AnsiString temp;if(Sender==ScrollBar2)temp="垂直滚动条的";else temp="水平滚动条的";switch(ScrollCode){ case scLineUp:temp+="scLineUp";break; case scLineDown:temp+="scLineDown";break; case scPageUp:temp+="scPageUp";break; case scPageDown:temp+="scPageDown";break; case scPosition:temp+="scPosition";break; case scTrack:temp+="scTrack";break; case scTop:temp+="scTop";break; case scBottom:temp+="scBottom";break; case scEndScroll:temp+="scEndScroll";break; default:temp+="未知";break;}Memo1->Lines->Append(temp+"事件"); } 更多内容请看C/C++技术专题专题,或 第一条语句声明一个AnsiString类型的变量,用来存放将要显示的字符串。 第二条语句判定发送事件的对象,假如是垂直滚动条,将temp初始化为 “垂直滚动条的”,否则初始化为 “水平滚动条的”。 第三条语句根据ScrollCode的值,显示相应的事件。 最后一条语句将要显示的字符串加到文本框的末尾。 在窗体中选择垂直滚动条组件,选择Events标签,单击OnScroll的Value域,从下拉列表框中选择ScrollBar1Scroll事件处理程序。这样,垂直滚动条和水平滚动条将共用一个事件处理程序。 选择水平滚动条组件,选择Events标签,双击OnChange域,然后输入: Memo1->Lines->Append("水平滚动条的OnChange事件"); 它将在文本框后面显示水平滚动条改变的信息。 类似的,给垂直滚动条的OnChange事件加上如下代码:Memo1->Lines->Append("垂直滚动条的OnChange事件"); 具体代码如下: //--------------------------------------------#include <vcl.h>#PRagma hdrstop#include "Unit1.h"//--------------------------------------------#pragma package(smart_init)#pragma resource "*.dfm"TForm1 *Form1;//-------------------------------------------- 更多内容请看C/C++技术专题专题,或
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){}//--------------------------------------------void __fastcall TForm1::ScrollBar1Scroll(TObject *Sender, TScrollCode ScrollCode, int &ScrollPos){ AnsiString temp;if(Sender==ScrollBar2)temp="垂直滚动条的";elsetemp="水平滚动条的";switch(ScrollCode){ case scLineUp:temp+="scLineUp";break; case scLineDown:temp+="scLineDown";break; case scPageUp:temp+="scPageUp";break; case scPageDown:temp+="scPageDown";break; case scPosition:temp+="scPosition";break; case scTrack:temp+="scTrack";break; case scTop:temp+="scTop";break; case scBottom:temp+="scBottom";break; case scEndScroll:temp+="scEndScroll";break; default:temp+="未知";break;}Memo1->Lines->Append(temp+"事件");} 更多内容请看C/C++技术专题专题,或 //-------------------------------------------- void __fastcall TForm1::ScrollBar1Change(TObject *Sender){ Memo1->Lines->Append("水平滚动条的OnChange事件");}//--------------------------------------------void __fastcall TForm1::ScrollBar2Change(TObject *Sender){ Memo1->Lines->Append("垂直滚动条的OnChange事件");} //-------------------------------------------- 现在,编译并运行这个程序,点击滚动条,可以看出滚动条的事件产生情况。 哪个事件优先你能看出来吗?你一定会对OnScroll同一事件产生的两个属性值先后被OnChange分开而不解是吗?你好好看一下什么时候产生scEndScroll值J