Как ни странно, с небольшим не сложилось.
Могу тебе предложить такую процедуру (DFileName - имя файла, в который надо вставить содержимое RichEdit; RichEdit - RichEdit, содержимое которого надо вставить в файл). Есть два нюанса: 1. нет обработки ошибок; 2. указывая параметр InsertionPoint, надо учитывать, что в конце строки есть два символа (0x0D и 0x0A)
| Код | procedure InsertRichEdit2File(DFileName: string; RichEdit: TRichEdit; InsertionPoint: longint); const SizeOfBuffer = 1024; type TBuffer = array[0..SizeOfBuffer-1] of Byte; var TemporaryFile1, TemporaryFile2 :TFileStream; DestinationFile :TFileStream; Buffer :^TBuffer; Count :longint; TF1_Size, SecondBlock :longint; begin GetMem(Buffer,sizeof(TBuffer));
// Сохраняем содержимое RichEdit в файле 1.tmp TemporaryFile1 := TFileStream.Create('1.tmp', fmCreate); TemporaryFile1.Write(RichEdit.Lines.Text[1], Length(RichEdit.Lines.Text)); TemporaryFile1.Free;
// Открываем файл-назначение, 1.tmp и 2.tmp TemporaryFile1 := TFileStream.Create('1.tmp', fmOpenRead); TemporaryFile2 := TFileStream.Create('2.tmp', fmCreate); DestinationFile := TFileStream.Create(DFileName, fmOpenRead);
// Определяем количество байт от точки вставки // до конца файла DestinationFile SecondBlock := DestinationFile.Size - InsertionPoint;
// Записываем в 2.tmp часть файла // DestinationFile от начала до точки вставки while InsertionPoint<>0 do begin if InsertionPoint>SizeOfBuffer then Count := SizeOfBuffer else Count := InsertionPoint; DestinationFile.Read(Buffer^,Count); TemporaryFile2.Write(Buffer^,Count);
InsertionPoint := InsertionPoint - Count; end;
// Записываем в файл 2.tmp содержимое файла // 1.tmp (оно же содержимое RichEdit) TF1_Size := TemporaryFile1.Size; while TF1_Size<>0 do begin if TF1_Size>SizeOfBuffer then Count := SizeOfBuffer else Count := TF1_Size; TemporaryFile1.Read(Buffer^,Count); TemporaryFile2.Write(Buffer^,Count);
TF1_Size := TF1_Size - Count; end;
// Записываем в файл 2.tmp оставшуюся часть // файла DestinationFile while SecondBlock<>0 do begin if SecondBlock>SizeOfBuffer then Count := SizeOfBuffer else Count := SecondBlock; DestinationFile.Read(Buffer^,Count); TemporaryFile2.Write(Buffer^,Count);
SecondBlock := SecondBlock - Count; end;
// Делаем так, чтобы файл-назначение содержал то, // что нам нужно TemporaryFile1.Free; TemporaryFile2.Free; DestinationFile.Free; DeleteFile(DFileName); DeleteFile('1.tmp'); RenameFile('2.tmp',DFileName);
FreeMem(Buffer); end; |
Пример использования:
| Код | procedure TForm1.Button1Click(Sender: TObject); begin InsertRichEdit2File('1.txt', RichEdit1, 13); end; | |