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+\"事件\");
}
第一条语句声明一个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;
//--------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//--------------------------------------------
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+\"事件\");
}
//--------------------------------------------
void __fastcall TForm1::ScrollBar1Change(TObject *Sender)
{
Memo1->Lines->Append(\"水平滚动条的OnChange事件\");
}
//--------------------------------------------