TClientDataSet.Fields[]; { 字段集合; 它比 FieldList 有更多功能, 如可獲取嵌套字段 }TClientDataSet.FieldList[]; { 字段列表; 它比 Fields 輕便, 如果只是取值用它快一些 }TClientDataSet.FieldByName(); { 根據(jù)字段名稱獲取字段對(duì)象; 獲取一個(gè)字段對(duì)象時(shí)它比上兩個(gè)快 }TClientDataSet.FindField(); { 根據(jù)字段名稱查找字段對(duì)象 }TClientDataSet.FieldValues[]; { 根據(jù)字段名稱獲取字段值; 如果僅是獲取字段值, 這個(gè)最快 }TClientDataSet.First; { 到第一個(gè)記錄 }TClientDataSet.Next; { 到下一個(gè)記錄 }TClientDataSet.Last; { 到最后一個(gè)記錄 }TClientDataSet.Prior; { 到上一個(gè)記錄 }TClientDataSet.RecNo; { 設(shè)置或讀取當(dāng)前記錄的位置 }TClientDataSet.Bof; { 當(dāng)前位置是否是第一個(gè)記錄 }TClientDataSet.Eof; { 當(dāng)前位置是否是最后一個(gè)記錄 }TClientDataSet.RecordSize; { 一個(gè)記錄的大小; 所謂一個(gè)記錄就是當(dāng)前行的所有字段 }TClientDataSet.RecordCount; { 記錄總數(shù); 也就是總行數(shù) }TClientDataSet.GetFieldList(); { 根據(jù)指定的幾個(gè)字段名獲取字段對(duì)象的列表 }TClientDataSet.GetFieldData(); { 把指定字段的值寫入一個(gè)緩沖區(qū) }TClientDataSet.GetCurrentRecord(); { 把當(dāng)前記錄(不包括 Bolb 字段)寫入到一個(gè)緩沖區(qū) }
ACCT_NBR { 類型是 r8, 對(duì)應(yīng) ftFloat, 相當(dāng)于 Double }SYMBOL { 類型是 string, 對(duì)應(yīng) ftString, 相當(dāng)于 AnsiString; 指定 Size=7, 加上空結(jié)束, 大小是 8 }SHARES { 類型是 r8, 對(duì)應(yīng) ftFloat, 相當(dāng)于 Double }PUR_PRICE { 類型是 r8, 對(duì)應(yīng) ftFloat, 相當(dāng)于 Double }PUR_DATE { 類型是 date, 對(duì)應(yīng) ftInteger, 相當(dāng)于 Integer }
{ 準(zhǔn)備數(shù)據(jù), 也可在設(shè)計(jì)時(shí)完成 }procedure TForm1.FormCreate(Sender: TObject);begin ChDir(GetEnvironmentVariable('CommonProgramFiles') + '\CodeGear Shared\Data\'); ClientDataSet1.LoadFromFile('holdings.xml'); DBGrid1.DataSource := DataSource1; DataSource1.DataSet := ClientDataSet1;end;{ 讀取字段值的幾種方法 }procedure TForm1.Button1Click(Sender: TObject);var v1,v2,v3,v4,v5,v6,v7,v8,v9: Variant; num: Double; fName: string;begin { 獲取首字段的名稱 } fName := ClientDataSet1.Fields[0].FieldName; { 獲取第一個(gè)字段值的幾種方法: } v1 := ClientDataSet1.Fields[0].Value; v2 := ClientDataSet1.FieldByName(fName).Value; v3 := ClientDataSet1.FindField(fName).Value; v4 := ClientDataSet1.FieldValues[fName]; v5 := ClientDataSet1[fName]; { FieldValues 是默認(rèn)的數(shù)組屬性 } v6 := ClientDataSet1.FieldList[0].Value; v7 := ClientDataSet1.FieldList.FieldByName(fName).Value; v8 := ClientDataSet1.FieldList.Find(fName).Value; v9 := ClientDataSet1.FieldList.Fields[0].Value; { 已知這個(gè)字段是 Double 類型的, 可同時(shí)轉(zhuǎn)換 } num := ClientDataSet1.Fields[0].AsFloat; { 查看結(jié)果 } with Memo1.Lines do begin Clear; Add(v1); Add(v2); Add(v3); Add(v4); Add(v5); Add(v6); Add(v7); Add(v8); Add(FloatToStr(num)); end;end;{ 遍歷當(dāng)前行字段的幾種方法 }procedure TForm1.Button2Click(Sender: TObject);var Field: TField; i: Integer;begin Memo1.Clear; for Field in ClientDataSet1.Fields do begin Memo1.Lines.Add(Field.Value); end; Memo1.Lines.Add(''); for i := 0 to ClientDataSet1.FieldCount - 1 do begin Memo1.Lines.Add(ClientDataSet1.Fields[i].Value); end; Memo1.Lines.Add(''); for i := 0 to ClientDataSet1.FieldList.Count - 1 do begin Memo1.Lines.Add(ClientDataSet1.FieldList[i].Value); end; Memo1.Lines.Add('');end;{ First、Next、Last、Prior、RecNo }procedure TForm1.Button3Click(Sender: TObject);var s1,s2,s3: string;begin { 讀取第二行第二個(gè)字段 } ClientDataSet1.First; ClientDataSet1.Next; s1 := ClientDataSet1.Fields[1].AsString; { 讀取倒數(shù)第二行第二個(gè)字段 } ClientDataSet1.Last; ClientDataSet1.Prior; s2 := ClientDataSet1.Fields[1].AsString; { 讀取第四行第二個(gè)字段 } ClientDataSet1.RecNo := 4; s3 := ClientDataSet1.Fields[1].AsString; { 查看結(jié)果 } with Memo1.Lines do begin Clear; Add('第二行第二個(gè)字段: ' + s1); Add('倒數(shù)第二行第二個(gè)字段: ' + s2); Add('第四行第二個(gè)字段: ' + s3); end;end;{ 遍歷指定字段的所有記錄 }procedure TForm1.Button4Click(Sender: TObject);var i: Integer;begin if not ClientDataSet1.Bof then ClientDataSet1.First; Memo1.Clear; while not ClientDataSet1.Eof do begin Memo1.Lines.Add(ClientDataSet1.FieldList[0].Value); ClientDataSet1.Next; end; Memo1.Lines.Add('-------'); for i := 1 to ClientDataSet1.RecordCount do begin ClientDataSet1.RecNo := i; Memo1.Lines.Add(ClientDataSet1.FieldList[1].Value); end;end;{ 通過 GetFieldList 可以讀取幾個(gè)指定字段的 TField 對(duì)象的列表 }procedure TForm1.Button5Click(Sender: TObject);var List: TList; Field: TField; i: Integer;begin List := TList.Create; ClientDataSet1.GetFieldList(List, 'ACCT_NBR; SYMBOL; SHARES'); Memo1.Clear; for i := 0 to List.Count - 1 do begin Field := List[i]; Memo1.Lines.Add(Field.Value); end; List.Free;end;{ GetFieldData 讀取字段值到指針 }procedure TForm1.Button6Click(Sender: TObject);var F1: Double; F2: array[0..7] of AnsiChar;begin ClientDataSet1.GetFieldData(ClientDataSet1.Fields[0], @F1); ClientDataSet1.GetFieldData(ClientDataSet1.Fields[1], @F2); with Memo1.Lines do begin Clear; Add(FloatToStr(F1)); Add(F2); end;end;//這是后面的例子用到的函數(shù), 轉(zhuǎn)換 TClientDataSet 時(shí)間格式到 TDateTimefunction TDateTimeRecToDateTime(DataType: TFieldType; Data: TDateTimeRec): TDateTime;var TimeStamp: TTimeStamp;begin case DataType of ftDate: begin TimeStamp.Time := 0; TimeStamp.Date := Data.Date; end; ftTime: begin TimeStamp.Time := Data.Time; TimeStamp.Date := DateDelta; end; else try TimeStamp := MSecsToTimeStamp(Data.DateTime); except TimeStamp.Time := 0; TimeStamp.Date := 0; end; end; Result := TimeStampToDateTime(TimeStamp);end;{ GetCurrentRecord 是把當(dāng)前行的所有字段(不包括 Blob 字段)讀入到緩沖區(qū) }procedure TForm1.Button7Click(Sender: TObject);type THoldingsStruct = packed record { 這是根據(jù) holdings.xml 建立的數(shù)據(jù)結(jié)構(gòu) } ACCT_NBR: Double; SYMBOL: array[0..7] of AnsiChar; { 其 Size=7, 但后面還有個(gè) #0 } SHARES: Double; PUR_PRICE: Double; PUR_DATE: Integer;// Other: array[0..4] of Byte; { 它后面還若干字節(jié)偏移, 測(cè)試時(shí)其字節(jié)數(shù)等于前面的字段數(shù) } end;var buf: THoldingsStruct; DateTimeRec: TDateTimeRec;begin //ShowMessage(IntToStr(ClientDataSet1.RecordSize)); { 可通過這個(gè)值對(duì)照上面的結(jié)構(gòu) } if ClientDataSet1.GetCurrentRecord(@buf) then with Memo1.Lines do begin Clear; Add(FloatToStr(buf.ACCT_NBR)); Add(buf.SYMBOL); Add(FloatToStr(buf.SHARES)); Add(FloatToStr(buf.PUR_PRICE)); DateTimeRec.Date := buf.PUR_DATE; Add(DateToStr(TDateTimeRecToDateTime(ftDate, DateTimeRec))); end;end;
聯(lián)系客服