2012年7月10日 星期二

檢查DWG檔版本小程式


我寫了一支小程式方便自己用來檢查DWG檔版本,分享給大家使用。
作法很簡單就是打開DWG檔取前六碼,判斷版本。人懶~~科技始終來自人性,哈哈!

電腦需要安裝.net framework 2.0,我想WinXP SP3以後OS版本應該內建都有,若沒有,請Google找一下或到微軟官網下載安裝。


只有執行檔

執行檔含原始碼(c#)

p.s.請點壓縮檔名下方「檔案」->「下載」,以下載整個壓縮檔。

---
Welly

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

2012年5月12日 星期六

.NET使用NPOI Library開發Server端不須安裝Office但能存取Office檔案程式


在 Server 端存取 Excel 檔案的利器:NPOI Library



Codeplex 軟體套件(Package)資訊
套件名稱NPOI
作者tonyqus, huseyin, atao
目前版本1.2.1 Stable(正式版)
URLhttp://npoi.codeplex.com/
使用難易度
使用此套件時可用的輔助工具Visual Studio 2008
POIFS Browser 1.2
基礎知識基本物件導向。
Excel 基礎操作。

在 Server 端控制 Excel 的難處

在今日 Microsoft Excel 被廣為業界接受之際,Excel 已幾乎是每個人必會的工具,不論是在校園或是職場,接觸到 Excel 的機率很高,而且 Excel 靠著簡單易用以及高度容錯的能力,讓使用者可以近乎無痛的操控 Excel,它內建的強大試算以及資料整理的功能,也讓很多使用者樂於使用它,這一點由 Excel 的高市佔率得以印證,用 Excel 來整理與包裝資料已經是司空見慣的事,因此很多的使用者會利用它來處理日常的業務資料或是基本檔等等,不過這可就苦了 IT 人員了。
在論壇上經常會看到一種需求,因為使用者不論如何都要用 Excel 檔來放資料,所以總是要求 IT 人員在系統中直接產出 Excel 檔案直接下載給使用者,目前由官方公布,由伺服器端存取 Excel 表格兩種方法:

2012年4月19日 星期四

看完這篇文章,也許對人生想法會不一樣...


看完這篇文章,
也許對人生想法會不一樣......



記得小時候,我很憧憬長大。

因為我覺得等長大了,父母就再也管不著我了。

可以想喝汽水就喝汽水,

中午想不睡覺就不睡覺,那一定很幸福。

等我真的長大,父母也的確管不著了,

可是當初認為的幸福並沒有到來。

因為,雖然沒有人再管我喝汽水,

但我發現當初那個理想太微不足道。

而且,在得到這個微不足道的自由的同時,

又有了新的更大的不自由。

比如說:八點上班,

哪怕遲到5分鐘,老闆也要給臉色看。

而且那個臉色,比小時候父母的難看得多。

於是,我反而開始懷念

小時候那無憂無慮的生活,

覺得那似乎才是幸福。

同時,又開始了新的憧憬:

什麼時候才能實行彈性的工時,

那一定是很幸福的,

可以想睡到幾點就睡到幾點,

再不用被鬧鈴驚醒好夢,

再不用連臉都不洗、牙沒刷,

就往辦公室狂奔。

若干年後,終於實現了彈性的工時。

不僅如此,隨著自己混成資深人員,

可以想幾點上班就幾點上班,
哪怕在家辦公也沒人說你。



可是我發現,

當初期望的幸福又跑得無影無蹤。

因為,隨著年齡的增長,

沒有鬧鈴,早上也沒了睡懶覺的福氣。
甚至天不亮就醒來,

無所事事的瞪眼到天明。

雖然沒人再要求你,

可是按時起床、工作卻成了習慣,

彈性工時與幸福哪有什麼關係!

回憶幾十年的工作經歷,

我還發現,每換到另一個單位時,

都會有一個感覺令人討厭的主管,
往往都會找我的麻煩。



於是,每每總是希望這個主管調走,
並固執地認為:只要這個人調走,

工作就會很開心。

有幾次,他不走我走,

此處不留爺,自有留爺處。

可是,每一次都會發現,無論到哪,

各形各色的和我作對的主管都如影隨形。

於是又開始憧憬:哪天媳婦熬成了婆,

到我能說了算,不用再受主管的氣,

那一定很幸福。

若干年後,終於熬出了頭:

自己當上高級主管,可以頤指氣使,

讓別人看我的臉色了。

可是我發現,當初渴望的幸福還是沒有來。

因為,雖然沒有人再對你說三道四,
但是,怎麼什麼責任都要我負,

大事小情都要我拍板,心怎麼這麼累呢?

而且,周邊的人怎麼都變得如此虛偽,

自己放個屁,別人都會說香。

於是,天天開會、應酬、聽彙報、佈置工作,

忙得像個陀螺一樣的我,又開始新的憧憬:
哪天能夠活得悠哉遊哉,

不用再管那麼多事,

想釣魚就釣魚,想打牌就打牌,

不 用再看那麼多虛偽的面孔、

聽那些肉麻的假話、看那些枯燥的檔案,

那才是幸福。

光陰似箭,轉眼退休了,

真的再沒有人要我負任何責任,

當初煩人的電話也不再打來,
門庭也真的冷落到鞍馬稀,

所有時間都屬於了自己,

我卻發現,當初渴望的幸福,

哪裡是什麼幸福?

簡直就是人走茶涼的冷落和無盡的孤獨。

於是,一個人坐在殘陽下,

開始思考人生:

我這一生,從小到大,從大到老,
都覺得如果怎樣,明天就會得到幸福,

可為為何在一個個願望實現後,

幸福依舊沒有來?

這時候,才算真正明白了一句話:



“過去心不可得,未來心不可得。”

一切其實盡在當下。

如果你覺得現在不幸福,

總覺得改變了才是幸福,

或者過去了的才是幸福,
那麼恐怕一輩子都難有真正的幸福感!

不是嗎?未來的還沒有來,過去的已經過去。

如果每一個當下,

我們不抓住,不去認真對待,

總想著看不見的明天或已經遠去的昨天,
我們就會永遠生活在緊張和失落中。

隨著生命一點點溜走,

到頭來留下的只能是三個字:“空悲切”。

所以,

如果想知道20年後會不會幸福,

就個人心態而言,
看看現在的狀態就可以知道:



如果你當下感到幸福,

20年後也應該會幸福;

如果你有太多的東西寄于明天,20年後,

這些願望無論是否實現,

你都可能不會感到真正的幸福。

幸福就在當下,

就在你手中的每一天,甚至每一刻,

而絕不在過去或者未來。