Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Corba";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "Corba";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.015 c
2-1131791244
Cerberus
2005-11-12 13:27
2005.11.27
str в PAnsiChar


5-1112319727
komusito
2005-04-01 05:42
2005.11.27
Как создать графический компонент нестандартного вида


1-1131006973
Ugrael
2005-11-03 11:36
2005.11.27
dbgrid и defaultdrawing


14-1131004493
syte_ser78
2005-11-03 10:54
2005.11.27
GeForse 3 TI 200 DDR 64 Mb manly


2-1131805105
Olga_b
2005-11-12 17:18
2005.11.27
ПРОПИСНЫЕ БУКВЫ!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский