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事件");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ScrollBar2Change(TObject *Sender)
{
Memo1->Lines->Append("垂直滾動條的OnChange事件");
}
//---------------------------------------------------------------------------