tblobstream сохранить в фйле
От: sowell  
Дата: 14.10.03 07:41
Оценка:
Уважаемые разработчики!
Вопрос про сохранение файла из blob поля,
бьюсь уже не мало времени
для сохранения взял примерчик и написал —
procedure TForm1.Button2Click(Sender: TObject);
var
blb, f: TStream;
begin
  if not IBTable1.FieldByName('DATA').isNull then
    begin
      SaveDialog1.Execute;
      blb:=IBTable1.CreateBlobStream(IBTable1.FieldByName('DATA'),bmRead);
      f := TFileStream.Create(SaveDialog1.FileName, fmCreate);
      f.CopyFrom(blb, blb.Size);
      f.Free;
      blb.Free;
    end
  else
    ShowMessage('Blob is empty');
end;

так вот сохраняет он вордовский файл, но при его открытии ворд никак не может определить кодировку, квадратики там заместо буковок. В базе данные корректные, так как в olecontainer документики открываются. Пробовал и через filestream и blobstream, тоже самое происходит.
Заранее благодарю.
Re: tblobstream сохранить в фйле
От: Slicer [Wirkwood] Россия https://ru.linkedin.com/in/maksim-gumerov-039a701b
Дата: 14.10.03 07:46
Оценка:
А если попробовать вместо вордовского файла сохранять простой текстовик, что получается?

Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Re[2]: tblobstream сохранить в фйле
От: sowell  
Дата: 14.10.03 08:09
Оценка:
Здравствуйте, Slicer [Wirkwood], Вы писали:

SW>А если попробовать вместо вордовского файла сохранять простой текстовик, что получается?


SW>Slicer


сейчас попробую, пробовал бээмпэшник сохранить, тоже битый, не открывается, формат не определяется
Re[2]: tblobstream сохранить в фйле
От: Slicer [Wirkwood] Россия https://ru.linkedin.com/in/maksim-gumerov-039a701b
Дата: 14.10.03 08:35
Оценка:
You can also refer to this
Автор: mailo
Дата: 29.03.03
.

Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Re[3]: tblobstream сохранить в фйле
От: sowell  
Дата: 14.10.03 09:48
Оценка:
Здравствуйте, Slicer [Wirkwood], Вы писали:

SW>You can also refer to this
Автор: mailo
Дата: 29.03.03
.


SW>Slicer


ну а теперь если написать, как советует народ
==
var FS: TFileStream;
BS: TBlobStream;
begin
BS:=TBlobStream.Create(ibtable1.fieldbyname('DATA') as TBlobField, bmRead);
FS:=TFileStream.Create('c:\test.doc', fmCreate);
FS.CopyFrom(bs, bs.size);
end;
==
то ошибка invalid class typecasr на первой строчке
в чем, интересно, грабли?
Re[4]: tblobstream сохранить в фйле
От: Slicer [Wirkwood] Россия https://ru.linkedin.com/in/maksim-gumerov-039a701b
Дата: 14.10.03 10:01
Оценка:
может, для IB надо TIBBLOBField или что-то в этом роде?
Хотя, по идее, должно работать и CreateBLOBStream. Посмотрите, кстати, какой тип она возвращает.

Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Re[4]: tblobstream сохранить в фйле
От: Slicer [Wirkwood] Россия https://ru.linkedin.com/in/maksim-gumerov-039a701b
Дата: 14.10.03 10:03
Оценка:
Ну или пишите TStream вместо TBLOBStream, не так уж и впилось, в конце концов.

Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Re[5]: tblobstream сохранить в фйле
От: sowell  
Дата: 14.10.03 10:13
Оценка:
Здравствуйте, Slicer [Wirkwood], Вы писали:

SW>Ну или пишите TStream вместо TBLOBStream, не так уж и впилось, в конце концов.


SW>Slicer


да у меня тут идея, что я не так сохраняю в базу, т.е. сохраняю я через OleContainer, и получается. что он как-то криво сохраняет, попробую стримом сохранять
Re[6]: tblobstream сохранить в фйле
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 14.10.03 10:37
Оценка: 7 (1)
Здравствуйте, sowell, Вы писали:

S>Здравствуйте, Slicer [Wirkwood], Вы писали:


SW>>Ну или пишите TStream вместо TBLOBStream, не так уж и впилось, в конце концов.


SW>>Slicer


S>да у меня тут идея, что я не так сохраняю в базу, т.е. сохраняю я через OleContainer, и получается. что он как-то криво сохраняет, попробую стримом сохранять

Посмотри методы OleContainer SaveToStream и LoadFromStream. Он сохраняет информацию о положении в виде структуры определенного размера. Помоему заголовочная часть фиксирована. Читай с со смещения равным размером этого блока.
Не ты первый.
и солнце б утром не вставало, когда бы не было меня
Re[5]: tblobstream сохранить в фйле
От: sowell  
Дата: 14.10.03 10:37
Оценка:
Здравствуйте, Slicer [Wirkwood], Вы писали:

SW>Ну или пишите TStream вместо TBLOBStream, не так уж и впилось, в конце концов.


SW>Slicer


а, вот еще что, пробовал я и на прямую из потока сохранять, но тогда при загрузки в olecontainer получается ошибка invalid stream format
Re[6]: tblobstream сохранить в фйле
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 14.10.03 11:00
Оценка:
Здравствуйте, sowell, Вы писали:


 TStreamHeader = record
    case Integer of
      0: ( { New }
        Signature: Integer;
        DrawAspect: Integer;
        DataSize: Integer);
      1: ( { Old }
        PartRect: TSmallRect);
  end;

 if FOldStreamFormat then
  begin
    R := BoundsRect;
    Header.PartRect.Left := R.Left;
    Header.PartRect.Top := R.Top;
    Header.PartRect.Right := R.Right;
    Header.PartRect.Bottom := R.Bottom;
  end else
  begin
    Header.Signature := StreamSignature;
    Header.DrawAspect := FDrawAspect;
  end;
  Header.DataSize := GlobalSize(DataHandle);
  Stream.WriteBuffer(Header, SizeOf(Header));
  Buffer := GlobalLock(DataHandle);
  try
    Stream.WriteBuffer(Buffer^, Header.DataSize);
  finally
    GlobalUnlock(DataHandle);
  end;


Записывай со смещения SizeOf(TStreamHeader)
и солнце б утром не вставало, когда бы не было меня
Re[7]: tblobstream сохранить в фйле
От: sowell  
Дата: 14.10.03 13:15
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Здравствуйте, sowell, Вы писали:



S>[pascal]

S> TStreamHeader = record
S> case Integer of
S> 0: ( { New }
S> Signature: Integer;

понятно примерно, а нельзя ли с примером "для тупых"?
был бы очень признателен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.