Компьютерный форум NoWa.cc

Компьютерный форум NoWa.cc (https://nowa.cc/index.php)
-   Delphi (https://nowa.cc/forumdisplay.php?f=300)
-   -   Файловые потоки, нужна помощь... (https://nowa.cc/showthread.php?t=124593)

CrVik 23.10.2007 06:11

Файловые потоки, нужна помощь...
 
Мне нужно из таблицы, в которой есть BLOB поле, в котором записан RTF текст, положить данные в файл (*.doc, *.rtf). После долгих попыток что ли бо такое сделать, получилось следующее:

Код:

var FS: TFileStream;
    BlobStream: TADOBlobStream;
    i:Integer;
begin
  dm.ADOTable.First;
  i:=0;
 while not dm.ADOTable.Eof do
  begin
    FS:=TFileStream.Create( 'File'+ IntToStr(i) + '.doc', fmCreate);
    BlobStream := TADOBlobStream.Create(TBlobField(dm.ADOTable.FieldByName('RTFText')), bmRead);
    BlobStream.Seek(0, soFromBeginning);
    FS.CopyFrom(BlobStream, BlobStream.Size);
    inc(i);
    dm.ADOTable.Next;
 end;

Данный кусок кода выгружает каждую запись таблицы в отдельно созданный файл, а мне нужно что бы все строки таблицы записались в один файл. Как это можно реализовать? :sos:

Mechanist 23.10.2007 15:19

Ответ: Файловые потоки, нужна помощь...
 
Цитата:

Сообщение от CrVik (Сообщение 1216195)
Код:

...
 while not dm.ADOTable.Eof do
  begin
    FS:=TFileStream.Create( 'File'+ IntToStr(i) + '.doc', fmCreate);


Так а зачем ты делаешь создание потока файла в цикле?! Вынеси его за цикл и пиши сколько хочешь записей!

CrVik 23.10.2007 18:03

Ответ: Файловые потоки, нужна помощь...
 
Цитата:

Сообщение от Mechanist (Сообщение 1217034)
Так а зачем ты делаешь создание потока файла в цикле?! Вынеси его за цикл и пиши сколько хочешь записей!

Да вроде все я разобрался как сделать, вот код:
Код:

dm.ADOTable.First;
FS:=TFileStream.Create( 'File.doc', fmCreate);
while not dm.ADOTable.Eof do
  begin
    BlobStream := TADOBlobStream.Create(TBlobField(dm.ADOTable.FieldByName('RTFText')), bmRead);
    BlobStream.Seek(0, soFromBeginning);
    FS.Seek(0, soFromEnd);
    FS.WriteBuffer(BlobStream.Memory^, BlobStream.Size);
FS.WriteBuffer(Buf[1], Length(Buf));
    dm.ADOTable.Next;
  end;

Но если потом открыть этот созданный файл в ворде то он покажет всего лишь одну запись - первую так как при выводе в файл каждая запись содержит заголовок RTF формата:
Код:

{\rtf1\ansi\ansicpg1251\deff0\deflang1049{\fonttbl{\f0\fnil\fcharset204 MS Sans Serif;}{\f1\fswiss\fcharset0 Tahoma;}{\f2\fnil MS Sans Serif;}}
{\colortbl ;\red0\green0\blue0;}
\viewkind4\uc1\pard\cf1\f0\fs24\'ee\'e1\'fa\'ff\'e2\'e0 2 \'e8\'e2\'e0\'ed\'ee\'e2\'e0\lang1033\f1 dgfg\lang1049\f2
\par }
{\rtf1\ansi\ansicpg1251\deff0\deflang1049{\fonttbl{\f0\fswiss\fcharset0 Tahoma;}{\f1\fnil MS Sans Serif;}}
{\colortbl ;\red255\green0\blue0;\red0\green0\blue0;}
\viewkind4\uc1\pard\cf1\lang1033\f0\fs24 werwe rwe rq rqwe rqwe rw r\cf2\lang1049\f1
\par }

Вообщем нужно наверное как то подругому сохранять в файл, наверное придеться пробывать через OLE, вот только не знаю останется ли форматирование текста как изначально в набрано в RichEdit?

Gage 13.11.2007 16:23

Ответ: Файловые потоки, нужна помощь...
 
BlobStream := TADOBlobStream.Create(TBlobField(dm.ADOTable.Field ByName('RTFText')), bmRead);
BlobStream.Seek(0, soFromBeginning);
FS.LoadFromStream(BlobStream);

f0w14 07.12.2007 01:57

Ответ: Файловые потоки, нужна помощь...
 
Цитата:

Сообщение от CrVik (Сообщение 1217303)
Да вроде все я разобрался как сделать, вот код:
Код:

dm.ADOTable.First;
FS:=TFileStream.Create( 'File.doc', fmCreate);
while not dm.ADOTable.Eof do
  begin
    BlobStream := TADOBlobStream.Create(TBlobField(dm.ADOTable.FieldByName('RTFText')), bmRead);
    BlobStream.Seek(0, soFromBeginning);
    FS.Seek(0, soFromEnd);
    FS.WriteBuffer(BlobStream.Memory^, BlobStream.Size);
FS.WriteBuffer(Buf[1], Length(Buf));
    dm.ADOTable.Next;
  end;

Вообщем нужно наверное как то подругому сохранять в файл, наверное придеться пробывать через OLE, вот только не знаю останется ли форматирование текста как изначально в набрано в RichEdit?

Хорошей практикой является оборачивание объектов в блок try...finally, дабы гарантированно освободить память, занимаемую объектом в случае исключительной ситуации (exception) или выхода из процедуры в теле ее цикла.

Код:

FS:=TFileStream.Create( 'File.doc', fmCreate or fmOpenWrite);
try
  while not ....
finally
  FS.Free;
end;

Далее: можно обойтись без множественного приведения (TADOBlobStream).
Если Вы используете визуальный компонент набора данных (TADODataSet или TADOuery), можно просто писать
TBlobField(DataSet1.FieldByName('myblobdata')).Sav eToStream(FS);
или
DataSet1MyBlobData.SaveToStream(FS);
Второй вариант пройдет, если поля набора данных созданы в списке (двойной щелчок по датасету - add all fields), и поле MyBlobData создано как BLOB.

Далее. По поводу того, чтобы писать все файлы из данных в один: в случае RTF это невозможно, т.к. RTF - это не обычный текст, который можно дописывать друг за другом, а текст с тэгами, указывающими на признаки форматирования текста, и просто объединение не даст результат. Надо писать парсер RTF, имхо.
Но в данной теме глубоко не копал, поэтому не претеную на абсолютизм :)

andy5000 05.07.2010 18:54

Re: Файловые потоки, нужна помощь...
 
Пиши в текст а затем в DOC


Текущее время: 20:02. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2026, vBulletin Solutions, Inc. Перевод: zCarot
Copyright ©2004 - 2025 NoWa.cc

Время генерации страницы 0.02284 секунды с 9 запросами