請問ListView(Style為vsReport)如何從文字檔讀資料 |
尚未結案
|
aAlan
一般會員 發表:38 回覆:24 積分:12 註冊:2004-07-23 發送簡訊給我 |
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
|
aAlan
一般會員 發表:38 回覆:24 積分:12 註冊:2004-07-23 發送簡訊給我 |
|
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
aAlan 你好
以你提供的文字檔內容來看,由於name的部份是一直的重複,當載入到 StringList後,用Value[Name]取得的值永遠會是相同Name的第一個的Value,所 以用Values取值會有誤,底下程式碼先假設文字檔內容,是以空白行作為Record 的分隔(遇到空白行則新增一筆記錄)。 Var SL : TStringList; i:Integer; FldName : String ; begin SL := TStringList.Create; Sl.LoadFromFile('DataFile'); DataSet.Append; //新增一筆記錄 For i:=0 To Sl.Count-1 Do Begin If Trim(Sl[i])='' Then Begin // 檢查是否為空白行 If DataSet.State IN [dsInsert,dsEdit] Then Begin DataSet.Post; End; DataSet.Append; //新增一筆記錄 End; [green]FldName := Sl.Names[i][green]; // 取得Name的值(當作欄位的名稱) // 檢查DataSet是否有FldName這個欄位 If DataSet.FindField(FldName) <> nil Then Begin DataSet.FieldByName(FldName).AsString:= Copy(Sl[i],Length(FldName) 2,Length(Sl[i])); End; End; // 最後也要記得Post If DataSet.State IN [dsInsert,dsEdit] Then Begin DataSet.Post; End; Sl.Free; end;_______________________________________ 深藍的魚,祝您好運..........連連 |
aAlan
一般會員 發表:38 回覆:24 積分:12 註冊:2004-07-23 發送簡訊給我 |
Chance36您好:
謝謝您的回覆,真的很感謝。不過還是有些問題,如下:
1.整個程式好像沒有用到ListView這個元件(在Delphi 7的Win32的TAB內)
2.DataSet這個變數的是屬於哪一個類別呢?我試了dbGrid、StringGrid等
都沒有state這個方法!
以上1,2問題,還望不吝賜教!謝謝了!
引言: aAlan 你好以你提供的文字檔內容來看,由於name的部份是一直的重複,當載入到 StringList後,用Value[Name]取得的值永遠會是相同Name的第一個的Value,所 以用Values取值會有誤,底下程式碼先假設文字檔內容,是以空白行作為Record 的分隔(遇到空白行則新增一筆記錄)。 Var SL : TStringList; i:Integer; FldName : String ; begin SL := TStringList.Create; Sl.LoadFromFile('DataFile'); DataSet.Append; //新增一筆記錄 For i:=0 To Sl.Count-1 Do Begin If Trim(Sl[i])='' Then Begin // 檢查是否為空白行 If DataSet.State IN [dsInsert,dsEdit] Then Begin DataSet.Post; End; DataSet.Append; //新增一筆記錄 End; [green]FldName := Sl.Names[i][green]; // 取得Name的值(當作欄位的名稱) // 檢查DataSet是否有FldName這個欄位 If DataSet.FindField(FldName) <> nil Then Begin DataSet.FieldByName(FldName).AsString:= Copy(Sl[i],Length(FldName) 2,Length(Sl[i])); End; End; // 最後也要記得Post If DataSet.State IN [dsInsert,dsEdit] Then Begin DataSet.Post; End; Sl.Free; end;_______________________________________ 深藍的魚,祝您好運..........連連 |
deity
尊榮會員 發表:90 回覆:876 積分:678 註冊:2003-05-09 發送簡訊給我 |
插一个花:
aAlan您好:
//方法1;利用stringlist的values属性 procedure TForm1.Button1Click(Sender: TObject); Var weeks:TStringList; j:integer; PListItem:TListItem; begin listview1.Items.Clear; weeks:=TStringList.Create; weeks.LoadFromFile('f:\1.txt'); j:=1; PListItem:=ListView1.Items.Add; PListItem.Caption:=weeks.Values[weeks.Names[0]]; //增加第一个节点 while j |
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
aAlan 你好
沒注意到,你是說用TListView來顯示,以下就用ListView做個範例;其實 你也可以舉一反三,只要知道原理不管用什麼元件都是一樣的道理呀! // ListView 抬頭的標題文字(比對用) const cTitle: Array[-1..5] Of String = ('Sunday','Monday','Tuesday' ,'Wednesday','Thursday','Frisday','Satursday'); procedure TForm1.BitBtn1Click(Sender: TObject); Var SL : TStringList; i, j:Integer; Li : TListItem; cName : String; // 增加ListItem並先行卡位 Function AddListItem(Lv : TListView):TListItem; Var i : Integer; Begin Result := Lv.Items.Add; For i:=0 To 5 Do Begin Result.SubItems.Add(''); End; End; begin SL := TStringList.Create; Sl.LoadFromFile('D:\test.data'); ListView1.Items.Clear; Li := AddListItem(ListView1); //新增一筆 For i:=0 To Sl.Count-1 Do Begin If Trim(Sl[i])='' Then Begin // 檢查是否為空白行 Li := AddListItem(ListView1); //新增一筆 End; For j := -1 To 5 Do Begin // 判斷是一個欄位 If CompareText(Sl.Names[i],cTitle[j])=0 Then Begin If j = -1 Then Begin Li.Caption := Copy(Sl[i],Length(Sl.Names[i]) 2,Length(Sl[i])); End Else Begin Li.SubItems[j] := Copy(Sl[i],Length(Sl.Names[i]) 2,Length(Sl[i])); End; Break; End; End; End; Sl.Free; end;PS:上一篇中的DataSet是指TDataSet的後元件,如TTable、TQuery、TAdoDataSet.....等等 _______________________________________ 深藍的魚,祝您好運..........連連 發表人 - chance36 於 2004/09/03 03:26:35 |
aAlan
一般會員 發表:38 回覆:24 積分:12 註冊:2004-07-23 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |