2012年6月26日 星期二

AutoCAD開發人員手冊英文版

Autodesk原廠在2012版以後只維護Online Help。
官網Online Help:
http://usa.autodesk.com/adsk/servlet/index?siteID=123112&id=12272439&linkID=10809853
----------
官網上最後一版(2011版)Offline Help(*.chm)下載點,但此檔只有操作說明,沒有附開發人員相關文件:
http://usa.autodesk.com/adsk/servlet/ps/dl/item?siteID=123112&id=15068206&linkID=9240618
----------
為方便自己系統開發,我將AutoCAD 2010開發人員手冊英文版,網上找到壓縮檔後,另存到我自己Google Cloud Driver。
檔案明細如下:
The acad_dev180.chm is in a folder which, to be complete, must also contain :
- acad_aag.chm (this one contains the ActiveX/COM/VBA Developer's Guide)
- acad_acg.chm (this one contains the Customization Guide)
- acad_alg.chm (this one contains the AutoLISP Developer's Guide)
- acad_alr.chm (this one contains the AutoLISP Reference Guide)
- acad_alt.chm (this one contains the AutoLISP Tutorial)
- acad_acg.chm (this one contains the AutoCAD User's Guide)
- acad_dxf.chm (this one contains the DXF File Format Docs)
- acad_sso.chm (this one contains the Sheet Set Object Reference)
- acadauto.chm (this one contains the ActiveX/COM/VBA Object Model Reference)
現分享給網友下載:
https://docs.google.com/open?id=0B0K1KBjQFbftYUd1NlVrWHBscXc
----------
Autodesk原廠文件(*.chm),2MB左右,大陸網友將其翻譯成簡體中文字,右方說明頁面會有廣告。
我放在我Google Cloud Driver,不喜歡大陸文件的版友請勿下載。
https://docs.google.com/open?id=0B0K1KBjQFbftRGZGTEIwUkRlZjg
上述文件官方原文網址:
http://exchange.autodesk.com/autocad/enu/online-help/browse#WS73099cc142f48755a52158612bd434e551-7fd5.htm
----------

Welly Lin

2012年6月13日 星期三

T-SQL 分頁從資料庫就做好 Row_number()

SQL 2005之後才有的Row_number()這個Function可以用來做分頁. 從一些參考網站所做的效能評比中,也算是效能數一數二的做法.

以下就是說明Row_number()的基本做法:
select a.UserName,a.UserID
from
(select
  row_number() over (order by UserID) as UID,
  UserName,
  UserID
 from UserDataInfo
 where bmi>20) as a
where a.UID between @SP and @EP

這段語法就是關鍵所在,正常來說,上面的語法只有紅字部份,帶出所有bmi>20的人員,一次把資料全部回傳,但這裡卻多了一段藍字在裡面,Row_Number()就是將符合條件的結果,再從1開始,依序給予編號,所以回傳的結果就會是
UID     UserName     UserID
1          Jeff                   A0001
2          Jerry              C0014
3          Judy               C0096
4          Mark               D0002
5          Jason               D0010
6          Rober               D0011
7          Martin            D0022
所以黑色部份的語法,就依這個的查詢結果,取出UID介於幾號到幾號之間. 所以就可以在DataAccess端,依據設定的PageSize,來算頁次,再依目前的頁次與PageSize去帶回所需顯示的資料範圍.

如果不分頁的話,一次載入上萬筆資料是很可怕的,尤其是透過2M/256K的頻寬,這是ERP系統,不是P2P下載平台,使用者不可能等,如果用分頁方式,就只會一次傳回指定的筆數,大幅的減少網路的負擔,而且這是在DB就做好的動作,所以從DataBase到WebService這段的網路問題也解決了.

這做法也不是沒有缺點,例如在換頁過程中,突然又有幾筆資料符合或不符合了,其順序就會異動,就有可能剛好在換頁時,某筆資料會沒看到,可能跳到前頁或下頁去了. 這部份就看各家使用者了.

以上文章節錄自:Jeff隨手記 http://www.dotblogs.com.tw/jeff-yeh/archive/2008/04/08/2614.aspx

2012年6月7日 星期四

C# 存取修飾詞 public, protected, private, internal, protected internal 的區別


public
型別或成員可由相同組件或參考該組件的另一個組件中的任何其他程式碼存取。
protected
型別或成員只能由相同類別或結構中,或是衍生類別中的程式碼存取
private
型別或成員只能由相同類別或結構中的程式碼存取。
internal
型別或成員可由相同組件中的任何程式碼存取,但是不包括其他組件中的程式碼。
protected internal
型別或成員可由相同組件中的任何程式碼,或是其他組件中的任何衍生類別存取。



節錄自:

2012年6月1日 星期五

C# 繼承


要 C# 中做到跟 Delphi 以下 inherited 一樣效果,C#作法測試說明:

type
  TfrmPrnSuCount1 = class(TfrmPrnList)
:
:
procedure TfrmPrnSuCount1.QuickRep1BeforePrint(Sender: TCustomQuickRep;
  var PrintReport: Boolean);
begin
  //此指令,會呼叫 基底Form 
  //frmPrnList.QuickRep1BeforePrint()執行後
  //再回來往下執行
  inherited; 

  case g_iMode of
    0:  //全部列印
    begin
      QRLabel5.Caption:= '列印範圍:全部列印';
    end;
    1:  //日期範圍
    begin
      QRLabel5.Caption:= 
        '列印範圍:'+ 
        C_StoC(g_sBdate)+ '~'+ 
        C_StoC(g_sEdate);
    end;
  end;
end;


------------------------------
使用了 Virtual 配合 Override 的變通應用


namespace GISTools
{
    //基底Form frmAsk
    public partial class frmAsk : Form
    {
        public frmAsk()
        {
            InitializeComponent();
        }


        //確定按鈕
        public virtual void btnOk_Click(object sender, EventArgs e)
        {
            //btnOk.DialogResult = DialogResult.OK;
            MessageBox.Show("ASK 基底Form!!");
        }
    }
:
:
    //繼承Form frmM301, 繼承自frmAsk
    public partial class frmM301 : GISTools.frmAsk
    {
        public frmM301()
        {
            InitializeComponent();
        }


        //確定按鈕
        //三種不同結果測試
        //第一種:只會秀"ASK 基底Form!!"
        //new public void btnOk_Click(object sender, EventArgs e)
        //{
        //    MessageBox.Show("M301 World!!");
        //}




        //第二種:只會秀"M301 World!!"
        //public override void btnOk_Click(object sender, EventArgs e)
        //{
        //    MessageBox.Show("M301 World!!");
        //}




        //第三種:會先秀"ASK 基底Form!!",
        //      再秀 "M301 繼承Form!!"
        public override void btnOk_Click(object sender, EventArgs e)
        {
            //因為基底frmAsk.btnOk_Click()用了Virtual, 
            //無法再用static, 故要先把物件實體化才能用
            frmAsk frmAsk1 = new frmAsk();  
            frmAsk1.btnOk_Click(sender, e);
            frmAsk1.Dispose();


            MessageBox.Show("M301 繼承Form!!");
        }
    }
}

---
Welly