這為什麼是無窮回圈.......? |
尚未結案
|
corey
一般會員 發表:34 回覆:44 積分:14 註冊:2003-04-19 發送簡訊給我 |
unit Unit1; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls; type
TDataRecord=record
DataBuf: array[0..83] of Char;
end; type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
Edit1: TEdit;
Button1: TButton;
ProgressBar1: TProgressBar;
procedure FormShow(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; var
Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormShow(Sender: TObject);
begin
ProgressBar1.Visible := False;
Edit1.Text := 'C:\123.TXT';
Edit1.SetFocus;
end; procedure TForm1.Button1Click(Sender: TObject);
var InputData: TStringList;
ReadRecord: TDataRecord;
i: Integer;
begin
try
InputData:=TStringList.Create;
InputData.LoadFromFile(Edit1.Text);
except
Application.MessageBox('檔案開啟失敗,請檢查檔案路徑是否正確!!','開檔失敗',MB_OK MB_ICONHAND);
Exit;
end;
ProgressBar1.Visible := True;
ProgressBar1.Step := 1;
ProgressBar1.Max := InputData.Count;
for i := 0 to InputData.Count - 1 do
begin
if i <= InputData.Count - 1 then //這一段可以不用的,因為這個回圈停不下來,so....?
if InputData.Strings[i]<>'' then begin
StrLCopy(ReadRecord.DataBuf,PChar(InputData.Strings[i]),SizeOf(ReadRecord));
ProgressBar1.StepIt;
end;
end;
InputData.Free;
end; end. 123.TXT檔案內容如下:
1222233333333334444467777777888888899999999000000abbbbbbbccccccccdeeeefffffffggggggg 可否請各位大大幫忙看一下,debug了久還是不知道錯在那....?
|
azurecloud
中階會員 發表:52 回覆:108 積分:92 註冊:2003-09-04 發送簡訊給我 |
Hi, corey 您好:
請加入紅色這兩行 showmessage (我個人覺得 Debug 時不錯用)
showmessage(inttostr(InputData.Count));
for i := 0 to InputData.Count - 1 do
begin
showmessage('InputData.Count = ' inttostr(i));
if i <= InputData.Count - 1 then //這一段可以不用的,因為這個回圈停不下來,so....?
if InputData.Strings[i]<>'' then begin
StrLCopy(ReadRecord.DataBuf,PChar(InputData.Strings[i]),SizeOf(ReadRecord));
ProgressBar1.StepIt;
end;
end; 您會發現 InputData.Count 的值是 0 然後您又 -1 ,迴圈變成
for i := 0 to -1 do ========================
我要努力向上======================== |
corey
一般會員 發表:34 回覆:44 積分:14 註冊:2003-04-19 發送簡訊給我 |
引言: Hi, corey 您好: 請加入紅色這兩行 showmessage (我個人覺得 Debug 時不錯用) showmessage(inttostr(InputData.Count)); for i := 0 to InputData.Count - 1 do begin showmessage('InputData.Count = ' inttostr(i)); if i <= InputData.Count - 1 then //這一段可以不用的,因為這個回圈停不下來,so....? if InputData.Strings[i]<>'' then begin StrLCopy(ReadRecord.DataBuf,PChar(InputData.Strings[i]),SizeOf(ReadRecord)); ProgressBar1.StepIt; end; end; 您會發現 InputData.Count 的值是 0 然後您又 -1 ,迴圈變成 for i := 0 to -1 do ======================== [blue]請問你有開檔成功嗎?如果有InputData.Count 應該是1(要將123.TXT檔copy 到c:\),所以回圈應該是 for i:=0 to 0 do,不知為什麼回圈就是不停下來? |
00156
高階會員 發表:45 回覆:195 積分:112 註冊:2002-06-01 發送簡訊給我 |
是這行的問題...
StrLCopy(ReadRecord.DataBuf,PChar(InputData.Strings[i]),SizeOf(ReadRecord)); 請改成
StrLCopy(ReadRecord.DataBuf,PChar(InputData.Strings[i]),SizeOf(ReadRecord.DataBuf)-1); 請參考HELP的說明,函數StrLCopy的MaxLen包含null terminator,所以要-1 發表人 - 00156 於 2003/12/19 09:44:40
|
corey
一般會員 發表:34 回覆:44 積分:14 註冊:2003-04-19 發送簡訊給我 |
引言: 是這行的問題... StrLCopy(ReadRecord.DataBuf,PChar(InputData.Strings[i]),SizeOf(ReadRecord)); 請改成 StrLCopy(ReadRecord.DataBuf,PChar(InputData.Strings[i]),SizeOf(ReadRecord.DataBuf)-1); 請參考HELP的說明,函數StrLCopy的MaxLen包含null terminator,所以要-1 發表人 - 00156 於 2003/12/19 09:44:40原來是這麼簡單,真不好意思.... 想請問一下,為什麼上述原因,而導致無窮回圈....? 改成<>>也可以 |
00156
高階會員 發表:45 回覆:195 積分:112 註冊:2002-06-01 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |