Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.30;
Скачать: CL | DM;

Вниз

Остановка проверки на идентичность   Найти похожие ветки 

 
WhiteGuy ©   (2005-01-17 16:34) [0]

Здорово, Мастера!
Я ображаюсь вот чего:
Раньше я задавал вопрос о том, как проверить два файла на идентичность. Так вот, товарищ begin...end мне написал:

var
// Имена файлов
FileName1, FileName2: String;
// Потоки, с помощью которых можно читать из файлов
FileStream1, FileStream2: TFileStream;
// Указатели на буферы, в которых будут очередные куски данных из файлов
Buffer1, Buffer2: Pointer;
// Размер каждого буфера
// Над размером нужно хорошо подумать
BufferSize: Integer;
// Количество считанных байт на очередном проходе
// Вообще-то эти переменные должны быть равны, но так... на всякий случай...
BytesCount1, BytesCount2: Integer;
// Переменная, указывающая на идентичность файлов
Ident: Boolean;
begin
FileStream1 := TFileStream.Create(FileName1, fmShareDenyNone);
FileStream2 := TFileStream.Create(FileName2, fmShareDenyNone);
if FileStream1.Size <> FileStream2.Size then
begin
  // До свидания, размеры неодинаковые
  FileStream1.Free;
  FileStream2.Free
end
else
begin
  BufferSize := {здесь хорошо думаем};
  // Выделяем память для буферов
  GetMem(Buffer1, BufferSize);
  GetMem(Buffer2, BufferSize);
  try
    repeat
      BytesCount1 := FileStream1.Read(Buffer1^, BufferSize);
      BytesCount2 := FileStream2.Read(Buffer2^, BufferSize);
      if BytesCount1 = BytesCount2 then
        // Непосредственно сравнение кусочков
        Ident := CompareMem(Buffer1, Buffer2, BufferSize);
    until (not Ident) or (BytesCount1 < BufferSize) or (BytesCount2 < BufferSize);
  finally
    // Что бы ни случилось, освобождаем драгоценную память
    FileStream1.Free;
    FileStream2.Free;
    FreeMem(Buffer1, BufferSize);
    FreeMem(Buffer2, BufferSize)
  end
end
end.


Так вот - как зделать, чтобы по нажатию, например, Эск выскакивала форма с двумя кнопками "Продолжить" и "Выход"? Дайте пожалуйста код, помогите нещастному чайнику!


 
Александр Иванов ©   (2005-01-17 16:50) [1]

Недавно был такой вопрос. Варианты:

1. Вынести все в отдельный поток.
2. Использовать глобальную переменную.


 
WhiteGuy ©   (2005-01-18 13:27) [2]

2Александр Иванов
А можно подсказать как, ведь я в Delphi полный новичок! (ламер 8))


 
begin...end ©   (2005-01-18 15:19) [3]

> [2] WhiteGuy ©   (18.01.05 13:27)

А что именно непонятно?

Ну, расскажу про дополнительный поток. Создаёте модуль потока (File -> New -> Other -> Thread Object), в метод Execute которого помещаете вышеприведённый код.

В основном модуле запускаете этот поток (MyThread := TMyThread.Create(False)), а по нажатию кнопки Esc (Form.OnKeyDown) приостанавливаете выполнение потока (MyThread.Suspend), затем вызываете ShowMessage, в котором спрашиваете, продолжить или отменить, и в зависимости от ответа пользователя либо полностью останавливаете выполнение потока (MyThread.Terminate), либо продолжаете его выполнение (MyThread.Resume).

И ничего очень сложного, в общем-то, нет.

---
Sorry, I"m drunk now


 
WhiteGuy ©   (2005-01-18 15:33) [4]

Спасибо!



Страницы: 1 вся ветка

Текущий архив: 2005.01.30;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.03 c
1-1105688775
SIG
2005-01-14 10:46
2005.01.30
Конвертация BLOB в Graphic


1-1106191143
Прогресс
2005-01-20 06:19
2005.01.30
Как сделать приложение на полный экран? Чтоб поверх панели задач?


3-1102105323
korvin
2004-12-03 23:22
2005.01.30
Проблема с передачей параметров в хранимую процедуру


1-1106109186
Marat
2005-01-19 07:33
2005.01.30
Ошибка в FormShow


4-1102306451
TankMan
2004-12-06 07:14
2005.01.30
А как заставить работать WMI на 9х?