Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.08.2012, 10:20   #1
Exact
Пользователь
 
Регистрация: 06.12.2007
Сообщений: 33
По умолчанию Потеря фокуса при обработке файлов

Странно, но больше причин не вижу (хотя не исключаю, что слепой), но судя по всему, когда программа delphi теряет фокус - она выдает ошибку I/O Error 6. Иногда "invalid floating point operation". Если фокус не менять, то программа может работать долго (очень долго) и никакиих ошибок не выдается.. Хотя и при смене фокуса не всегда вылетает, но если вылетает - то тогда, когда фокус менялся)

Суть программы - периодически (по таймеру) находится самый последний файл в каталоге, считывается самая последняя строчка и данные отправляются на сервер...

Как это исправить? Помогите пожалуйста

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdHTTP, ExtCtrls, Spin;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Timer1: TTimer;
    Label2: TLabel;
    Button2: TButton;
    Label3: TLabel;
    SpinEdit1: TSpinEdit;
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
const
DIR='PCsensor/TEMPer V23.3/Data/';

var
  Form1: TForm1;


implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var searchResult: TSearchRec;
    f: textfile;
    st: string;
    lastDateTemp: TDateTime ;
    dateTemp: TDateTime ;
    lastNameTemp: String;
    html:WideString;
    data: TStringList;
    http: TidHttp;
begin
Timer1.Enabled:=false;
lastNameTemp:='';
if FindFirst(DIR+'*', faAnyFile, searchResult) = 0 then
  begin
     repeat
       if (copy(searchResult.Name,Length(searchResult.Name)-3,Length(searchResult.Name))='.txt') then
       begin
          dateTemp:=FileDateToDateTime(FileAge(DIR+searchResult.Name));
          if (lastDateTemp<=dateTemp) then
          begin
            lastDateTemp:=dateTemp;
            lastNameTemp:=DIR+searchResult.Name;
          end;
        end;
     until FindNext(searchResult) <> 0;
    FindClose(searchResult);
    end;
     label2.caption:='Ôàéë: '+lastNameTemp;
    assignfile(f,lastNameTemp);
    {$I-}
    Reset(f);
    {$I+}
    if IOResult <> 0 then
    begin
      MessageDlg('Îøèáêà äîñòóïà ê ôàéëó ' + lastNameTemp,mtError,[mbOk],0);
      exit;
    end;
    while not eof(f) do
    begin
      {$I-}
      readln(f,st);
      {$I+}
      if IOResult <> 0 then
      begin
        MessageDlg('Îøèáêà äîñòóïà ê ôàéëó ' + lastNameTemp,mtError,[mbOk],0);
        exit;
      end;
    end;
    closefile(f);
    data:=TStringList.Create;
    data.add('t='+st);
    http:= TIdHTTP.Create(nil);
    st:=http.Post('http://chaiknet.ru/weather/temperature/',data);
    //st:=http.Post('http://www.mysite.ru/',data);
    data.Free;
    http.Free;
    label1.caption:='Äàííûå: '+st;
    Timer1.Enabled:=true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin

Timer1.Interval := spinEdit1.value;
Timer1.Enabled := true;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Timer1.Enabled := false;
end;

end.
Exact вне форума Ответить с цитированием
Старый 24.08.2012, 10:28   #2
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Формат файла приведите. Скажем, последние пару строк.
И каким, максимум, может быть размер файла (количество строк)?
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 24.08.2012, 10:41   #3
Exact
Пользователь
 
Регистрация: 06.12.2007
Сообщений: 33
По умолчанию

Формат:
Цитата:
NO,Temp,Time
1,25,06,01.08.2012 0:40:36
2,24,94,01.08.2012 0:40:37
3,25,00,01.08.2012 0:40:38
4,25,00,01.08.2012 0:40:40
5,25,06,01.08.2012 0:40:42
Более 4000, точного значения не знаю

Если поможет ошибку invalid floatin дает на эту строку: dateTemp:=FileDateToDateTime(FileAg e(DIR+searchResult.Name));
Exact вне форума Ответить с цитированием
Старый 24.08.2012, 10:46   #4
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Я бы посоветовал взглянуть на TStringList.
Загрузка в него и использование явно организовано лучше, чем у Вас...

А если нужно строку разделять на параметры - то из каждого итема СтрингЛиста организовывать ещё один СтрингЛист с делимитером ",".
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 24.08.2012, 10:52   #5
Exact
Пользователь
 
Регистрация: 06.12.2007
Сообщений: 33
По умолчанию

Код:
    AStrList := TStringList.Create;
    label2.caption:=lastNameTemp;
    try
      AStrList.LoadFromFile(lastNameTemp);
      st:=AStrList[AStrList.Count - 1];
    finally
      AStrList.Free;
    end; //try
Вот такой констркуцией делал.. Но тоже ошибку давал а потом вернул старой и не дает вроде как%) ниче не понимаю
Exact вне форума Ответить с цитированием
Старый 24.08.2012, 10:55   #6
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Что за ошибка-то?
На какой строке возникает?

Запустите программу под дебагом хотя бы (кнопка Run в дельфи).
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 24.08.2012, 10:56   #7
Exact
Пользователь
 
Регистрация: 06.12.2007
Сообщений: 33
По умолчанию

"invalid floating point operation" дает на эту строку: dateTemp:=FileDateToDateTime(FileAg e(DIR+searchResult.Name));
Exact вне форума Ответить с цитированием
Старый 24.08.2012, 11:16   #8
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

А зачем тебе конвертировать дату в TDateTime, если ты её выводить не собираешься ни куда, а только сравниваешь?

http://www.delphibasics.ru/FileAge.php

Оперируй с простыми типами и делай проверку на возврат значения -1

Ещё одно...
Код:
if (copy(searchResult.Name,Length(searchResult.Name)-3,Length(searchResult.Name))='.txt') then
Используй это http://www.delphibasics.ru/ExtractFileExt.php

А ещё лучше
Код:
FindFirst(DIR+'*.txt', faAnyFile, searchResult)
И сделай защиту от дурака в варианте, если файлы не будут найдены.
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}

Последний раз редактировалось Johnson; 24.08.2012 в 11:23.
Johnson вне форума Ответить с цитированием
Старый 24.08.2012, 11:25   #9
Exact
Пользователь
 
Регистрация: 06.12.2007
Сообщений: 33
По умолчанию

Спасибо, через часик попробую - отпишусь. Что странно, ошибка то возникает регулярно (каждую потерю фокуса), то её не дождешься и как будто её вовсе нет... В общем, буду пробовать и модифицировать. Спасибо за наводки и подсказки. А где можно инфу по Формату даты файла почитать, как получается это число, что это за тип такой? Чет я толковой инфы не нашел
Exact вне форума Ответить с цитированием
Старый 24.08.2012, 11:38   #10
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Я думаю, что потеря фокуса это косвенная причина. Хотя черт его знает, смотреть надо.

Есть мысль ещё, что IO ошибки были из-за того, что вы пытались открыть файл, который открыт уже другой програмой.
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TWebBrowser - потеря фокуса в MDI application AvRob Компоненты Delphi 2 30.07.2012 18:46
Потеря фокуса Edit Fon_Blut Компоненты Delphi 6 30.05.2012 23:09
Потеря фокуса Naive JavaScript, Ajax 1 16.11.2010 05:53
Затруднение при обработке строк GoodTimes Общие вопросы C/C++ 6 16.06.2010 18:00
Потеря фокуса окна в приложении Dr.Badnezz Общие вопросы Delphi 4 01.12.2008 23:18