Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.27;
Скачать: CL | DM;

Вниз

О вытаскивании картинки из хранилища   Найти похожие ветки 

 
Redhopter ©   (2005-02-16 00:09) [0]

У меня есть Com-хранилище...Организованно оно следующим образом...
RootStorage  
          \str1(хранилище)\str1(поток)
          \str2(хранилище)\str2(поток)
          .....
          \strn(хранилище)\strn(поток)
Т.е. структура хранилища очень проста: названием вложенных хранилищ являются названия bmp-файлов, а потоки - соответсвено уже сами bmp - картинки...Я написал код в Delphi7. Отладчик не находит ошибок, но тем не менее извлечь картинку у меня не получается, потому что какая-то ошибка с адресами памяти...Мне надо показать картинку просто на экране...
вот исходный код

procedure TForm1.Button1Click(Sender: TObject);
var Stg,Temp:IStorage;
   Enum:IEnumStatStg;
   Data:TStatStg;
   Str:IStream;
begin
OleCheck(StgOpenStorage("T1.dat",nil,STGM_READWRITE or STGM_SHARE_EXCLUSIVE,nil,0,Stg));
OleCheck(Stg.EnumElements(0,nil,0,Enum));
While Enum.Next(1,Data,nil)=S_Ok do
begin
  OleCheck(Stg.OpenStorage(Data.pwcsName,nil,STGM_READWRITE or STGM_SHARE_EXCLUSIVE,nil,0,Temp));
  OleCheck(Temp.OpenStream(Data.pwcsName,nil,STGM_READWRITE or STGM_SHARE_EXCLUSIVE,0,Str));
  Image1.Picture.Bitmap.LoadFromStream(TStream(Str));
end;
Stg:=nil;
Enum:=nil;

end;          

Мне кажется, что у меня ошибка в согласовании типов. Но кто их знает...
В общем помогите...Если у кого-нить есть пример загрузки картинки из файла потока, то киньте мне на мыло плиз!


 
VMcL ©   (2005-02-16 00:35) [1]

>>Redhopter ©   (16.02.05 00:09)

>TStream(Str)

Так нельзя делать.

Можно заюзать какой-то такой класс:

 TIStreamAdapter = class(TStream)
 private
   FIStream: IStream;
 protected
   procedure SetSize(NewSize: Integer); override;
 public
   constructor Create(AStream: IStream);
   destructor Destroy; override;
   function Read(var Buffer; Count: Integer): Integer; override;
   function Write(const Buffer; Count: Integer): Integer; override;
   function Seek(Offset: Integer; Origin: Word): Integer; override;
 end;

{ TIStreamAdapter }

constructor TIStreamAdapter.Create(AStream: IStream);
begin
 inherited Create;

 if AStream = nil then
   raise EStreamError.CreateFmt(
     "%s: cannot be created with AStream = nil.", [ClassName]);

 FIStream := AStream;
end;

destructor TIStreamAdapter.Destroy;
begin
 FIStream := nil;
 inherited;
end;

function TIStreamAdapter.Read(var Buffer; Count: Integer): Integer;
begin
 if FIStream.Read(@Buffer, Count, @Result) <> S_OK then
   Result := 0;
end;

function TIStreamAdapter.Seek(Offset: Integer; Origin: Word): Integer;
var
 Res: Int64;
 HRes: HResult;
begin
 HRes := FIStream.Seek(Offset, Origin, Res);
 if HRes <> S_OK then
   raise EStreamError.CreateFmt("%s.Seek error (%.8X)", [ClassName, HRes]);

 Result := Res;
end;

procedure TIStreamAdapter.SetSize(NewSize: Integer);
var
 Res: HResult;
begin
 Res := FIStream.SetSize(NewSize);
 if Res <> S_OK then
   raise EStreamError.CreateFmt("%s.SetSize error (%.8X)", [ClassName, Res]);
end;

function TIStreamAdapter.Write(const Buffer; Count: Integer): Integer;
var
 Res: HResult;
begin
 Res := FIStream.Write(@Buffer, Count, @Result);
 if Res <> S_OK then
   raise EStreamError.CreateFmt("%s.Write error (%.8X)", [ClassName, Res]);
end;


Потом в Вашем коде:

rocedure TForm1.Button1Click(Sender: TObject);
var
 Stg, Temp: IStorage;
 Enum: IEnumStatStg;
 Data: TStatStg;
 Str: IStream;
 Adapter: TIStreamAdapter;
begin
 OleCheck(StgOpenStorage("T1.dat",nil,STGM_READWRITE or STGM_SHARE_EXCLUSIVE,nil,0,Stg));
 OleCheck(Stg.EnumElements(0,nil,0,Enum));
 while Enum.Next(1, Data, nil) = S_OK do
 begin
   OleCheck(Stg.OpenStorage(Data.pwcsName,nil,STGM_READWRITE or STGM_SHARE_EXCLUSIVE,nil,0,Temp));
   OleCheck(Temp.OpenStream(Data.pwcsName,nil,STGM_READWRITE or STGM_SHARE_EXCLUSIVE,0,Str));
   Adapter := TIStreamAdapter.Create(Str);
   try
     Image1.Picture.Bitmap.LoadFromStream(Adapter);
   finally
     Adapter.Free;
   end;
 end;
end;          


 
Набережных С. ©   (2005-02-16 08:43) [2]

>VMcL ©   (16.02.05 00:35) [1]

TOleStream из AxCtrls.



Страницы: 1 вся ветка

Текущий архив: 2005.11.27;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.024 c
1-1130923212
СергейА
2005-11-02 12:20
2005.11.27
Как поменять кодовую страницу в текстовом файле на 866? Спасибо!


4-1127404057
FunkyByte
2005-09-22 19:47
2005.11.27
Перехват API-функции


2-1131432230
kami
2005-11-08 09:43
2005.11.27
Ошибка 1048


2-1131304186
ЯТутаНовичек
2005-11-06 22:09
2005.11.27
Помогите с TDate


6-1124020298
Asail
2005-08-14 15:51
2005.11.27
проблема с idHTTP