![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Остановка проверки на идентичность [D7, WinXP]
WhiteGuy © (2005-01-17 16:34:00)Здорово, Мастера!
Я ображаюсь вот чего:
Раньше я задавал вопрос о том, как проверить два файла на идентичность. Так вот, товарищ 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.
Так вот - как зделать, чтобы по нажатию, например, Эск выскакивала форма с двумя кнопками "Продолжить" и "Выход"? Дайте пожалуйста код, помогите нещастному чайнику!
WhiteGuy (2005-01-18 15:33:00) [1]Спасибо!
begin...end (2005-01-18 15:19:00) [2]> [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 13:27:00) [3]2Александр Иванов
А можно подсказать как, ведь я в Delphi полный новичок! (ламер 8))
Александр Иванов (2005-01-17 16:50:00) [4]Недавно был такой вопрос. Варианты:
1. Вынести все в отдельный поток.
2. Использовать глобальную переменную.