全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1817
推到 Plurk!
推到 Facebook!

請問ListView(Style為vsReport)如何從文字檔讀資料

尚未結案
aAlan
一般會員


發表:38
回覆:24
積分:12
註冊:2004-07-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-30 18:09:59 IP:61.228.xxx.xxx 未訂閱
有一文字檔如圖一:    圖一 想要在ListView載入此文字檔成為如圖二 圖二 初步構想是:先將此檔案載入到StringList內,然後ListView再從StringList讀出,可是要如何 把=前面的字串先過濾掉,再讀進ListView內呢? 想了好久,想不出來,希望各位大大能夠不吝指教!多謝了
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-31 23:14:22 IP:218.32.xxx.xxx 未訂閱
aAlan 你好:    只給個提示, 提供參考...你可以看看 TStringList 的 Names 與 Values 屬性, 以及 IndexOfName Method.
aAlan
一般會員


發表:38
回覆:24
積分:12
註冊:2004-07-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-01 23:59:15 IP:61.228.xxx.xxx 未訂閱
謝謝了!我再試試看!希望能試出!    
引言: aAlan 你好: 只給個提示, 提供參考...你可以看看 TStringList 的 Names 與 Values 屬性, 以及 IndexOfName Method. < face="Verdana, Arial, Helvetica">
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-09-02 01:39:30 IP:203.204.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-09-02 09:16:29 IP:61.228.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-09-02 10:02:38 IP:218.15.xxx.xxx 未訂閱
插一个花: 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
采用方法1:当键值相同时,只能取得第一个值,就如上述TXT文件,后两组值与第一组的键值[sunday..Satursday]相同,则默认最先读取的值[1..7],只要键值没变的话,既使您把后两组的数字[1..7]改变为[11..17]得出的值,也是第一组的值,越说越说不清楚
方法 >    ——行径窄处,留一步与人行——
——
        
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-09-03 03:24:38 IP:203.204.xxx.xxx 未訂閱
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-09-03 11:27:09 IP:61.228.xxx.xxx 未訂閱
謝謝您!您真厲害! [quote] 插一个花:
系統時間:2024-05-17 14:37:18
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!