📄 unitstructurestoragefile.pas
字号:
unit UnitStructureStorageFile;
interface
uses SysUtils,Classes,controls,comctrls,extctrls,Graphics,jpeg,ActiveX,AxCtrls,ComObj;
const PassWordLength=12;
type PassWordString=string[PassWordLength];
type
TSSPImageFileList=class
private
FStrListFile:TStringList;
FIndex:integer;
FSSPFileName:string;
{ Private declarations }
public
procedure SetSSPFileName(SSPFileName:string);
function GetSSPFileName:string;
//添加一个文件
procedure Add(FileName:string);
//清空文件列表
procedure Clear;
//删除一个文件
procedure Delete(Index:integer);
//返回文件数目
function GetFileCount:integer;
//设置索引
procedure SetIndex(AIndex:integer);
//返回文件索引
function GetIndex:integer;
//返回当前文件名
function GetCurFileName:string;
//返回下一个文件的文件名
function GetNextFileName:string;
//返回上一个文件的文件名
function GetPreFileName:string;
constructor Create;
destructor Destroy; override;
{ Public declarations }
end;
procedure AddThumbFromStructureStorageFileToImageListAndListView(AStructureStorageFileName:string;
AImageList:TImageList;AListView:TListView);
procedure ShowLargeImageFromStructureStorageFile(AStructureStorageFileName,
ALargeImageFileName: string; AImage: TImage);
function IsCorrectPassWord(AStructureStorageFileName: string;
APassWord: PassWordString):boolean;
function IsRequrePassWord(
AStructureStorageFileName: string): boolean;
var
SSPJpeg:TjpegImage;
SSPImageFileList:TSSPImageFileList;
implementation
{ TImageFileList }
procedure TSSPImageFileList.Add(FileName: string);
begin
FStrListFile.Add(FileName);
end;
procedure TSSPImageFileList.Clear;
begin
FStrListFile.Clear;
Findex:=-1;
end;
constructor TSSPImageFileList.Create;
begin
FStrListFile:=TStringList.Create;
Findex:=-1;
end;
procedure TSSPImageFileList.Delete(Index: integer);
begin
FStrListFile.Delete(Index);
SetIndex(Index-1);
//
end;
destructor TSSPImageFileList.Destroy;
begin
FStrListFile.Free;
inherited;
end;
function TSSPImageFileList.GetCurFileName: string;
begin
result:=FStrListFile.Strings[Findex];
end;
function TSSPImageFileList.GetFileCount: integer;
begin
result:=FStrListFile.Count;
end;
function TSSPImageFileList.GetIndex: integer;
begin
result:=FIndex;
end;
function TSSPImageFileList.GetNextFileName: string;
begin
if Findex=FStrListFile.Count-1 then
Findex:=0
else
inc(Findex);
result:=FStrListFile.Strings[Findex];
end;
function TSSPImageFileList.GetPreFileName: string;
begin
if Findex=0 then
Findex:=FStrListFile.Count-1
else
dec(Findex);
result:=FStrListFile.Strings[Findex];
end;
function TSSPImageFileList.GetSSPFileName: string;
begin
result:=FSSPFileName;
end;
procedure TSSPImageFileList.SetSSPFileName(SSPFileName: string);
begin
FSSPFileName:=SSPFileName;
//
end;
procedure TSSPImageFileList.SetIndex(AIndex: integer);
begin
FIndex:=AIndex;
end;
procedure AddThumbFromStructureStorageFileToImageListAndListView(
AStructureStorageFileName: string; AImageList: TImageList;
AListView: TListView);
var
stgRoot:IStorage;
stgSmallImage:IStorage;
stmSmallImage:IStream;
OleStream:Tolestream;
EnumStatStg:IEnumStatStg;
StatStg:TStatStg;
s:string;
bmp:Tbitmap;
i:integer;
begin
//if not IsRefreshImageFinshi then exit;
//IsReadStructureStorageFileMode:=true;
//打开结构化存储文件,返回根存储stgRoot
SSPImageFileList.SetSSPFileName(AStructureStorageFileName);
SSPImageFileList.Clear;
OleCheck(StgOpenStorage(StringToOleStr(AStructureStorageFileName),nil,
STGM_READWRITE or STGM_SHARE_EXCLUSIVE,nil,0,stgRoot));
//在根存储stgRoot下打开子存储stgSmallImage
OleCheck(stgRoot.OpenStorage('SmallImage',nil, STGM_READWRITE or
STGM_SHARE_EXCLUSIVE,nil,0, stgSmallImage));
OleCheck(stgSmallImage.EnumElements(0,nil,0,EnumStatStg));
bmp:=Tbitmap.Create;
bmp.PixelFormat:=pf24bit;
Aimagelist.Clear;
AListView.Clear;
i:=0;
while EnumStatStg.Next(1,StatStg,nil)=S_OK do
begin
if StatStg.dwType=STGTY_STREAM then
begin
OleCheck(stgSmallImage.OpenStream(StatStg.pwcsName,nil,STGM_READWRITE or
STGM_SHARE_EXCLUSIVE,0,stmSmallImage));
OleStream:=TOleStream.Create(stmSmallImage);
try
bmp.LoadFromStream(OleStream);
Aimagelist.add(bmp,nil);
SSPImageFileList.Add(StatStg.pwcsName);
with AListView.Items.Add do
begin
caption:=StatStg.pwcsName; //为什么不用转换?
ImageIndex:=i;
inc(i);
end;
finally
OleStream.Free;
end;
end;
end;
bmp.Free;
end;
procedure ShowLargeImageFromStructureStorageFile(AStructureStorageFileName,
ALargeImageFileName: string; AImage: TImage);
var
stgRoot:IStorage;
stgLargeImage:IStorage;
stmLargeImage:IStream;
OleStream:Tolestream;
begin
//打开结构化存储文件,返回根存储stgRoot
OleCheck(StgOpenStorage(StringToOleStr(AStructureStorageFileName),nil,
STGM_READWRITE or STGM_SHARE_EXCLUSIVE,nil,0,stgRoot));
//在根存储stgRoot下打开子存储stgSmallImage
OleCheck(stgRoot.OpenStorage('LargeImage',nil, STGM_READWRITE or
STGM_SHARE_EXCLUSIVE,nil,0, stgLargeImage));
OleCheck(stgLargeImage.OpenStream(StringToOleStr(ALargeImageFileName),nil,STGM_READWRITE or
STGM_SHARE_EXCLUSIVE,0,stmLargeImage));
if LowerCase(ExtractFileExt(ALargeImageFileName))='.bmp' then
begin
OleStream:=TOleStream.Create(stmLargeImage);
try
Aimage.Picture.Bitmap.LoadFromStream(OleStream);
finally
OleStream.Free;
end;
end
else if (LowerCase(ExtractFileExt(ALargeImageFileName))='.jpg') or
(LowerCase(ExtractFileExt(ALargeImageFileName))='.jpeg') then
begin
OleStream:=TOleStream.Create(stmLargeImage);
try
SSPJpeg.LoadFromStream(OleStream);
AImage.Picture.Assign(SSPJpeg);
finally
OleStream.Free;
end;
end;
end;
function IsRequrePassWord(
AStructureStorageFileName: string): boolean;
var
stgRoot:IStorage;
stgPassWord:IStorage;
stmPassWord:IStream;
ReadPassWord:PassWordString;
ReadChars:integer;
begin
result:=false;
ReadPassWord:=' '; //12个空格!
//打开结构化存储文件,返回根存储stgRoot
OleCheck(StgOpenStorage(StringToOleStr(AStructureStorageFileName),nil,
STGM_READWRITE or STGM_SHARE_EXCLUSIVE,nil,0,stgRoot));
//在根存储stgRoot下打开子存储stgPassWord
OleCheck(stgRoot.OpenStorage('PassWord',nil, STGM_READWRITE or
STGM_SHARE_EXCLUSIVE,nil,0, stgPassWord));
OleCheck(stgPassWord.OpenStream('PassWordValue',nil,STGM_READWRITE or
STGM_SHARE_EXCLUSIVE,0,stmPassWord));
stmPassWord.Read(@ReadPassWord[1],PassWordLength,@ReadChars);
result:=not (trim(ReadPassWord)='NoPassWord');
end;
function IsCorrectPassWord(AStructureStorageFileName: string;
APassWord: PassWordString):boolean;
var
stgRoot:IStorage;
stgPassWord:IStorage;
stmPassWord:IStream;
ReadPassWord:PassWordString;
ReadChars:integer;
begin
result:=false;
ReadPassWord:=' '; //12个空格!
//打开结构化存储文件,返回根存储stgRoot
OleCheck(StgOpenStorage(StringToOleStr(AStructureStorageFileName),nil,
STGM_READWRITE or STGM_SHARE_EXCLUSIVE,nil,0,stgRoot));
//在根存储stgRoot下打开子存储stgSmallImage
OleCheck(stgRoot.OpenStorage('PassWord',nil, STGM_READWRITE or
STGM_SHARE_EXCLUSIVE,nil,0, stgPassWord));
OleCheck(stgPassWord.OpenStream('PassWordValue',nil,STGM_READWRITE or
STGM_SHARE_EXCLUSIVE,0,stmPassWord));
stmPassWord.Read(@ReadPassWord[1],PassWordLength,@ReadChars);
//showmessage('true :'+ReadPassWord);
//showmessage('length:'+inttostr(length(ReadPassWord)));
//showmessage('2true :'+APassWord);
//showmessage('2length:'+inttostr(length(APassWord)));
result:=(trim(ReadPassWord)=trim(APassWord));
end;
initialization
SSPJpeg:=TjpegImage.Create;
SSPImageFileList:=TSSPImageFileList.Create;
finalization
SSPJpeg.Free;
SSPImageFileList.Free;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -