Форум: "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