2013年2月26日 星期二

[C 常見考題] Pointer Quiz - Part1


Quiz:
請試著寫出下面代碼的輸出:
  1. #include   
  2. #include   
  3.   
  4. int main()  
  5. {  
  6.   char strAry[] = "This is string";  
  7.   char *aryPtr = strAry;  
  8.   int *intPtr = (int*)strAry;  
  9.   printf("\t[Line01] strAry=%s\n", strAry);  
  10.   printf("\t[Line02] aryPtr=%s\n", aryPtr);  
  11.   //printf("\t[LineX] *aryPtr=%s\n", *aryPtr); // Segment fault  
  12.   printf("\t[Line03] sizeof(aryPtr)=%d\n", sizeof(aryPtr));  
  13.   printf("\t[Line04] sizeof(*aryPtr)=%d\n", sizeof(*aryPtr));  
  14.   printf("\t[Line05] *aryPtr='%c'\n", *aryPtr);  
  15.   printf("\t[Line06] *aryPtr+1='%c'\n", *aryPtr+1);  
  16.   printf("\t[Line07] *(aryPtr+1)='%c'\n", *(aryPtr+1));  
  17.   printf("\t[Line08] sizeof(intPtr)=%d\n", sizeof(intPtr));  
  18.   printf("\t[Line09] sizeof(*intPtr)=%d\n", sizeof(*intPtr));  
  19.   printf("\t[Line10] intPtr=%s\n", intPtr);  
  20.   //printf("\t[LineX] *intPtr=%s\n", *intPtr); // Segment fault  
  21.   printf("\t[Line11] *intPtr='%c'\n", *intPtr);  
  22.   printf("\t[Line12] *intPtr+1='%c'\n", *intPtr+1);  
  23.   printf("\t[Line13] *(intPtr+1)='%c'\n", *(intPtr+1));  
  24.   return 0;  
  25. }  
Sol:
[Line01] strAry=This is string # 字串陣列 char[] ="..." 會自動加上 NULL 到結尾.
[Line02] aryPtr=This is string # 同上, 只是把 aryPtr 指標指向 strAry 的位置. strAry 本身也是個指標.
[Line03] sizeof(aryPtr)=4 # 指標的大小根據系統是 32bit (4byte) 或是 64bit(8bypte) 有所不同.
[Line04] sizeof(*aryPtr)=1 # char 的大小為 1 byte.
[Line05] *aryPtr='T' # 指向字串中第一個字元 'T'
[Line06] *aryPtr+1='U' # char 'T' + 1=char 'U'. -> ASCII 'T'=84. 84+1=85=ASCII 'U'.
[Line07] *(aryPtr+1)='h' # 將 aryPtr 指標移動一個 char 的位置 (1 個 byte 的距離), 即是字串的第二個字元 'h'.
[Line08] sizeof(intPtr)=4 # 同 Line03
[Line09] sizeof(*intPtr)=4 # int 類型的大小為 4 byte.
[Line10] intPtr=This is string # 雖然用 int* 指定 pointer 類型, 但是在 printf 使用 '%s', 故還是打印出字串出來.
[Line11] *intPtr='T' # 指向字串中第一個字元 'T'.
[Line12] *intPtr+1='U' # 同 Line6
[Line13] *(intPtr+1)=' ' # 因為 指標類型為 int, 故移動一個位置為 4 byte, 所以指向第 0+4 =4 位置上的字元, 即字串的第五個字元 (從 0 開始).
This message was edited 4 times. Last update was at 26/02/2013 18:29:39

2013年2月23日 星期六

[ ExtJS3.x 開發實戰 ] CH7 : 彈出視窗 - Ext.Window 常用屬性

Preface: 
從外表來看, Window 和 MessageBox 外在長相與功能很像似, 這是因為 Ext.MessageBox 內部也是基於 Ext.Window 實現的. 

建立一個視窗: 
先看看一個簡單範例: 
  1. Ext.onReady(function(){    
  2.     Ext.BLANK_IMAGE_URL = '../js/ext-3.4.0/resources/images/default/s.gif';    
  3.       
  4.     var win = new Ext.Window({  
  5.         el: 'window-win',  
  6.         layout: 'fit',  
  7.         title: 'Title',  
  8.         closable: true,  
  9.         closeAction: 'hide',  
  10.         width: 600,  
  11.         height: 350,  
  12.         items: [{}],  
  13.         buttons: [{  
  14.             text: 'Button',  
  15.         }]  
  16.     });  
  17.       
  18.     win.show();  
  19. });  
上面的 Window 需要一個對應的 HTML 元素, 我們用 el 屬性指定 'window-win' ; 透過 width 與 height 設定寬度與高度. 其次需要設定的是視窗的布局類型, layout:'fit' 表示佈局會充滿整個視窗. 當視窗大小改變, 內部元件也會隨之調整. 而 items 參數指定視窗中放置的子元件, 如表格, 數或表單等. 

closeAction: 'hide' 是一個常用參數, 它控制用戶按一下右上角關閉圖示後執行的操作. 參數值 'hide' 表示關閉後執行隱藏命令, 之後我們可以使用 show() 函數顯示剛剛關閉的視窗 ; 'close' 會在關閉視窗時把視窗物件銷毀, 這樣就不能使用 show() 函數顯示剛剛的視窗. 如果不想讓使用者使用右上角關閉按鈕, 可以設定 closable: false ; 如果不想讓使用者拖拉視窗位置, 可以設定 draggable: true. 

buttons 參數用於設定視窗底部的按鈕. 這裡我們建立一個按鈕但沒有給定事件應處理函式. 執行結果如下: 
 

Ext.Window 直接繼承自 Ext.Panel, 因此我們可以使用 Ext.Panel 中定義的參數對視窗進行設定標題, 上方和下方的工具列, 內容以及折疊展開等功能. 

視窗最大化與最小化: 
透過參數 maximizable: true 可以使用視窗右上角最大化的按鈕; 透過使用參數 minimizable: true 可以使用視窗右上角最小化的按鈕: 
 

按下最大化按鈕後, 視窗會填滿整個瀏覽器視窗; 按下最小化按鈕並不會觸發任何操作, 我們需要根據實際情況來自定最小化功能. 有兩種實現方法: 監聽 minimize 事件與改寫 minimize() 函數. 

視窗的隱藏與銷毀: 
Ext.Window 中包含一個 closeAction 參數. 這個參數用來設定關閉視窗時執行動作. 預設值為 closeAction: 'close' , 指關閉視窗後 Ext 會將視窗物件與其對應的 DOM 模型完全銷毀, 而已經銷毀的視窗無法透過呼叫 show() 顯示出來; 另一個設定是 closeAction: 'hide', 在關閉視窗後仍可透過函數 show() 顯示關閉視窗. 於視窗關閉相關配置還有 closeable 參數, 預設為 true. 指視窗右上角會出現關閉按鈕, 如果設定為 false, 就會隱藏關閉按鈕. 

防止視窗超出瀏覽器: 
預設配置下, 視窗可以移到任何位置, 甚至可能超出瀏覽器的邊界, 有時候會出現一些問題. 為了避免這個問題, 我們可以限制視窗移動範圍, 讓它維持在瀏覽器的可視範圍內. 這時可以選擇使用參數constrain 和 constrainHeader, 它們分別用來限制視窗的整體與視窗的頂部不能超出瀏覽器的邊界. 

設定視窗中的按鈕: 
可以透過 buttons 參數設定視窗下的按鈕, 範例代碼如下: 
  1. Ext.onReady(function(){    
  2.     Ext.BLANK_IMAGE_URL = '../js/ext-3.4.0/resources/images/default/s.gif';    
  3.       
  4.     var win = new Ext.Window({  
  5.         el: 'window-win',  
  6.         layout: 'fit',  
  7.         title: 'Title',  
  8.         closable: true,  
  9.         closeAction: 'hide',  
  10.         width: 500,  
  11.         height: 300,  
  12.         items: [{}],  
  13.         maximizable: true,  
  14.         minimizable: true,  
  15.         constrain: true,  
  16.         buttons: [{  
  17.             text: '確定',  
  18.         }, {  
  19.             text: '取消'  
  20.         }]  
  21.     });  
  22.       
  23.     win.show();  
  24. });  
執行結果如下: 
 

預設情況下按鈕會以向右靠齊排列, 而我們可以透過設定參數 buttonAlign: 'center' (值可以是 center, left, right) 設定按鈕的對齊方式. 與按鈕的相關參數還有 defaultButton, 它用於視窗彈出後, 預設為使用者選擇一個按鈕. 如 defaultButton:0 在上面範例即是選擇 "確定" 按鈕. 下面範例代碼會在使用者彈出視窗後按下 Enter 後隱藏視窗(點下 "確定" 按鈕); 點下 "取消" 按鈕後彈出提示視窗: 
  1. buttons: [{  
  2.     text: '確定',  
  3.     handler: function(){  
  4.         win.hide();  
  5.     }  
  6. }, {  
  7.     text: '取消',  
  8.     handler: function(){  
  9.         Ext.Msg.alert('Info''Cancel!');  
  10.     }  
  11. }],  
  12. defaultButton:0  
視窗的其他配置選項: 
我們可以使用 resizable 控制視窗是否可以拖拉改變大小; modal:true 則是希望彈出視窗後, 立即遮罩頁面上其他元件, 只有在視窗關閉後才能繼續操作其他元件. 

視窗分組: 
在 Ext 中, 視窗是分組進行管理的, 我們可以對某一組中的視窗進行特定操作. 預設情況下視窗都在 Ext.WindowMgr 組中. 視窗分組由 Ext.WindowGroup 類別定義, 下面示範如何分組操作視窗: 
- 前台代碼 
  1. ...  
  2. <input id='new' type='button' name="add" value="new window"/>  
  3. <input id='back' type='button' name="add" value="to back"/>  
  4. <input id='hide' type='button' name="add" value="hide all"/>  
  5. <input id='show' type='button' name="add" value="show all"/>  
  6. ...  
- 後臺代碼: 
  1. var i=0, mygroup;  
  2.   
  3. function newWin()  
  4. {  
  5.     var win = new Ext.Window({  
  6.         title: "Win"+i++,  
  7.         width: 400,  
  8.         height: 300,  
  9.         maximizable: true,  
  10.         manager: mygroup  
  11.     });  
  12.     win.setPosition(i*10+30, i*10+30);  
  13.     win.show();  
  14. }  
  15.   
  16. function toBack()  
  17. {  
  18.     mygroup.sendToBack(mygroup.getActive());  
  19. }  
  20.   
  21. function hideAll()  
  22. {  
  23.     mygroup.hideAll();  
  24. }  
  25.   
  26. function showAll()  
  27. {  
  28.     mygroup.each(function(win){  
  29.         win.show();  
  30.     });  
  31. }  
  32.   
  33. Ext.onReady(function(){    
  34.     Ext.BLANK_IMAGE_URL = '../js/ext-3.4.0/resources/images/default/s.gif';    
  35.       
  36.     mygroup = new Ext.WindowGroup();  
  37.     Ext.get("new").on("click", newWin);  
  38.     Ext.get("back").on("click", toBack);  
  39.     Ext.get("hide").on("click", hideAll);  
  40.     Ext.get("show").on("click", showAll);  
  41. });  
執行結果: 

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...