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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2008, 15:01   #11
NeiL
Пользователь
 
Регистрация: 28.11.2007
Сообщений: 49
По умолчанию

Вообщем-то не стал заморачиваться с API и поиском готовых алгоритмов, а сделал по своему:
Код:
unit UTest;

interface

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

const
  const_msg_FileNotFound       = 'Файл "%s" не найден';
  const_msg_FileModifyed       = 'Файл "%s" был изменен другой программой. Перезагрузить заново?';
  const_msg_ImageFileCorrupted = 'Файл "%s" поврежден или не является изображением';

type

  TFileChangesMonitor = class
  private
    FFileName: string;
    FMsg: Boolean; { Показывать диалог о перезаписи файла }
    FOldFileAge: Integer;
    { ... }
  public
    procedure ApplicationActivate(Sender: TObject);
    procedure HookFileChanges(FileName: string);
    procedure ReloadLocalFile(FileName: string);
    { ... }
  end;

  Tform_Test = class(TForm)
    cmp_btn_FileName: TButton;
    cmp_od_FileName: TOpenDialog;
    procedure cmp_btn_FileNameClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    M: TFileChangesMonitor;
  end;

var
  form_Test: Tform_Test;

implementation

{$R *.dfm}

{ TFileMonitor }

procedure TFileChangesMonitor.ApplicationActivate(Sender: TObject);
var
  CurFileAge: Integer;
begin
  if FFileName <> '' then
  begin
    CurFileAge := FileAge(FFileName);
    if CurFileAge < 0 then
      raise Exception.CreateFmt(const_msg_FileNotFound, [ExtractFileName(FFileName)]);
    if not FMsg then
      if FOldFileAge <> CurFileAge then
      begin
        FMsg := True;
        if MessageDlg(Format(const_msg_FileModifyed, [ExtractFileName(FFileName)]), mtConfirmation, [mbYes, mbNo], 0) = mrYes then
        begin
          try
            ReloadLocalFile(FFileName);
          except
            raise Exception.CreateFmt(const_msg_ImageFileCorrupted, [ExtractFileName(FFileName)]);
          end;
          FMsg := False;
        end
        else
          FMsg := False;
        FOldFileAge := CurFileAge;
      end;
  end;
end;

procedure TFileChangesMonitor.HookFileChanges(FileName: string);
begin
  FFileName := FileName;
  FOldFileAge := FileAge(FileName);
  if FOldFileAge < 0 then
    raise Exception.CreateFmt(const_msg_FileNotFound, [FileName]);
end;

procedure TFileChangesMonitor.ReloadLocalFile(FileName: string);
begin
  { ... }
end;

{ Tform_Test }

procedure Tform_Test.cmp_btn_FileNameClick(Sender: TObject);
begin
  with cmp_od_FileName do
    if Execute and (FileName <> '') then
      M.HookFileChanges(FileName);
end;

procedure Tform_Test.FormCreate(Sender: TObject);
begin
  with cmp_od_FileName do
    Filter := 'JPEG (*.JPEG)|*.jpeg|JPG (*.JPG)|*.jpg| Все файлы| *.*';
  M := TFileChangesMonitor.Create;
  Application.OnActivate := M.ApplicationActivate;
end;

procedure Tform_Test.FormDestroy(Sender: TObject);
begin
  M.Free;
end;

end.
NeiL вне форума Ответить с цитированием
Старый 15.05.2008, 15:39   #12
Noor
Участник клуба
 
Аватар для Noor
 
Регистрация: 01.11.2006
Сообщений: 1,051
По умолчанию

Цитата:
Сообщение от NeiL Посмотреть сообщение
Подскажите, как проверить изменялся ли файл. Задача следующая: имеется форма с компонентом TMemo. В него загружаю текст из некоего текстового файла - Memo.Lines.LoadFromFile(const_def_F ilePath). Теперь открываю этот же файл из Блокнота и дописываю в него какой-нибудь текст. Теперь при возвращении в окно своего приложения (Delphi) необходимо проверить изменялся ли файла, и если данное имело место быть вывести сообщение. ShowMessage('File modified. Reload file ?').
уже был такой вопрос (точно такой же .. буква в букву !!!)
и там посоветовали "сравнивать стоит CRC" тем более что есть специальная компонента для этого.
Noor вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверить тип переменной satana Общие вопросы Delphi 10 20.11.2010 21:43
Как проверить строку? nikleb PHP 6 07.07.2008 22:04
Проверить кратность трем Anita_i Паскаль, Turbo Pascal, PascalABC.NET 2 11.05.2008 10:14
Как проверить, есть ли файл? Dux Общие вопросы Delphi 3 02.04.2008 23:18