Q&A

  • [질문]Text File 읽어오는 프로그램인데 자꾸에러가... 좀 봐주세요.


procedure TForm1.ReadData(s_count:integer; mid,tname:String);
var
F: TextFile;
St: String;
mydate,myTime : TDateTime;
//TmpList: TStringList;
TmpList: TStrings;
i,j ,first, num  : integer;
value,disp,asum,change : array of real;
ssum : real;

//degree,length,temp,x,y,z,db,radians : array of real;
direc,direc2,tablepath,tablename,cPath:string;
simpleX,simpleY, rt_disp, beunhoungule : real;
begin
  SetLength(value  , s_count);
  SetLength(disp  , s_count);
  SetLength(asum    , s_count);
  SetLength(change , s_count);

  St:='';   i:=0;   first := 0;
  if FileExists(inpath1) then
  begin
     GetDir(0,direc);
     if DirectoryExists(outpath1) and (direc <> outpath1)  then ChDir(direc)
     else if not DirectoryExists(outpath1)  then
     begin
       MkDir(outpath1);
       ChDir(outpath1);
     end;
     GetDir(0,direc2);
     cPath := direc2 + '\DataFile1.dat';
     if FileExists(cPath) then DeleteFile(cPath);
     CopyFile1(inpath1,cPath);                   //IO error 방지위해 원본복사
     if Table1.Active then Table1.Close;
     Table1.DisableControls;
     Table1.Databasename := outpath1;
     Table1.Tablename := tname;      //'tb_incline_' + mid + '.db'
     Table1.Open;

     if Table8.Active then Table8.Close;
     Table8.DisableControls;              //경고table의 마지막 날짜 가져오기
     Table8.Databasename := outpath1;
     Table8.Tablename := 'tb_Alarm_' + mid + '.db';    //tb_alarm_tpms_mid.db 에서 바꿈
     Table8.Open;
     if not Table8.Eof then Table8.Last;

     tablepath := ExtractFilePath(inpath1);
     tablename := ExtractFileName(inpath1);
     ChDir(tablepath);
     GetDir(0,direc);
    {$I-}
     AssignFile(F, inpath1);
     Reset(F);
     if Table1.Eof then first := 1
     else begin
       first := 0;
     end;
     try
       while not Eof(F) do
       begin
         Readln(F,St);
         TmpList := TStringList.Create;
         TmpList.CommaText := St;
         i:=TmpList.Count;
         year   := TmpList[1];
         date   := TmpList[2];
         time   := TmpList[3];
         ssum := 0;
         for i:=0 to s_count-1 do
         begin
           value[i] := StrToFloat(TmpList[a_col[i]-1]);
           disp[i] := Sin(3.14159/180*
                             ( a_factor_a[i]
                             +a_factor_b[i]*value[i]
                             +a_factor_c[i]*Power(value[i],2)
                             +a_factor_d[i]*Power(value[i],3)
                             +a_factor_e[i]*Power(value[i],4)
                             +a_factor_f[i]*Power(value[i],5)
                              )
                          ) * a_length[i];
           ssum := ssum + disp[i];
         end;
         CalcDate(year, date, time, myDate,myTime);
                //계측일
         ///////////////////////////////////
         if (myDate>lastDate) or ((myDate=lastDate)and(myTime>lastTime))
            or (myDate+myTime>lastDate+lastTime) then
         begin
           if (myDate+myTime>InitDate+InitTime) or(myDate+myTime=InitDate+InitTime) or (InitDate+InitTime=0) then
           begin
             asum[s_count-1] := ssum;
             for i:=s_count-2 downto 0 do begin
               asum[i] := ssum - disp[i+1];
             end;
             for j:=0 to s_count do
             begin
               if (j<s_count) then begin
                 Table1.Insert;
                 Table1['Date']       := mydate;
                 Table1['Time']       := myTime;
                 Table1['DateTime']   := mydate + myTime;
                 Table1['DateTime2']  := simpleDate + ' ' + simpleTime;
                 if j=0 then  Table1['Depth']      := 0
                 else Table1['Depth']      := depth[j-1];
                 Table1['Value']      := value[j];
                 Table1['Disp']       := SimpleRoundTo(disp[j],-3);
                 Table1['Sum']        := SimpleRoundTo(asum[j] ,-3);
                 change[j]            := asum[j] - isum[j];
                 Table1['Change']     := SimpleRoundTo(change[j],-3);
               end else begin
                 Table1.Insert;
                 Table1['Date']       := mydate;
                 Table1['Time']       := myTime;
                 Table1['DateTime']   := mydate + myTime;
                 Table1['DateTime2']  := simpleDate + ' ' + simpleTime;
                 Table1['Depth']      := depth[j-1];
                 Table1['Value']      := value[j-1];
                 Table1['Disp']       := SimpleRoundTo(disp[j-1],-3);
                 Table1['Sum']        := SimpleRoundTo(asum[j-1] ,-3);
                 change[j]            := asum[j-1] - isum[j-1];
                 Table1['Change']     := SimpleRoundTo(change[j-1],-3);
               end;
               //////////////////////////////
               if (lastalarmdate < Table1.FieldByName('DateTime2').AsString) and (alarm_ok)  then
               begin
                 if (alarm_ok) and (Abs(Table1.FieldByName('Change').AsFloat)>limit/warn_k1) then
                 begin
                   alarm_cnt1[j] := alarm_cnt1[j] + 1;
                   if (ntrigger<=alarm_cnt1[j]) then
                   begin
                     Table8.Insert;
                     Table8['계측일시']   := Table1['DateTime2'];
                     Table8['Kind']   :=  '경사계';
                     Table8['경고계측기'] := '경사계 : ' + Label_mname.Caption + 'Depth:'+FloatToStr(depth[j]);
                     Table8['경고내역']   := '경사계관리기준치 '+ FloatToStr(limit/warn_k1)+ '을'+IntToStr(alarm_cnt1[j])+'번 벗어남';
                     Table8.Post;
                     write_ok := 1;   alarm_cnt1[j] := 0;
                     //SendSms('TPMS', warn_k2, alarm_cnt2[j]);
                   end else begin
                     if write_ok=1 then begin alarm_cnt1[j] := 0;  write_ok:= 0;  end;
                   end;
                 end;
               end;
               //////////////////////////////
             end;
             Table1.Post;

             lastTime := mytime;  lastDate := myDate;
             if myTime=0 then lastTime := 0;
             TmpList.Free;
           end;
         end;
       end;
       //CloseFile(F);
       //{$I+}
     finally
       CloseFile(F);       <------ 이곳에서 에러가 납니다.
       {$I+}
     end;
   // TmpList.Free;
  end;
end;

표시한 부분에서에러창이 뜹니다. 캡쳐해서 파일첨부합니다. 급한데 어찌할지....

3  COMMENTS
  • Profile
    임정미 2008.06.09 09:31
    해결했습니다.

    배열크기는 SetLength(value , s_count); 로 정해놓고

    for 문은 scount+1 만큼 돌리니 그럴 수 밖에.... 창피하네요.
  • Profile
    이정욱 2008.06.09 20:10
    윽.. 도와드리려고 했는데...

    챙피해 하지 마세요 ^^; 전 더 한 실수도 많이 한답니다.ㅜㅜ

    꽤 긴 코드라.. 분석이 좀 필요했습니다. ^^

    해결이 되었다니 다행이네요 ^^

    힘내세요~
  • Profile
    석주현 2008.06.09 22:26
    ㅎㅎ 저도 캡춰해서 분석하다가 말았습니다.

    제가 보긴 코드를 좀 나누고 좀 리펙토링 하셔야 할 것 같습니다.
    보기 너무 힘들어요. ㅠ_ㅠ

    하긴 저도 실수를 요즘 너무 많이해서 함수를 최대한 작게(?) 나누고 있습니다. ^^
    그렇게 하는게 많은 도움이 되더군요.
    • steps
    • 2008.06.14 02:55
    • 1 COMMENTS
    • /
    • 0 LIKES
    • steps
      2008.06.15 02:26
      자답입니다. 코드에서 이미지처리에 리용된 GDI PLUS가 문제였습니다. GDI Plus를 쓴 경우 우의 증상...
    • 화이팅
    • 2008.06.14 00:54
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 깔쌈보이
      2008.06.14 02:51
      with mainf do begin 문장에 보면 name := 어쩌구 구문 있죠? 이 구문에 한글이 들어가서 발생한 오류입...
    • 화이팅
      2008.06.14 03:44
      이름을 바꾸니 위와같은 에러는 발생하지 않네요.. 깔삼보이님 감사합니다^^ 근데 실행을 시키면 아무런...
    • 석주현
      2008.06.19 02:44
      Form2.QuickRep1.Prepare; 를 해주시고 Preview 를 하셔야 합니다.
    • 김길남
    • 2008.06.14 00:08
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 홍성락
      2008.06.13 20:21
      이름으로 찾는 FindComponent를 사용해 보세요. 그리고 FrmMain는 그촘의 이름입니다. <!--CodeS--&...
    • 강태원
      2008.06.13 20:53
      아하 저런 함수가 있었군요. 감사합니다. 이제 할수 있을듯...^^
    • 이정욱
      2008.06.13 21:04
      한가지 더 팁을 알려드리면, FindComponent 를 사용하셔도 무방합니다. 하지만 성능상의 잇점을 조금...
    • 강태원
      2008.06.14 00:15
      아하.. 밑쪽의 방법도 괜찮은데요?^^; 근데 이미 다 해놨는데... 바꿔야 하나...(이놈의 게으름..-...
    • 석주현
      2008.06.14 11:52
      아래쪽의 방법이 더 나은거 같네요. 코드 컴프리트 같은 책이나 아니면 보통 프로그래밍 관련 책들을 ...
    • 천천히
    • 2008.06.11 23:56
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 홍성락
      2008.06.12 02:22
      for문 다음에 rowcount := rowcount + 1; 이렇게하면 보이겠네요. 전번에 처럼 rowcount로 하시면...
    • 홍성락
      2008.06.12 04:38
      2가지 방법으로 해보겠습니다. 1방법은 그냥 넣을때 곰마를 넣습니다, 그러나 실제 데이타와 다르므로 ...
    • 천천히
      2008.06.13 00:06
      님말씀대로 formatfloat 함수
    • 홍성락
      2008.06.13 03:10
      FormatFloat인자가 Variant라서 그런가봅니다 Cells[1, i+1] := FormatFloat('#,##0', StrToFloat(VarTo...
    • 천천히
      2008.06.13 19:09
      홍성락님..답변 감사합니다.. 그런데 또 에러가... ㅠ..ㅠ Cells[1, i+1] := FormatFloat('#,##0', ...
    • 홍성락
      2008.06.13 20:15
      아마 위에서 말한것 처럼 데이타에 숫자가아닌 값이 있나 보네요. try를 사용해 함수내 놓거나 별고 함...
    • 천천히
      2008.06.14 00:26
      감사합니다.. 해결했습니다... ^^; 복 받으세요...
    • 플루토
    • 2008.06.11 01:16
    • 2 COMMENTS
    • /
    • 0 LIKES
    • steps
      2008.06.11 05:23
      파일을 다운로드하든 메모리에 스트림으로 써넣든 클라이언트에 이미지자료가 오기전에는 불가능합니다.
    • 이정욱
      2008.06.11 06:26
      만약 이미지가 커서 그런다면, 이미지 썸네일을 생성 후 받아서 보여주시면 됩니다.
    • 장성호
      2008.06.10 03:14
      <!--CodeS--> procedure TForm1.Button2Click(Sender: TObject); var idx: Integer; begin ...
    • 강태원
      2008.06.10 18:05
      아 C++ 처럼 형변환이 가능하군요. 감사합니다.
    • 석주현
      2008.06.10 03:06
      DateTimeToFileTime(EncodeDateTime(2008,6,9, 17,25,00,00)); EncodeDateTime 으로 한번 해보세요. ...
    • 이정욱
      2008.06.11 00:29
      FileTimeToLocalFileTime 를 참고해보세요 ^^ 우리나라의 GMT 타임 존이 다르기 때문입니다. 위의 ...
    • 석주현
      2008.06.11 09:41
      역씨 정욱님 대단하시네요. ^^ 저도 좋은거 배웠네요.
    • 장성호
      2008.06.10 03:54
      OpenDialog에서 파일명이 들어가는 부분은 ComboBox 입니다. vcl에서도 마찬가지 그렇지만 ComboB...
    • 백록화
      2008.06.10 00:49
      edit 의 imemode 가 imDontCare 이라면...다른 콤포넌트의 영향을 받을수 있습니다. edit1 에 들어오기전...
    • 바다소리
      2008.06.10 01:16
      감사 합니다 검색을위해 호출되는 하위 폼의 edit box에 imemode를 한글로 했었는데 거기서 영향을 ...
    • 임정미
    • 2008.06.07 20:52
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 임정미
      2008.06.09 09:31
      해결했습니다. 배열크기는 SetLength(value , s_count); 로 정해놓고 for 문은 scount+1 만큼 ...
    • 이정욱
      2008.06.09 20:10
      윽.. 도와드리려고 했는데... 챙피해 하지 마세요 ^^; 전 더 한 실수도 많이 한답니다.ㅜㅜ 꽤 긴...
    • 석주현
      2008.06.09 22:26
      ㅎㅎ 저도 캡춰해서 분석하다가 말았습니다. 제가 보긴 코드를 좀 나누고 좀 리펙토링 하셔야 할 것 ...
    • 이정욱
      2008.06.06 13:13
      test (a,b) 로 그냥 호출 하시면 됩니다. 그리고 그냥 ShowMessage(b); 하시면 제데로 출력될 것입니...
    • 플루토
      2008.06.06 20:24
      네 감사합니다. 수정했어요^ ^
    • 구창민
      2008.06.06 03:02
      이정욱님 편역한...델파이7 Check 또는 아래 델마당에 어떤분이 추천하셨던 책이네요.. 류종택님 저서....
    • 홍성락
      2008.06.05 23:29
      자료실에 [문자를 좌로 스크롤 하는 소스-이미지 사용]으로 올렸습니다. 수정하시면서 사용해 보세요
    • 김광식
      2008.06.11 00:54
      감사합니다...
    • 화이팅
    • 2008.06.05 10:18
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 김병윤
      2008.06.05 12:37
      기본적으로 DATA는 Query한값을 --> DataSource를 통해 --> DBGrid에 보여줍니다. 결과적으로 Query의 ...
    • 화이팅
      2008.06.07 05:33
      고맙습니다..^^ 덕분에 잘 해결되었습니다~
    • 왕초보
    • 2008.06.05 02:34
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 석주현
      2008.06.05 03:00
      포트 번호는 보통 Ip를 통해서 호스트를 찾고 포트번호를 통해서 호스트 내의 통신 접속점을 구분하기 위...
    • 장성호
      2008.06.05 06:22
      TServerSocket의 Port를 100000으로 하고 Active=true해 놓은후에 netstat -a 해보세요 TCP 에...
    • 석주현
      2008.06.04 22:54
      디버깅 하시면서 쿼리의 결과가 제대로 나오는지 확인 부터 해보세요. 디비 구성이 어떤지 모르지만 ...
    • 이정욱
      2008.06.04 22:57
      저도 가끔 이런경우를 보는데, 아마도 for 문의 최적화 때문일 수도 있습니다. 디버깅을 해보시면, co...
    • 석주현
      2008.06.04 23:20
      아 그러고 보니 정욱님 말씀 처럼 최적화에 따라 달라지는 경우가 있습니다. 음 저 같으면요. v...