程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ Builder 初學問與答(七)

C++ Builder 初學問與答(七)

編輯:C++入門知識
  53)問:能介紹一下TTreeNodes與TTreeNode?   答:在BCB中,樹狀視圖的節點是通過TTreeNodes對象來治理的,通過這個對象可以對樹狀視圖進行動態的增加、刪除、插入、移動節點等操作。而每一個節點都是一個TTreeNode對象。   TTreeNode的主要屬性和函數: <!-- frame contents --> <!-- /frame contents -->   Count:這個屬性用來返回某個節點所擁有的子節點的數目。它不包括其子節點。   Item:其聲明為:_property TTreeNode* Item[int Index];這個屬性用來訪問該節點的某個子節點。其中參數Index為其子節點在所有子節點中的位置。   Index:這個屬性用來返回該節點在其父節點的所有子節點中的位置。   Text:這個屬性用來設置或者返回節點的標簽。   Delete:這個函數用來刪除該節點本身。   DeleteChildren:這個函數用來刪除該節點的所有子節點。   EditText:這個函數用來對節點進行就地編輯。   IndexOf:其聲明為:int _fastcall IndexOf(TTreeNode* Value);這個函數將返回該節點的某個子節點的序號。子節點由參數value指定。假如參數value指定的節點不是該節點的子節點,函數將返回-1。   TTreeNodes的主要屬性和函數:   Count:這個屬性用來返回樹狀視圖中節點的數目。   Add:其聲明為:TTreeNode *_fastcall Add(TTreeNode,const System::AnsiString S);這個函數將在樹狀視圖中增加一個節點,新節點成為參數Node 指定的節點的父節點的最後一個子節點,參數S為新節點的標簽。   AddChild:其聲明為: TTreeNode *_fastcall AddChild(TTreeNode,const System::AnsiString S);增加的新節點為參數Node指定的節點的最後一個子節點。   AddChildFirst:其聲明為: TTreeNode *_fastcall AddChildFirst(TTreeNode,const System::AnsiString S);這個函數與AddChild不同的是新增加的節點為Node節點的第一個子節點。   AddFirst :其聲明為:TTreeNode *_fastcall AddFirst(TTreeNode,const System::AnsiString S);這個函數與Add 相似,不同的是新節點成為Node節點的父節點的第一個子節點。   Clear:這個函數將把整個樹狀視圖都清空。   Delete:其聲明:void _fastcall Delete(TTreeNode *Node);這個函數將刪除參數Node 指定的節點。   Insert:其聲明為:TTreeNode _fastcall Insert (TTreeNode* Node,const System::AnsiString S);這個函數用來在參數Node 指定的節點之後插入一個新的節點,新節點的標簽由參數S指定。   7.圖形列表組件ListView
  54)問:TreeView組件能夠實現資源治理器左邊顯示區的內容,可是它右邊顯示區能將列表用各種不同的方式顯示,例如大圖標方式、小圖標方式、簡單列表方式和具體列表方式。這在C++Builder應該怎樣來實現?   答:這可以用ListView組件來實現,ListView組件從功能上講與列表框相似,但是從組件的屬性來看與TreeView相似。ListTiew組件所建立的列表可以用各種不同的方式顯示,例如大圖標方式、小圖標方式、簡單列表方式和具體列表方式。   ListView組件中的一部分屬性與TreeView組件中的屬性是相同的,例如Items,StateImages等。還有一些屬性是ListView特有的。   更多內容請看C/C++技術專題專題,或   LargeImages屬性用來設置存放大圖標的圖標列表,當列表處於大圖標顯示方式時,列表使用這個圖標列表中的圖標顯示。   SmallImages屬性用來設置存放小圖標的圖標列表,當列表處於小圖標顯示方式時,列表使用這個圖標列表中的圖標顯示。 <!-- frame contents --> <!-- /frame contents -->   MultiSelected屬性可確定用戶是否可以同時選擇多個項目。缺省值為false。   屬性ViewStyle確定了顯示風格,可以取這樣一些值。   vsIcon:列表以大圖標方式顯示,可以進行拖放操作。只顯示第一層節點,放置方式由Arrangement決定。   vsSmallIcon:列表以小圖標方式顯示,可以進行拖放操作。只顯示第一層節點,放置方式由Arrangement決定。   vsList:以簡單列表的方式顯示,不能進行拖放操作。節點是豎向放置的,只顯示第一層節點,Arrangement不起作用。   vsReport:以具體列表的方式顯示,顯示的信息可以分成多列。最左邊的列顯示圖標和文字,其余的列顯示具體信息。節點是豎向放置的,每一層均已經展開,只有此時Columns的設置才起作用,Arrangement不起作用。   屬性Columns  當屬性ViewStyle被設置為vsReport時,列表中的每一項可以分成多列顯示,這個屬性用於設置列數和列的標題。   在設計時,按下Columns屬性Value列中的省略號按鈕可以打開一個ListView Columns編輯器,在這個編輯器中可以生成和編輯列及列的標題。   屬性ColumnClick的值為True時,列表中的標題可以作為按鈕使用, 這個屬性最常見的應用是在Windows 95的資源治理器中,單擊文件名或者其它幾個列標題,列表中的文件就會按照文件名重新排序。   屬性Items 包含列表中所有項目的集合。與TreeView組件中的Items屬性類似,這個屬性也有一個項目編輯器,你可以使用這個編輯器在設計時增加、刪除項目,設置項目的圖標索引以及標題等。它的使用方法與TreeView組件的Items編輯器基本相同。   IconOptions屬性用來設置圖標的顯示方式。它還包含幾個子屬性:   (1)Arrangement屬性:當該屬性等於iaTop時,表示圖標從左到右排列在ListView組件的頂部;等於iaLeft時,表示圖標從上到下排列在組件的左邊。   (2)AutoArrange屬性:等於True時,表示增加、刪除或移動圖標時圖標將自動重排。   (3)WrapText屬性:等於True時,表示當項目的標題超過圖標的寬度時標題將換行。   此外,還有運行時態屬性   Selected屬性用來返回列表中被選中的項目。   TopItem屬性用來返回列表中當前可見的最頂端的項目。   55)問:請您編寫一個程序來幫助我理解和記憶ListView控件好嗎?   答:好的,選擇File菜單的New Application菜單項,打開一個空的工程,在窗體上放置一個ListView控件,兩個ImageList控件,一個ListBox控件。   選中ImageList1控件,將它的Height和Width屬性設置為32。雙擊ImageList1控件,打開圖像列表編輯框。點擊Add按鈕,選擇一個大圖標文件。點擊打開按鈕。然後點擊OK按鈕。同樣方法給ImageList2控件加上小圖標。選擇TreeView控件,將它的LargeImages屬性修改為ImageList1。   更多內容請看C/C++技術專題專題,或   將它的SmallImages屬性修改為ImageList2。在ListView控件上點擊鼠標右鍵,選擇Columns Editor選項(當然我們只要點擊屬性Columns右邊的“…”就可以了)。彈出Columns編輯對話框。點擊Add New工具按鈕加入四個列表,選中它們,將它們的caption屬性修改為名稱、大小、類型、修改時間。   關閉列表編輯對話框。   在ListView控件上點擊鼠標右鍵(同樣我們只要點擊 Itmes屬性右邊的“…”也一樣),選擇Items Editor選項。彈出Items編輯對話框(與TreeView的Items Editor差不多),輸入樹型結構文檔。在這裡,點擊“New Item”按鈕可以新建一個項,“NewSubItem”按鈕用來設置這個項的子項。“Delete”用來刪除某個項,包括它的子項。項司性編輯框中,Caption為這個項的標題,另外兩個為項的圖標。   編寫列表框的OnClick事件代碼如下:
  
   void __fastcall TForm1::ListBox1Click(TObject *Sender) {  switch(ListBox1->ItemIndex)    {      case 0:    ListView1->ViewStyle=vsIcon;                 break;      case 1:    ListView1->ViewStyle=vsSmallIcon;                 break;      case 2:    ListView1->ViewStyle=vsList;                 break;      case 3:    ListView1->ViewStyle=vsReport;                 break;    } }   //------------------------------
  把ListView中的ViewStyle屬性改為vsReport,否則你將得不到上面的那種顯示方式。   最後,編譯並運行這個程序,選擇不同的類型,我們可以看到TreeView控件的效果。   56)問:在TreeView、ListView中的圖標治理能再說一下嗎?   答:圖形列表組件很難理解的,主要問題是不太輕易把握它使用圖標的方式。圖形列表組件使用一個名為ImageList的組件治理所有的圖標,ImageList給每個圖標提供一個索引號,這樣在TreeView或ListView組件引用時就不必指出圖標的名字而直接指定索引號就可以了。用ImageList集中治理圖標,用戶使用圖標索引號的方式的確從某種角度減輕了編程人員的負擔,但是也使得他們在編程時必須記住一大堆編號代表的各是哪一種圖標,這就在一定程度上削弱了ImageList的優勢,也許在C++Builder以後的版本中能有更好的方法。   57)問:如何動態的創建一個列表視圖呢?   答:我們舉例說明。我先建立如圖的界面。   更多內容請看C/C++技術專題專題,或   並編寫如下的代碼:
   //------------------------------
  #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::FormCreate(TObject *Sender) {  const char Names[6][3][10] =    {{"廣東省","廣州市","華南"},     {"上海市", "上海市","華東"},     {"北京市", "北京市","華北"},     {"遼寧省", "沈陽市","東北"},     {"湖北省", "武漢市","華中"},     {"雲南省", "昆明市","西南"}};//預備各項的文字   TListColumn  *NewColumn;//創建一個欄   TListItem  *ListItem;//創建一個Items   ListView1->ViewStyle = vsReport;//定義顯示方式   Button3->Enabled=false;   NewColumn = ListView1->Columns->Add();//增加欄   NewColumn->Caption = "省份";//添置欄的名稱   NewColumn = ListView1->Columns->Add();   NewColumn->Caption = "省會";     更多內容請看C/C++技術專題專題,或  
  
     NewColumn = ListView1->Columns->Add();   NewColumn->Caption = "方位";   for (int i = 0; i < 6; i++)   {     ListItem = ListView1->Items->Add();     ListItem->Caption = Names[i][0];//添置父節點     ListItem->SubItems->Add(Names[i][1]);//添置子節點     ListItem->SubItems->Add(Names[i][2]);   } }/*此處有些朋友總感覺為什麼還要創建TListColumn  *NewColumn;     TListItem  *ListItem;其實我們只要這樣想就可以了,我們再手功創建時打開Columns、Items時等於又創建了一個項目,他們並不存在,我們卻要用,所以只能用這種方法來動態創建了J*/
   //------------------------------ void __fastcall TForm1::Button1Click(TObject *Sender) {  TListItem  *temp;  temp=ListView1->Items->Add();  temp->Caption=Edit1->Text;  temp->SubItems->Add(Edit2->Text);  temp->SubItems->Add(Edit3->Text); } //------------------------------
  void __fastcall TForm1::Button2Click(TObject *Sender) {  ListView1->Items->Clear();        } //------------------------------
  void __fastcall TForm1::RadioButton1Click(TObject *Sender) {  ListView1->ViewStyle = vsReport;  Button3->Enabled=false; }     更多內容請看C/C++技術專題專題,或  
   //------------------------------
  void __fastcall TForm1::RadioButton2Click(TObject *Sender) {  ListView1->ViewStyle = vsIcon;  Button3->Enabled=true; } //------------------------------
  void __fastcall TForm1::Button3Click(TObject *Sender) {  ListView1->AlphaSort(); //這個函數的作用是把列表視圖中的項按照它們的標簽字母順序排列,成功返回true。       } //------------------------------
  58)問:我要想對TreeView、ListView裡面的項進行操作如何來進行呢?   答:我們一般都是通過OnChange或OnChangeing事件來完成的,我們通過一個例子來看一下他們的應用及區別,我們在窗體中放上一個TreeView和一個Memo組件,並在TreeView的OnChange和OnChangeing分別寫如下代碼:
   //------------------------------
  #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::tvwChange(TObject *Sender, TTreeNode *Node) {         if(Node->Text=="遼寧")         Memo1->Lines->Add("I'm change!") ; }
  
       更多內容請看C/C++技術專題專題,或  
   //------------------------------
  void __fastcall TForm1::tvwChangeing(TObject *Sender, TTreeNode *Node,       bool &AllowChange) {         AllowChange=false;         if(Node->Text=="遼寧")         Memo1->Lines->Add("I'm changeing!") ; } //------------------------------
     運行效果如下:     只有OnChangeing起了作用,為什麼呢?再看下面代碼: //------------------------------
  #include <vcl.h> #pragma hdrstop #include "Unit1.h"     更多內容請看C/C++技術專題專題,或  
   //------------------------------
  #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //------------------------------ __fastcall TForm1::TForm1(TComponent* Owner)         : TForm(Owner) { } //------------------------------ void __fastcall TForm1::tvwChange(TObject *Sender, TTreeNode *Node) {         if(Node->Text=="遼寧")         Memo1->Lines->Add("I'm change!") ; } //------------------------------ void __fastcall TForm1::tvwChangeing(TObject *Sender, TTreeNode *Node,       bool &AllowChange) {         //AllowChange=false;這與把此句寫成AllowChange=true是一樣的         if(Node->Text=="遼寧")         Memo1->Lines->Add("I'm changeing!") ;      兩個事件都起作用了,並且OnChangeing先於Onchange發生,所以原因很顯然:這一切都是OnChangeing的參數AllowChange造成的,所以要注重對這個參數的使用。    在ListView中只要把上面的Node->Text改成Item->Caption就可以了。 (待續)

   更多內容請看C/C++技術專題專題,或
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved