程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 我的Win32開發抉擇,Delphi老將復出

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

編輯:Delphi

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

    那麼接下來就考慮使用C/C++開發了,采用純Win32開發太累,選用QT、MFC、WxWidgets之類能簡化工作,MFC就不提了簡直就是一坨翔誰用誰難受,QT開發出的界面太不Native,WxWidgets界面很Native而且類庫設計的超好,使用WxWidgets開發程序甚至有時候感覺不到自己在使用C++,。但是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版上出現了”,很悲涼的。而且我感覺很奇怪的是,

    這次開發我還是選擇了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;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved