這兩天就要開學了。之前幾天太忙了,沒時間寫blog,今天就寫寫delphi 2005的新特性,for…in…語句
在delphi2005中,新增加了乙個非常有用的語句,這個特性在其他很多語言中都有,就是著名的foreach迴圈,越來越多的人發現這個有用的東西了,也越來越多的語言在編譯器層面直接加入了對這個的支援了。
delphi的編譯器在集合型別,陣列型別,字串型別以及提供了getenumerator方法的類提供了for…in…的直接支援。
集合型別:
以下為引用:var chars:set of char;
c:char;
begin
chars:=[『a』..』e』,』0』..』9』];
for c in chars do
showmessage(c);
end;
陣列型別:
以下為引用:type
tnumber=(null,eins,zwei,drei,vier,funf,sechs,sieben,acht,neun);
const
numbertoenglish:array[tnumber] of string=('zero','one','two','three','four','five','six','seven','eight','nine');
var n:tnumber;
begin
for n in [low(tnumber)..high(tnumber)] do
showmessagefmt('%s=%s',[getenumname(typeinfo(tnumber),ord(n)),numbertoenglish[n]]);
end;
字串型別:
以下為引用:var s:string;c:char;
begin
s:=』hello world』;
for c in s do
showmessage(s);
end;
對於提供了getenumerator方法的類,getenumerator返回的乙個類例項必須包含如下定義:
以下為引用:function getcurrent: 型別名;
function movenext: boolean;
property current: 型別名 read getcurrent;
對於是否從哪個繼承下來並沒有硬性的規定,直接從tobject繼承下來都可以。
使用例子:
以下為引用:tsolarisenumerator=class;
tsolaris=class
private
flist:tlist;
public
constructor create;
destructor destroy;override;
procedure createplanet(const name:string);
function getenumerator:tsolarisenumerator;
end;
tplanet=class
private
fname:string;
public
constructor create(const name:string);
property name:string read fname write fname;
end;
tsolarisenumerator=class
private
flist:tlist;
findex:integer;
public
function getcurrent: tplanet;
constructor create(asolaris:tsolaris);
function movenext: boolean;
property current:tplanet read getcurrent;
end;
類實現:
以下為引用:constructor tsolaris.create;
begin
flist:=tlist.create;
end;
destructor tsolaris.destroy;
var ptr:pointer;
begin
for ptr in flist do
tobject(ptr).free;
freeandnil(flist);
inherited;
end;
procedure tsolaris.createplanet(const name:string);
begin
flist.add(tplanet.create(name));
end;
function tsolaris.getenumerator:tsolarisenumerator;
begin
result:=tsolarisenumerator.create(self);
end;
constructor tplanet.create(const name:string);
begin
fname:=name;
end;
constructor tsolarisenumerator.create(asolaris:tsolaris);
begin
inherited create;
findex := -1;
flist := asolaris.flist;
end;
function tsolarisenumerator.getcurrent: tplanet;
begin
result := flist[findex];
end;
function tsolarisenumerator.movenext: boolean;
begin
result := findex < flist.count - 1;
if result then
inc(findex);
end;
測試:
以下為引用:const
planets:array[1..9] of string=('mercury','venus','earth','mars','jupiter','saturn','uranus','neptune','pluto');
var solaris:tsolaris;
name:string;
planet:tplanet;
begin
solaris:=tsolaris.create;
for name in planets do
solaris.createplanet(name);
for planet in solaris do
showmessage(planet.name);
solaris.free ;
end;
這裡的**:
以下為引用:for planet in solaris do
showmessage(planet.name);
實際上可以理解被分解成:
以下為引用:with solaris.getenumerator do
begin
try
while movenext do
begin
planet:=current;
showmessage(planet.name );
end;
finally
free;
end;
end;
在vcl中,已經有如下型別已經提供了getenumerator方法:
以下為引用:tlist
tcollection
tstrings
tinte***celist
tcomponent
tmenuitem
tcustomactionlist
tfields
tlistitems
ttreenodes
t*******
SQL Server 2005新特性 五
三 查詢通知sql server 2005引入了對sql server 查詢的通知支援。你可以使用這一功能來傳送乙個命令到sql server,並且要求當其後執行的同樣命令產生不同的結果時,sql server生成乙個通知。這一功能是通過從屬物件檢測到基礎資料的改變來實現的。可用通過多種客戶端api...
VS2005新特性列表
1.收集自msdn vs2005新增 1.1 ide設定 更多,並且可以匯入匯出 1.2 任務列表 增加對列進行排序,在任意行中顯示多行文字等功能 1.3 快捷鍵 個人覺得非常有用 f7 檢視 shift f7 檢視介面 ctrl ctrl shift 上次 下次 游標位置 ctrl 轉到相匹配的大...
SQL Server 2005新特性之感悟
自從microsoft公司推出sql server 2005以後,我還沒真正用過它的新特性,microsoft公司推出新軟體也太快了,目前sql server 2008也推出了,沒辦法,趕不上形式啊!今天我就介紹一下sql server 2005的新特性,和我使用的感受,我會根據一些抽象名詞和個別新...