Компьютерный форум NoWa.cc Здесь может быть Ваша реклама
Правила Форума
редакция от 22.06.2020
Форум .::NoWa.cc::.
Вернуться   Компьютерный форум NoWa.cc > В помощь вебмастеру > Программирование > Delphi

Уважаемые пользователи nowa.cc. Мы работаем для вас более 20 лет и сейчас вынуждены просить о финансовой помощи по оплате за сервер.
Окажите посильную поддержку, мы очень надеемся на вас. Реквизиты для переводов ниже.
Webmoney Webmoney WMZ: Z021474945171 Webmoney WME: E159284508897 Webmoney WMUSDT: T206853643180
Кошелёк для вашей помощи YooMoney 4100117770549562
YooMoney Спасибо за поддержку!

Ответ
 
Опции темы Опции просмотра Language
Старый 23.10.2007, 06:11   #1
Новичок
 
Пол:Мужской
Регистрация: 12.10.2007
Сообщений: 15
Репутация: 10
Exclamation Файловые потоки, нужна помощь...

Мне нужно из таблицы, в которой есть 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;
Данный кусок кода выгружает каждую запись таблицы в отдельно созданный файл, а мне нужно что бы все строки таблицы записались в один файл. Как это можно реализовать?
CrVik вне форума
 
Ответить с цитированием Вверх
Здесь может быть Ваша реклама
Здесь может быть Ваша реклама


Реклама: Заходите на сайт MebelStol.ru: подвесное кресло без стойки - отличные цены и большой выбор!стоимость аренды столовкомод woodvilleИнтеграции Битрикс24полка настенная


Старый 23.10.2007, 15:19   #2
Mechanist
Неактивный пользователь
 
Пол:Мужской
Регистрация: 23.10.2007
Адрес: St.-Petersburg
Сообщений: 6
Репутация: 8
По умолчанию Ответ: Файловые потоки, нужна помощь...

Цитата:
Сообщение от CrVik Посмотреть сообщение
Код:
...
 while not dm.ADOTable.Eof do
   begin
    FS:=TFileStream.Create( 'File'+ IntToStr(i) + '.doc', fmCreate);

Так а зачем ты делаешь создание потока файла в цикле?! Вынеси его за цикл и пиши сколько хочешь записей!
Mechanist вне форума
 
Ответить с цитированием Вверх
Старый 23.10.2007, 18:03   #3
CrVik
Новичок
 
Пол:Мужской
Регистрация: 12.10.2007
Сообщений: 15
Репутация: 10
По умолчанию Ответ: Файловые потоки, нужна помощь...

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

Да вроде все я разобрался как сделать, вот код:
Код:
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?

Последний раз редактировалось CrVik; 23.10.2007 в 18:16..
CrVik вне форума
 
Ответить с цитированием Вверх
Старый 13.11.2007, 16:23   #4
Gage
Новичок
 
Пол:Мужской
Регистрация: 13.11.2007
Сообщений: 10
Репутация: 2
По умолчанию Ответ: Файловые потоки, нужна помощь...

BlobStream := TADOBlobStream.Create(TBlobField(dm.ADOTable.Field ByName('RTFText')), bmRead);
BlobStream.Seek(0, soFromBeginning);
FS.LoadFromStream(BlobStream);
Gage вне форума
 
Ответить с цитированием Вверх
Старый 07.12.2007, 01:57   #5
f0w14
Новичок
 
Аватар для f0w14
 
Пол:Мужской
Регистрация: 07.04.2007
Сообщений: 25
Репутация: 7
По умолчанию Ответ: Файловые потоки, нужна помощь...

Цитата:
Сообщение от CrVik Посмотреть сообщение
Да вроде все я разобрался как сделать, вот код:
Код:
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, имхо.
Но в данной теме глубоко не копал, поэтому не претеную на абсолютизм
f0w14 вне форума
 
Ответить с цитированием Вверх
Старый 05.07.2010, 18:54   #6
andy5000
Неактивный пользователь
 
Регистрация: 05.07.2010
Сообщений: 6
Репутация: 0
По умолчанию Re: Файловые потоки, нужна помощь...

Пиши в текст а затем в DOC
andy5000 вне форума
 
Ответить с цитированием Вверх
Ответ


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна помощь! GgreenpowerP Настройка интернета 2 29.01.2009 08:40
нужна помощь! lar_gur Помощь по играм 1 18.12.2007 15:00
Нужна помощь в ответе на вопрос, причем нужна сегодня(15 марта). prosmith Архив 1 15.03.2007 20:57

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


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


Copyright ©2004 - 2025 NoWa.cc

Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2026, vBulletin Solutions, Inc. Перевод: zCarot
Время генерации страницы 0.12876 секунды с 13 запросами