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"http://--------------------------------------------#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