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="垂直滾動條的";
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++技術專題專題,或
//--------------------------------------------
void __fastcall TForm1::ScrollBar1Change(TObject *Sender)
{
Memo1->Lines->Append("水平滾動條的OnChange事件");
}
//--------------------------------------------
void __fastcall TForm1::ScrollBar2Change(TObject *Sender)
{
Memo1->Lines->Append("垂直滾動條的OnChange事件");
}
//--------------------------------------------
現在,編譯並運行這個程序,點擊滾動條,可以看出滾動條的事件產生情況。
哪個事件優先你能看出來嗎?你一定會對OnScroll同一事件產生的兩個屬性值先後被OnChange分開而不解是嗎?你好好看一下什麼時候產生scEndScroll值J
其實我們假如要了解其他某個組件所產生的事件之間的順序,也可以用同樣的方法來實現。
39)問:軌跡條(TrackBar)有那些主要屬性呢?
答:軌跡條與滾動條有相似之處,它也有一個類似於滾動塊的滑動塊,可以用鼠標或者使用方向鍵移動。軌跡條的某些屬性與滾動條完全相同,例如Max,Min和Position。但是它還有一些非凡的屬性。
1.LineSize屬性,用於指定當用戶按下方向鍵時,軌跡條的滑動塊移動的距離。
2.PageSize屬性,用於指定當用戶按下PgUp和PgDn時,軌跡條上的滑動塊移動的距離。
3.Frequency屬性,用於設置軌跡條刻度的單位。假如Max-Min等於100,而這個屬性等於10,那麼軌跡條就被分成了10等份。
4.Orientation屬性,用來確定軌跡條的放置方向,它有兩個值,tbHorizontal表示水平放置,tbVertical表示是垂直放置的。缺省情況下是水平放置的。
更多內容請看C/C++技術專題專題,或
5.SelStart這個屬性用來設置選擇的起點。
6.SelEnd這個屬性用來設置的選擇終點。
7.TickMarks這個屬性用來設置軌跡條標尺的位置。它有三個值,分別表示三種不同的滑動塊位置:
<!-- frame contents -->
<!-- /frame contents -->
tmBottomRight表示垂直放置時標尺顯示在軌跡條的下面或者水平放置時顯示在右邊。
tmTopLeft表示垂直放置時標尺顯示在軌跡條的上面或者水平放置時顯示在左邊。
tmBoth則表示軌跡條的兩邊都有標尺。
8.TickStyle這個屬性用來確定軌跡條標尺的樣式。它有三個值,分別表示三種不同的標尺樣式:
tsAuto表示自動顯示標尺的刻度。
tsManual表示需要使用SetTick過程才能設置在某個位置顯示刻度。
tsNone表示標尺不顯示刻度。
40)問:軌跡條有哪些常用的事件呢?
答:當用戶用鼠標或者鍵盤操作軌跡條時,就會產生OnChange事件。不過要注重,在程序中改變屬性Position的值不會產生OnChange事件,這一點與滾動條不同。
41)問:進程條(ProgressBar)如何用呢?
答:它的屬性與上面的那些組件差不多,象Max、Min、Orientation、Position與上面的含義大同小異。其中Position是這個組件的要害,它用來設置或者返回進程條的填充小方塊的當前位置,當進條結束的時候,這個位置應該是位置上限。
Smooth:布爾類型,缺省為false。這時的填充是按格進行的,假如設置為true,則填充是平滑進行的。
StepBy:其聲明為:void _fastcall StepBy(int Detla);這個函數用來向前填充進程條,同時改變Position的屬性值。它的增加量由參數Detla來指定。
StepIt:其聲明為:void _fastcall StepIt(void);這個函數用來向前填充進程條,同時改變Position的屬性值。其填充步長由Step屬性來指定。
Step:這個屬性用來設置當調用StepIt函數時,Position位置的增加量。缺省為10。
42)問:UpDown控件有什麼用?
答:這個控件是一對上下箭頭按鈕,按下按鈕時會自動增加或減少某個數值。它通常有一個附屬組件,由UpDown控件的Associate屬性指定。假如這個組件是一個編輯框,那麼編輯框就會自動顯示UpDown控件的屬性Position的值。
UpDown控件也有一些滾動條和軌跡條所具備的屬性,例如Max,Min,Position,Orientation,它們的意義也基本上相同,不過UpDown控件同樣有一些非凡的屬性。
AlignButton為udLeft時,表示將UpDown控件放置在附屬組件的左邊,為udRight時,則表示將UpDown控件放置在附屬組件的右邊。
Associate用來指定關聯的附屬組件。
ArrowKey屬性,當屬性為True時,按下上下方向鍵就像按下UpDown控件的上下箭頭一樣。缺省值為True。
更多內容請看C/C++技術專題專題,或
Thousands屬性, 當屬性為True時,假如Position超過1000,那麼就會自動給所顯示的數值加上一個千分位。缺省值為True。
Wrap屬性,當屬性為True時,假如Position的值大於Max,那麼就會自動回到Min屬性指定的值。缺省值為False。
<!-- frame contents -->
<!-- /frame contents -->
43)問:UpDown控件有哪些常用的事件呢?
答:UpDown控件有兩個常用的事件:OnChanging和OnClick。當用戶正在按下上下箭頭時,將發生OnChanging事件;當用戶按下上下箭頭時,會發生OnClick事件。
我們共同來看一個例子:
在窗體上放置兩個Edit控件,和兩個UpDown控件,將兩個UpDown控件的Orientation屬性分別取值udHorizontal和udVertical。
將第二個UpDown控件的Max的取值為5000,Position值為100,將他們的Associate屬性分別與兩個編輯框關聯。在對應事件中輸入如下代碼:
void _fastcall TForm1::UpDown1Changeing(TObject *Sender,bool &AllowChange)
{
Edit1->Text=UpDown1->Position;
}
// 注重參數AllowChange可以用來指定是否答應改變Position屬性的值。
void _fastcall TForm1::UpDown2Click(TObject *Sender,TUBTnType Button)
{
Edit2->Text=UpDown2->Position;
}
//注重參數Button表示哪個按鈕被按下:btNext為上箭頭或者右箭頭;btPrew為下箭頭或者左箭頭。
44)問:在UpDown右邊有一個HotKey組件是做什麼的?
答:熱鍵HotKey用來在程序運行期間動態地指定某個組件或者菜單的快捷鍵。在它的屬性中你只要記住HotKey屬性就可以了,這個屬性用來返回用戶指定的快捷鍵。
代碼如下:
//--------------------------------------
#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::X1Click(TObject *Sender)
{
Close();
}
//-------------------------------
void __fastcall TForm1::HotKey1Change(TObject *Sender)
{
X1->ShortCut=HotKey1->HotKey;//X1為菜單名,注重有些書介紹用OnEnter事件,但我覺得不妥,不防你也試一下,用OnEnter你將得不到什麼關聯J
}
//-------------------------------
為什麼這裡用了一個Button1?假如你的程序中沒有另外一個組件可以獲得焦點,你將感受不到快捷鍵的功能的,因為焦點會停在HotKey組件上,在這裡就是想將焦點轉移一下,然後用快捷鍵試一下效果J
(待續)
更多內容請看C/C++技術專題專題,或