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

數字填入欄位中

尚未結案
ksing
一般會員


發表:12
回覆:16
積分:5
註冊:2005-06-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-06 12:14:14 IP:59.120.xxx.xxx 未訂閱
有一長串數字字串 ex:00940627000893000580 有欄位規定如:年 日期 編號 價錢 要如何以我定的欄位長度去判斷字串並填入欄位中呢???
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-06 12:27:02 IP:61.70.xxx.xxx 未訂閱
procedure TForm1.Button1Click(Sender: TObject); var s,s1,s2,s3,s4:string; begin s:='00940627000893000580'; s1:=Copy(s,1,4);//0094 s2:=Copy(s,5,4);//0627 s3:=Copy(s,9,6);//000893 s4:=Copy(s,15,6);//000580 end; 第二參數表示從哪邊開始,第三個參數表示要拷貝多少個字 發表人 - supman 於 2005/07/06 12:40:47
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-06 12:29:29 IP:202.62.xxx.xxx 未訂閱
您好﹗    如果此字串中的內容是固定格式的﹐就可以直接使用Copy函數取出部分字串來填入到相對應欄位中﹒ 例﹕
Var
  Str: String;
begin
  Str := '00940627000893000580';
  ADOTable1.FieldByName('年').AsString := Copy(Str, 3, 2);
  //取出Str字串中第三個字元開始﹐長度為2的字串內容﹐即'94'
  //賦給ADOTable1的年欄位
  ....//略
end;
只是需要注意各欄位形態的不同﹐在賦值給資料表欄位時需要對取出的字串內容做形態調整﹐如價錢欄位為Real形態﹐而Str字串中的最后兩位為價錢內容﹐在取出時就需要做形態上的轉換﹐如下﹕ ADOTable1.FieldByName('價錢').AsFloat := StrToFloat(Copy(Str, 19, 2)); ================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
ksing
一般會員


發表:12
回覆:16
積分:5
註冊:2005-06-29

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-06 14:02:35 IP:59.120.xxx.xxx 未訂閱
謝謝兩位解答 但還有以下問題 supman 你好:若是我的數字字串不只一個 而是一個檔案中皆為此種數字字串 亦可用此方法嗎?? cashin2002 你好:我是以STringGrid讀入字串 並無使用ADOTable ADOTable使用是在何處呢? 有應用資料庫的時候嗎?? 謝謝各位不吝解答
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-06 14:17:55 IP:61.70.xxx.xxx 未訂閱
當然可以 procedure TForm1.Button1Click(Sender: TObject); var s,s1,s2,s3,s4:string; begin s:=檔案的值//設一個迴圈去得到值就好了. s1:=Copy(s,1,4);//0094 s2:=Copy(s,5,4);//0627 s3:=Copy(s,9,6);//000893 s4:=Copy(s,15,6);//000580 StringGrid1.Cells[x,y]:=xxx//填入StringGrid中 end;
ksing
一般會員


發表:12
回覆:16
積分:5
註冊:2005-06-29

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-07-06 14:24:55 IP:59.120.xxx.xxx 未訂閱
不知寫成這樣有什麼錯誤 Read(F,book); StringGrid1.Cells[0,row] := Copy(str,3,6) ; StringGrid1.Cells[1,row] := Copy(str,25,6); StringGrid1.Cells[2,row] := book.COMPANY; StringGrid1.Cells[3,row] := book.AUTHOR; Inc(row); (請問上面這句什麼意思? 因為是範例 不知道什麼意思) StringGrid1.RowCount := row; (這句又是什麼意思) 當我這樣去跑出來的時候 竟然前面兩個欄位(因為我是先動兩個欄位的程式碼)沒有讀資料進去 而是從(3,6) (25,6)的地方截斷 直接讀剩下的資料進去後面兩個欄位(欄位三 欄位四) 出了什麼錯呢? 謝謝各位的幫忙以及解答 發表人 - ksing 於 2005/07/06 14:30:32
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-07-06 14:39:41 IP:202.62.xxx.xxx 未訂閱
您好﹗    這是一個使用資料庫時範例的說明﹒    ================================= 有空來瞅瞅我﹗因為我是您的朋友﹐有您真好﹗ ================================
------
忻晟
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-07-06 16:46:58 IP:61.70.xxx.xxx 未訂閱
Read(F,book); StringGrid1.Cells[0,row] := Copy(str,3,6) ; StringGrid1.Cells[1,row] := Copy(str,25,6); StringGrid1.Cells[2,row] := book.COMPANY; StringGrid1.Cells[3,row] := book.AUTHOR; Inc(row); 當我這樣去跑出來的時候 竟然前面兩個欄位(因為我是先動兩個欄位的程式碼)沒有讀資料進去 而是從(3,6) (25,6)的地方截斷 直接讀剩下的資料進去後面兩個欄位(欄位三 欄位四) 你的Read是在做什麼的?你沒有給Str值阿,當然不會有資料進去... Str:=Read(F,book); StringGrid1.Cells[0,row] := Copy(str,3,6) ; StringGrid1.Cells[1,row] := Copy(str,25,6); 應該是要像這樣才對,但不知道你的Read是做什麼的,會不會有傳回值,所以僅猜測. Inc(row); (請問上面這句什麼意思? 因為是範例 不知道什麼意思) StringGrid1.RowCount := row; (這句又是什麼意思) 根據上下兩句猜測應該是 1.Inc(row);//將Row加1,等於row:=row 1; 2.StringGrid1.RowCount := row;//設定StringGrid有幾列.
ksing
一般會員


發表:12
回覆:16
積分:5
註冊:2005-06-29

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-07-07 09:51:24 IP:59.120.xxx.xxx 未訂閱
supman: -------------------------------------------------------- 你的Read是在做什麼的?你沒有給Str值阿,當然不會有資料進去... Str:=Read(F,book); -------------------------------------------------------- 我嘗試 Str:=Read(F,book) 跑的時候卻出錯 以下是我欄位跑掉的情況 為什麼會讀不到 而且是整欄都讀不到呢?? 謝謝各位的幫忙
ksing
一般會員


發表:12
回覆:16
積分:5
註冊:2005-06-29

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-07-07 09:52:32 IP:59.120.xxx.xxx 未訂閱
supman: -------------------------------------------------------- 你的Read是在做什麼的?你沒有給Str值阿,當然不會有資料進去... Str:=Read(F,book); -------------------------------------------------------- 我嘗試 Str:=Read(F,book) 跑的時候卻出錯    以下是我欄位跑掉的情況 為什麼會讀不到 而且是整欄都讀不到呢?? 謝謝各位的幫忙
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-07-07 12:09:03 IP:61.70.xxx.xxx 未訂閱
我問: 你的Read是在做什麼的?你沒有給Str值阿,當然不會有資料進去... Str:=Read(F,book);    你答: 我嘗試 Str:=Read(F,book) 跑的時候卻出錯    牛頭不對馬嘴.... 另外出錯,是出現什麼錯誤訊息,請動動你的手打出來... 這個Read(F,book)會出現錯誤訊息應該是沒有回傳值.    反問你,你前面說的 有一長串數字字串 ex:00940627000893000580 這資料你怎麼得到的???? 也就是說Str資料你從哪填進去的??? StringGrid1.Cells[0,row] := Copy(str,3,6) ;    以下是我欄位跑掉的情況 為什麼會讀不到 而且是整欄都讀不到呢?? 何謂欄位跑掉的情況,你所謂正常不跑掉他應該長什麼樣子?????
JustinShen
中階會員


發表:22
回覆:104
積分:80
註冊:2003-09-20

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-07-07 13:06:51 IP:61.155.xxx.xxx 未訂閱
哈哈,superman桑,不要激动。 显然ksing没有弄清楚Read函数的使用方法。 ksing, 我猜测您的Read(F,Book)是从文档文件中读取字串到Book中,而且使用的是记录式读取方法。也就是说Str实际上是在Book中了,否则时间价钱等等如何可以和book.COMPANY对应? Str:=Read(F,Book)应该不能编译,Read函数不能返回左值。 您将比较完整的读取代码和Book有关代码贴上来,大家才能看清楚呀! Justin Shen
------
====================
我为一切作努力!
Justin Shen

ksing
一般會員


發表:12
回覆:16
積分:5
註冊:2005-06-29

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-07-07 13:57:57 IP:59.120.xxx.xxx 未訂閱
type TBook = record RECDATE : String[10]; CUSNO : String[10]; YYMM : String[10]; AMT : String[10]; end; begin AssignFile(F,datafile); Reset(F); row := 1; try while not EOF(F) do begin Readln(F,str); for i := 1 to 4 do ans[i] := ''; for i := 1 to length(str) do StringGrid1.Cells[0,row] := copy(str,3,6); StringGrid1.Cells[1,row] := copy(str,25,6); StringGrid1.Cells[2,row] := copy(str,16,4); StringGrid1.Cells[3,row] := copy(str,47,9); //讀取資料到1...4的欄位裡頭 Inc(row); StringGrid1.RowCount := row; end; 以上是我依照需求再次改動的程式碼 如JustinShen所說的 的確是由txt檔案中讀出字串 請各位幫忙指正錯誤 謝謝 錯誤圖檔 稍早已上傳
jeff377
初階會員


發表:9
回覆:60
積分:33
註冊:2004-08-10

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-07-07 17:56:11 IP:61.66.xxx.xxx 未訂閱
你用TStrings來載入文字檔,然後一行一行處理會比較方便。    假設來源文字檔為C:\Data.txt,內容如下
 
  00940627000893000580
  00940627000893000581
  00940627000893000582
  00940627000893000583
  00940627000893000584
將資料載入StringGrid的程式碼如下
 
var
  stFile: TStrings;
  N1: Integer;
  sData: String;
begin
  stFile:= TStringList.Create;
  try
    stFile.LoadFromFile('C:\Data.txt');
    StringGrid1.RowCount:= stFile.Count;
    for N1:= 0 to stFile.Count-1 do
    begin
      sData:= stFile.Strings[N1];  //一次讀入一行
      StringGrid1.Cells[1,N1 1] := copy(sData,1,4);
      StringGrid1.Cells[2,N1 1] := copy(sData,5,4);
      StringGrid1.Cells[3,N1 1] := copy(sData,9,6);
      StringGrid1.Cells[4,N1 1] := copy(sData,15,6);
    end;
  finally
    FreeAndNil(stFile);
  end;
end;
ksing
一般會員


發表:12
回覆:16
積分:5
註冊:2005-06-29

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-07-07 18:19:51 IP:59.120.xxx.xxx 未訂閱
謝謝各位的幫忙 非常感謝 jeff377的解法 抓到我的重點 大家的方法都很棒 在此謝謝了
系統時間:2024-06-27 22:30:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!