分享 : 入門書沒有教的技巧...如何正確的使用控件呢?

星際訪客 2014-01-20 07:54:58
程序員養成良好的精確編程習慣很重要...對於自己或使用者都是負責任的體現......

除了原廠技術手冊與大師級的著作外...許多技術工具書都以簡單的範例作介紹...卻比較少針對控件運行效率做深入的探討與分析......

由於普遍的入門知識流傳...致使許多程序員總是依樣畫葫蘆的使用控件著...而未能揣摩控件原創者的思路...比如下面為一般書上範例之添加三個項目的代碼 :
	ListBox1->Items->Clear();
ListBox1->Items->Add(0);
ListBox1->Items->Add(1);
ListBox1->Items->Add(2);


再舉例當添加大量項目時...下面的代碼乍看之下沒啥問題...但運行時發現明顯的效能不彰 :
	ListBox1->Items->Clear();
for (int i = 0; i < 50000; i++)
ListBox1->Items->Add(i);


對於現代的電腦效能來說...在處裡 50000 個數據因該是飛快才對...怎會是需要數秒才完成呢? 問題出在每添加一個項目都會牽動著 UI 的更新...那要如何在添加項目時抑制 UI 的更新而不影響效能呢?

TListBox 之 Items 與其他控件如 : TComboBox . TMemo . TStringGrid 等...皆有 TStrings 屬性...而 TStrings 類裡的 BeginUpdate 與 EndUpdate 方法便可用來控制 UI 更新與否 :
	ListBox1->Items->BeginUpdate();
ListBox1->Items->Clear();
for (int i = 0; i < 50000; i++)
ListBox1->Items->Add(i);
ListBox1->Items->EndUpdate();


經過上述代碼對於效能上已大幅改善...這樣就結束了嗎? 當然還沒哩~ 老生常談 : 預防重於治療...為了讓軟件更強固更安全...程序在運行時難保出現可預知與不可預知的錯誤產生...異常處理機制是一定要的 :
	ListBox1->Items->BeginUpdate();
try
{
ListBox1->Items->Clear();
for (int i = 0; i < 50000; i++)
ListBox1->Items->Add(i);
}
__finally
{
ListBox1->Items->EndUpdate();
}


最後...捕捉到的異常最好還是能有個訊息顯示囉......
...全文
269 点赞 收藏 17
写回复
17 条回复
星際訪客 2014年12月11日
分享不藏私...頂起!
回复 点赞
星際訪客 2014年02月10日
引用 14 楼 u013612990 的回复:
[quote=引用 9 楼 start8588 的回复:] [quote=引用 7 楼 u013612990 的回复:] 你是臺灣滴么?
是的! 請問老兄您呢?[/quote] 原来在台资公司上班,非常熟悉你们那边的语言和习惯罢了。。。。哈哈[/quote]
回复 点赞
星際訪客 2014年02月10日
引用 13 楼 draculamx 的回复:
还说什么呢。。。果断收藏。。。
回复 点赞
TseChung 2014年02月10日
引用 9 楼 start8588 的回复:
[quote=引用 7 楼 u013612990 的回复:] 你是臺灣滴么?
是的! 請問老兄您呢?[/quote] 原来在台资公司上班,非常熟悉你们那边的语言和习惯罢了。。。。哈哈
回复 点赞
draculamx 2014年02月09日
还说什么呢。。。果断收藏。。。
回复 点赞
星際訪客 2014年02月09日
引用 11 楼 dfdscx 的回复:
回复 点赞
dfdscx 2014年02月09日
回复 点赞
TseChung 2014年02月08日
引用 5 楼 start8588 的回复:
感謝妖哥提供絕佳的方法...TStringList 搭配 TMemoryStream 在效能上的表現優越!
	ListBox1->Items->BeginUpdate();
	try
	{
		ListBox1->Items->Clear();
		for (int i = 0; i < 50000; i++)
			ListBox1->Items->Add(i);
	}
	__finally
	{
		ListBox1->Items->EndUpdate();
	}
	TStringList *TempList = new TStringList;
	try
	{
		for (int i = 0; i < 50000; i++)
			TempList->Add(i);
		ListBox1->Items->Assign(TempList);
	}
	__finally
	{
		delete TempList;
	}
	TMemoryStream *mStream = new TMemoryStream;
	TStringList *TempList = new TStringList;
	try
	{
		for (int i = 0; i < 50000; i++)
			TempList->Add(i);
		TempList->SaveToStream(mStream);
		mStream->Position = 0;
		ListBox1->Items->LoadFromStream(mStream);
	}
	__finally
	{
		delete TempList;
		delete mStream;
	}
經實測上面三種方式的結果...TStringList+Assign 稍微遜了一點~ 訣竅大概就是...只要能避開 UI 的更新之背後內存處裡...都很快......
你是臺灣滴么?
回复 点赞
星際訪客 2014年02月08日
引用 8 楼 wewaa 的回复:
回复 点赞
星際訪客 2014年02月08日
引用 7 楼 u013612990 的回复:
你是臺灣滴么?
是的! 請問老兄您呢?
回复 点赞
laowang2 2014年02月08日
回复 点赞
PPower 2014年01月21日
sample ... 不同的控件有很多使用上要注意的问题,不少属性也是相互影响,如果没有HELP,确实容易掉到坑里。   各自熟悉不同的控件,熟悉不同的程序库,熟悉不同的编程环境,造就了一个个编程小团体。这些天才们往往不是相互借鉴,相互包容,相互帮助,相互促进,反而是相互攻击,自然而然地不兼容化,总是梦想老子天下第一。 害苦了生活在底层的一线程序员,他们学了这个控件,又要学那个控件,换了这个环境,又换那个环境,总是学了又不得不丢,学了又不得不丢!不学就不得不淘汰。C/C++就是想提供一个稳定的,长久的,可持续发展的编程语言,注定了他很难做到最辉煌的,最好用的,但却是活得最久的影响力最为久远的语言。
回复 点赞
星際訪客 2014年01月21日
引用 2 楼 ccrun 的回复:
合适使用 BeginUpdate 和 EndUpdate 是个好主意。另外,使用TStringList配合流的方式往ListBox/Memo中加载许多个项目,也很快。
Best Best!
回复 点赞
ccrun.com 2014年01月21日
合适使用 BeginUpdate 和 EndUpdate 是个好主意。另外,使用TStringList配合流的方式往ListBox/Memo中加载许多个项目,也很快。
回复 点赞
星際訪客 2014年01月21日
感謝妖哥提供絕佳的方法...TStringList 搭配 TMemoryStream 在效能上的表現優越!
	ListBox1->Items->BeginUpdate();
	try
	{
		ListBox1->Items->Clear();
		for (int i = 0; i < 50000; i++)
			ListBox1->Items->Add(i);
	}
	__finally
	{
		ListBox1->Items->EndUpdate();
	}
	TStringList *TempList = new TStringList;
	try
	{
		for (int i = 0; i < 50000; i++)
			TempList->Add(i);
		ListBox1->Items->Assign(TempList);
	}
	__finally
	{
		delete TempList;
	}
	TMemoryStream *mStream = new TMemoryStream;
	TStringList *TempList = new TStringList;
	try
	{
		for (int i = 0; i < 50000; i++)
			TempList->Add(i);
		TempList->SaveToStream(mStream);
		mStream->Position = 0;
		ListBox1->Items->LoadFromStream(mStream);
	}
	__finally
	{
		delete TempList;
		delete mStream;
	}
經實測上面三種方式的結果...TStringList+Assign 稍微遜了一點~ 訣竅大概就是...只要能避開 UI 的更新之背後內存處裡...都很快......
回复 点赞
星際訪客 2014年01月21日
引用 1 楼 sololie 的回复:
前来学习
呵~ 我才要跟你多多學習才是哩......
回复 点赞
sololie 2014年01月20日
前来学习
回复 点赞
发动态
发帖子
茶馆
创建于2007-08-02

361

社区成员

2.0w+

社区内容

C++ Builder 茶馆
社区公告
暂无公告