跳到主要內容

發表文章

目前顯示的是 八月, 2009的文章

[轉貼]Vector用法

出處:Vector用法
內容:
Vector用于存储对象数组

常用方法

1.push_back 在数组的最后添加一个数据

2.pop_back 去掉数组的最后一个数据

3.at 得到编号位置的数据

4.begin 得到数组头的指针

5.end 得到数组的最后一个单元+1的指针

6.front 得到数组头的引用

7.back 得到数组的最后一个单元的引用

8.max_size 得到vector最大可以是多大

9.capacity 当前vector分配的大小

10.size 当前使用数据的大小

11.resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值

12.reserve 改变当前vecotr所分配空间的大小

13.erase 删除指针指向的数据项

14.clear 清空当前的vector

15.rbegin 将vector反转后的开始指针返回(其实就是原来的end-1)

16.rend 将vector反转构的结束指针返回(其实就是原来的begin-1)

17.empty 判断vector是否为空

18.swap 与另一个vector交换数据

將不特定檔案存入取出資料庫內

來源:請問如何將不特定檔案存入取出資料庫內
事實上方法極為簡單, 範例如下
(1)載入檔案存入note欄位內(note是一blob)

TFileStream *fs;
TStream *s;

if( OpenDialog1->Execute() )
{
s=Table1->CreateBlobStream( Table1->FieldByName("Note"), bmWrite );
s->Seek( 0, 0 );
fs=new TFileStream( OpenDialog1->FileName, fmOpenRead );
s->CopyFrom( fs, fs->Size );
fs->Free();
s->Free();
}

(2)自note內取出資料存成檔案
TFileStream *fs;
TStream *s;

if( SaveDialog1->Execute() )
{
s=Table1->CreateBlobStream( Table1->FieldByName("Note"), bmRead );
s->Position=0;
fs=new TFileStream( SaveDialog1->FileName, fmCreate );
fs->Seek(0, 0);
fs->CopyFrom( s, s->Size );
fs->Free();
s->Free();

夠簡單吧! 不過就是用 FileStream & Stream 在那兒轉來轉去而已
但它沒有原始檔名資料,建議你另加一欄位存放原始檔名
如果你不想存檔可以將Stream傳至您的其他元件直接觀看,例如pdf, bmp, jpg
tiff, word, excel..........等其他方式處理,反正BLOB是完完整整的將檔案存起來也不管你的資料格式是啥隨便你玩…

TClientDataSet的詳細介紹

出處:CSDN
=============================================================
在三層結構中,TClientDataSet的地位是不可估量的,她的使用正確與否,是十分關鍵的,
本文從以下幾個方面闡述她的使用,希望對你有所幫助.
1.動態索引
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
if (not column.Field is Tblobfield) then//Tblobfield不能索引,二進制
ClientDataSet1.IndexFieldNames:=column.Field.FieldName;
end;
2.多層結構中主從表的實現
設主表ClientDataSet1.packetrecord為-1,所有記錄
設從表ClientDataSet1.packetrecord為0,當前記錄
3.Taggregates使用
(1)在字段編輯中add new field類型為aggregates
後設置expression(表達試)
設置active:=true即可
使用dbedit的field為前者即可
(2)使用Aggergates屬性add設計表達式
調用
  showmessage(floattostr(ClientDataSet1.Aggregates.Count));
  showmessage(ClientDataSet1.Aggregates.Items[0].Value);

4.在單層數據庫中不要BDE
使用ClientDataSet代替table,使用ClientDataSet的loadfilename裝入cds
代替table的tablename的db或者dbf
原來的程序改造方法:
加一個ClientDataSet,使用右鍵assign locate data
後savetofile,再loadfromfile,後刪除table
將原連table的datasource設為ClientDataSet
唯一注意的是:要將midas.dll拷到system或者當前目錄
5.三層結構的公文包的實現方法
同時設定1:filename(*.cds)2.remote server
6.可以對data賦值(從另一個數據集取值)
ClientDataSet2.Data:=Client…

AnsiString類別介紹

以下也是轉載而來的內容,來源是:
AnsiString

全文如下:
AnsiString
其實是一個類(class),不過,它並不歸屬於VCL的框架,不是派生於TObject. 該類封裝了C,C++裏字串的大多操作,並有所發展。方便了C++程式師在程式中使用字串。下面挑典型和重要的說。

一、String就是AnsiString.typedef AnsiString String;
二;在VCL,幾乎所有字串都是AnsiString。若是屬性,則有要求, += 的重載對屬性不保證一定起作用。

Form1->Caption = "窗口標題"; //OK
Form1->Caption += " - 世界你好"; //Err
Form1->Caption = Form1->Caption + " - 世界你好"; //OK

同樣的事情發生 >>(移出) 或 << (移入) 重載上。如字元:
this->Font->Style >> fsBold; //不行的
三、如果要用空串,最好不用 "";
而是:AnsiString emptyStr = *NullStr;
四、現在你不用(顯式地)?字串管理記憶體了:
AnsiString name = "Mike";
ShowMessage(name); //顯示Mike
name = "張三";
ShowMessage(name); //顯示張三
AnsiString name2 = name;
name = 李四";
ShowMessage(name);
ShowMessage(name2);
AnsiString twoName = name + name2;
ShowMessage(twoName);

上面其實說明了,AnsiString 重載了 = 和 + 操作符,讓我們可以直接通過簡單的=或+操作,來賦值,改變一個字串。
如果不用Ansistring這樣或類似的而在C,C++,同樣的操作將是類似於(並不一定和上面完全一致的過程):
char* name = "Make";
ShowMessage(name);
name = new char[strlen(&…

用C++實作Strtok (類似 Java StringTokenizer)

來源:strtok:Split string into tokens

在網路上在查Strtok的做法,無意間找到C++的處理模式
有網友熱心的公佈出他的程式碼(類似 Java StringTokenizer)
內容寫的真的很棒,所以就轉來這邊收藏。
如果要套用AnsiString,則可以使用AnsiString的c_str()函式,也同樣適用哦!
以下是它的源始碼內容:
//---------------------------------------------------------------------------#include <iostream>#include <string>#include <vector>#pragma hdrstop//---------------------------------------------------------------------------#pragma argsusedusingnamespacestd;class StringTokenizer :publicstd::vector<string>{public: StringTokenizer(conststring& s,conststring& delim =" ,"){string::size_type lastPos = s.find_first_not_of(delim,0);string::size_type pos = s.find_first_of(delim, lastPos);while(string::npos!= pos ||string::npos!= lastPos ){ push_back(s.substr(lastPos, pos - lastPos)); lastPos = s.find_first_not_of(delim, pos); pos = s.find_first_of(delim, lastPos);}}};intmain(int argc,char* argv[]){ StringTokenizer stk("1, 2, 3");for( StringToke…

羅技新滑鼠m555b試用心情(?)

最近用了一下m555b的感覺,很棒!
滾輪零磨擦!滾一下就滾個沒完沒了,需要手動煞車
常常也因為這樣而讓食指磨掉一層皮 (誤)

好用的電池更換開關,按一下蓋子就和本體分離了!很方便!

1000dpi的解析度,滑起來很柔很滑順(?)

預設的中鍵是在滾輪後面的按鈕,按滾輪是沒反應的唷!

而滾輪的左右鍵預設也是沒作用的,需要另外安裝driver才行,下次再來試試看吧!

20090821更新:
裝了m555b的驅動程式後,設定介面就跑出來了,滾輪的左右鍵也可以正常使用了
中鍵的應用程式切換鍵(有點像ALT + TAB功能的方式)所帶出來的介面很炫!跟VISTA的切換視窗功能很像,但沒這麼耗資源。

另外,零磨擦滾輪其實可以變成傳統棘輪滾輪(會出現咔啦咔啦聲音的那種)
只要壓一下滾輪,就可以做傳統和零磨擦模式的切換哦!

真是好棒的滑鼠呀!

[轉載]加快你ADD Items的速度!virtual list、vector for TListview教學

寫這篇文章的人真的是佛心來的耶!超厲害的啦!希望我有一天也能夠寫出這樣的作品 ^___^轉載自:300分求解决listview大量数据添加慢的方法

主  题: 讨论ListView里显示十万级以上记录时,象SQL Server里的返回所有行的方式显示记录,怎么实现?

作  者: cmsoft (韦小宝是我的老乡)

等  级:

信 誉 值: 100

所属论坛: C++ Builder 基础类

问题点数: 99

回复次数: 38

发表时间: 2002-12-31 9:57:02

回复人: bigwhiteshark(大白鲨) ( )

信誉:被封杀

哈哈正中本人下怀

如何用TListView来处理大量数据

采用常规方法处理ListView,在数据量大时无论是还是用了BeginUpdata和EndUpdata()

还是处理WM_EraseBkgnd信息都不会得到理想的效果,那答案是什么呢?嗯,

采用所谓Virtual ListView技术。说起来很神秘,其实点通了很简单。

通常ListView中的所有数据都是由ListView自己来管理的,它负责这些数据空间的分配和释放,

当你把ListView->OwnerData设为true时,ListView就把数据的管理权交给了你,而它只负责显示。

这时你需要自己来为数据分配和释放空间,至于你怎样来管理这些数据完全有你自己来定,

ListView完全不关心,当ListView需要显示某条数据时,它就调用OnData事件,

你只要在这个事件的处理函数里指定ListView即将显示的Item的内容就可以了。

这就是所谓的Virtual ListView技术。

由于ListView对数据管理的功能强大,随之而来的却是效率低下,

如果你采用更高效的数据管理方式就会极大的改变效率。

而且Virtual ListView只在数据需要显示时才调用OnData事件载入数据,所以速度很快。
下面的例子中,假设ListView中需要显示4列数据,所有的数据被保存在vector里。

/*Unit1.h*/
//---------------------------------------------------------------------------
#ifndef Unit1…

你今天上線了沒?

這兩天颱風天出門,發現了很有趣的景象,連結電線杆的電線上面滿滿都是麻雀。
嘰嘰喳喳吵個不停,彷彿是在聊天………
「你今天上線了沒?」
不知道有沒有人懂我的笑話,哈!