Этот код по идее должен работать быстрее с большими файлами. Замены и добавления выделены жирным шрифтом.
var
Result1: String;
S, Minus: integer;
byteArray : array[1..2] of byte;
count : Integer;
Stream: TFileStream;
i: longword;
begin
Result1 := '' ; S:=0; Minus :=0;
// С помощью стандартного диалога получаем имя файла
if not OpenDialog1.Execute then
Exit; // Пользователь отказался выбрать файл
// Пытаемся открыть файл
try
Stream:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
except
// Файл нельзя открыть:
ShowMessage('Невозможно открыть файл ' + OpenDialog1.FileName) ;
Exit;
end;
try
Stream.Seek(S,soFromBeginning);
while Stream.Size>=i do begin
Stream.Read(byteArray, 1); //читаем файл по 1 символу
S:=S+1;//счётчик символов
if GridOriginal.Cells[(LoNibble(byteArray[1]))+1,(HiNibble(byteArray[1]))+1] <> '' then
Result1 := Result1 + GridOriginal.Cells[(LoNibble(byteArray[1]))+1,(HiNibble(byteArray[1]))+1]; //если символ есть в таблице - добавляем его в результат
if GridOriginal.Cells[(LoNibble(byteArray[1]))+1,(HiNibble(byteArray[1]))+1] <> '' then
Minus := Minus+1; //если символ есть в таблице - увеличиваем переменную Minus
if (SpinEdit2.Value < Minus+1) and (GridOriginal.Cells[(loNibble(byteArray[1]))+1,(HiNibble(byteArray[1]))+1] = '') and (Result1 <> '') then
Original.Lines.Add (inttostr(S-Minus)+' '+Result1); // Печатаем результат если последовательность символов, которые есть в таблице, закончилась
if GridOriginal.Cells[(LoNibble(byteArray[1]))+1,(HiNibble(byteArray[1]))+1] = '' then
Result1 := ''; //обнуляем результат если прочитанного символа нет в таблице
if GridOriginal.Cells[(LoNibble(byteArray[1]))+1,(HiNibble(byteArray[1]))+1] = '' then
Minus := 0;
inc(i);
end;
finally
Stream.Free; // Закрываем файл
end;
end;