我的Win32開發抉擇,Delphi老將復出

楊中科發表於2013-07-11

    這兩天在開發公司的一個教學軟體客戶端,因為要考慮到給PHP、平面設計等班的同學使用,為了避免安裝.Net Framework、JRE的麻煩(如果把.Net Framework、JRE打包到安裝包,也會使得安裝包太大),因此沒有選擇使用.Net、Java開發。

    那麼接下來就考慮使用C/C++開發了,採用純Win32開發太累,選用QT、MFC、WxWidgets之類能簡化工作,MFC就不提了簡直就是一坨翔誰用誰難受,QT開發出的介面太不Native,WxWidgets介面很Native而且類庫設計的超好,使用WxWidgets開發程式甚至有時候感覺不到自己在使用C++,使用WxWidgets開發即能用到c++的高執行效率,又能用到.Net/Java一樣的超酷類庫。但是WxWidgets要考慮到跨多平臺,所以呼叫ActiveX、Com等Windows平臺相關特性的時候很困難,而我這個工具就是要有很多呼叫這些東西,所以只能忍痛放棄WxWidgets了。WxWidgets是開源的,如果有人能把WxWidgets 分支出一個For Windows Only的版本,把Windows平臺特性支援提供好了,那麼是非常酷的一件事情了。

    當然現實是殘酷了,必須選擇一個更適合的技術了,我想到了我人生第一個深入研究的語言Delphi。Delphi能夠開發Win32程式,同時提供的類庫也豐富,呼叫Windows平臺特性也非常方便。因此就決定使用Delphi開發了(其實C++Builder也不錯)。

   和當年的如日中天相比,現在的Delphi已經沒落了,使用Delphi的人越來越少,CSDN的Delphi板塊上經常是“很長時間沒回來了,回來看看”、“再見Delphi,我投奔.net or java去了”、“某某大牛很久沒有在Delphi版上出現了”,很悲涼的。而且我感覺很奇怪的是,我10年前就在使用Delphi7,到現在Delphi已經出了DelphiXE4了,而現在使用Delphi的人最多的竟然還是Delphi7。就像現在使用VC開發的最多的還是使用1998年出的VC6。不得不感嘆社群氛圍的差異。

    這次開發我還是選擇了DelpihXE,因為高版本的DelphiXE提供了泛型以及更豐富的庫,當然還有更好用的開發環境。這次我要分享的就是在DelphiXE中更方便的操作“嵌入資源”的方法。

    我開發的這個客戶端中需要把一些png圖片嵌入到exe中,然後在程式中動態載入png圖片,這樣可以實現單一exe檔案的“綠色版”。到網上查資料,提到的方法都是手動編寫.rc檔案,然後命令列呼叫brcc32.exe把.rc編譯成.res檔案,然後在程式碼中通過{$R Sample.RES}引用編譯。很麻煩,很奇怪,當年Win32開發的王者竟然沒有傻瓜化的資原始檔的引用方法,要知道連VC都有一個ResourceEditor呀。找了半天竟然真的沒有,天哪!超級懶的我在DelphiXE裡胡亂的點著,忽然發現主選單的Project下發現了“Resources and Images”點開以後,Get It!就是我想要的。好吧,廢話不說,我來分享一下怎麼使用吧,雖然也許看到這篇文章的很多人也許根本就沒用過Delphi甚至沒聽說過Delphi。另外,據網上的文章說,“Resources and Images”這個是Delphi2010之後才有的功能,我沒有去驗證。

用法:

1、  把PNG圖片放到專案中;

2、  點選主選單“Project”→“ Resources and Images”,彈出下面的對話方塊

  它會自動識別專案中的圖片、音訊等檔案自動新增進來,如果沒有識別出來或者是自定義檔案型別的話,就點選【Add】按鈕手動新增,然後選擇合適的資源型別ResourceType,然後在Resource Identifier中給資源取一個名字即可。

在程式碼中使用TResourceStream讀取資源流:

stream := TResourceStream.Create(HInstance, 'PNGIMAGE_PAUSE',  RT_RCDATA);

DelphiXE中已經提供了Png解析庫,uses pngimage,然後:

png := TPNGObject.Create;

png.LoadFromStream(stream);

 

下面是我封裝的一個簡單的從資源中讀取PNG物件的方法:

function LoadPNGResource(resName:string):TPNGObject;

var

  png: TPNGObject;

  stream: TResourceStream;

begin

  png := TPNGObject.Create;

  stream := TResourceStream.Create(HInstance, 'PNGIMAGE_PAUSE',  RT_RCDATA);

  try

    png.LoadFromStream(stream);

  finally

    stream.Free;

  end;

  result := png;

end;

如鵬網.Net培訓班正在報名,有網路的地方就可以參加如鵬網的學習,學完就能高薪就業,點選此處瞭解

 

    三年前只要懂“三層架構”就可以說“精通分層架構”;現在則需要懂IOC(AutoFac等)、CodeFirst、lambda、DTO等才值錢;

    三年前只要會SQLServer就可以說自己“精通資料庫開發”;現在則需還需要掌握MySQL等開源資料庫才能說是“.Net開源”時代的程式設計師;

    三年前只要會進行使用者上傳內容的安全性處理即可;現在則需要熟悉雲端儲存、CDN等才能在雲端計算時代遊刃有餘;

    三年前只要掌握Lucene.Net就會說自己“熟悉站內搜尋引擎開發”;現在大家都用ElasticSearch了,你還用Lucene.Net就太老土了;

    三年前發郵件還是用SmtpClient;現在做大型網站發郵件必須用雲郵件引擎;

    三年前快取就是Context.Cache;現在則是Redis、Memcached的天下;

    如鵬網再次引領.Net社群技術潮流!點選此處瞭解如鵬網.Net最新課程

相關文章