SkinRead.pas
上传用户:xjwsee
上传日期:2008-08-02
资源大小:796k
文件大小:10k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit SkinRead;
  2. {$WARNINGS OFF}
  3. {$HINTS OFF}
  4. interface
  5. {$define skinfile2}
  6. uses Windows, Messages, SysUtils, Classes, Graphics, Controls,Forms,
  7.      FileCtrl,Winconvert,Dialogs;
  8. type
  9.   TSkinHeader = record
  10.      Version:integer;
  11.      DirLen :integer;
  12.      U1     :integer;
  13.      U2     :integer;
  14.   end;
  15.    TSkinReader = class(Tobject)
  16.    private
  17.    protected
  18.    public
  19.       Dir:Tstringlist;
  20.       dirlen,Num:integer;
  21.       sizes:Array[0..1000] of integer;
  22.       ms : Tmemorystream;
  23.       header:TSkinHeader;
  24.       header2:TSkinHeader;
  25.       constructor Create;
  26.       destructor Destroy; override;
  27.       function loadfromfile(const aname:string):boolean;
  28.       procedure readfile( aname:string;m:TmemoryStream);
  29.       procedure readIni(const aname:string;m:TmemoryStream;var fname:string);
  30.       procedure Decompress(source,Dest:TStream);
  31.       function Loadfromstream(r2:Tmemorystream):boolean;
  32.    end;
  33. implementation
  34. constructor TSkinReader.Create;
  35. begin
  36.    dir:=Tstringlist.create;
  37.    ms:=Tmemorystream.create;
  38. end;
  39. destructor TSkinReader.Destroy;
  40. begin
  41.    dir.free;
  42.    ms.free;
  43. end;
  44. function TSkinReader.loadfromfile(const aname:string):boolean;
  45. var r,r2:Tmemorystream;
  46.     s,s1,s2:string;
  47.     i:integer;
  48.     b:boolean;
  49. begin
  50.     b:=false;
  51.     result:=b;
  52.     if not fileexists(aname) then exit;
  53.     s1:= Extractfilepath(aname);
  54.     r:=Tmemorystream.create;
  55.     r2:=Tmemorystream.create;
  56.     try
  57.     r2.loadfromfile(aname);
  58.     Decompress(r2,r);
  59. //    r.loadfromfile(aname);
  60.     r.Seek(0,soFromBeginning);
  61.     r.read(header,sizeof(Tskinheader));
  62.     if header.version=20000 then  begin
  63.        setlength(s,header.dirlen);
  64.        r.read(s[1],header.dirlen);
  65.        dir.text:=lowercase(s);
  66.        Num:=dir.count;
  67.        r.read(sizes[0],num*sizeof(integer));
  68.        i:=(num)*sizeof(integer)+header.dirlen+sizeof(Tskinheader);
  69.        ms.Seek(0,soFromBeginning);
  70.        ms.write(Pointer(Longint(r.Memory)+i)^,r.size-i);
  71.        b:=true;
  72.     end else if header.version=30000 then begin
  73.        setlength(s,$100);
  74.        r.Read(s[1],$100);
  75.        setlength(s,header.dirlen);
  76.        r.read(s[1],header.dirlen);
  77.        dir.text:=lowercase(s);
  78.        Num:=dir.count;
  79.        r.read(sizes[0],num*sizeof(integer));
  80.        i:=(num)*sizeof(integer)+header.dirlen+sizeof(Tskinheader)+$100;
  81.        ms.Seek(0,soFromBeginning);
  82.        ms.write(Pointer(Longint(r.Memory)+i)^,r.size-i);
  83.        b:=true;
  84.     end else if header.version=40000 then begin
  85.        setlength(s,$100);
  86.        r.Read(s[1],$50);
  87.        setlength(s,header.dirlen);
  88.        r.read(s[1],header.dirlen);
  89.        dir.text:=lowercase(s);
  90.        Num:=dir.count;
  91.        r.read(sizes[0],num*sizeof(integer));
  92.        i:=(num)*sizeof(integer)+header.dirlen+sizeof(Tskinheader)+$50;
  93.        ms.Seek(0,soFromBeginning);
  94.        ms.write(Pointer(Longint(r.Memory)+i)^,r.size-i);
  95.        b:=true;
  96.     end else if header.version=50000 then begin
  97.        setlength(s,$100);
  98.        r.Read(s[1],$30);
  99.        setlength(s,header.dirlen);
  100.        r.read(s[1],header.dirlen);
  101.        dir.text:=lowercase(s);
  102.        Num:=dir.count;
  103.        r.read(sizes[0],num*sizeof(integer));
  104.        i:=(num)*sizeof(integer)+header.dirlen+sizeof(Tskinheader)+$30;
  105.        ms.Seek(0,soFromBeginning);
  106.        ms.write(Pointer(Longint(r.Memory)+i)^,r.size-i);
  107.        b:=true;
  108.     end else if header.version=60000 then begin
  109.        setlength(s,$100);
  110.        r.Read(s[1],$75);
  111.        setlength(s,header.dirlen);
  112.        r.read(s[1],header.dirlen);
  113.        dir.text:=lowercase(s);
  114.        Num:=dir.count;
  115.        r.read(sizes[0],num*sizeof(integer));
  116.        i:=(num)*sizeof(integer)+header.dirlen+sizeof(Tskinheader)+$75;
  117.        ms.Seek(0,soFromBeginning);
  118.        ms.write(Pointer(Longint(r.Memory)+i)^,r.size-i);
  119.        b:=true;
  120.     end else if header.version=70000 then begin
  121.        setlength(s,$100);
  122.        r.Read(s[1],$45);
  123.        setlength(s,header.dirlen);
  124.        r.read(s[1],header.dirlen);
  125.        dir.text:=lowercase(s);
  126.        Num:=dir.count;
  127.        r.read(sizes[0],num*sizeof(integer));
  128.        i:=(num)*sizeof(integer)+header.dirlen+sizeof(Tskinheader)+$45;
  129.        ms.Seek(0,soFromBeginning);
  130.        ms.write(Pointer(Longint(r.Memory)+i)^,r.size-i);
  131.        b:=true;
  132.     end else showmessage('This is Older Skin File'#13'Please update to new version !');
  133.     finally
  134.     r.free;
  135.     r2.free;
  136.     end;
  137.     result:=b;
  138. end;
  139. function TSkinReader.loadfromstream(r2:Tmemorystream):boolean;
  140. var r:Tmemorystream;
  141.     s,s1,s2:AnsiString ;//string;
  142.     i:integer;
  143.     b:boolean;
  144. begin
  145.     r:=Tmemorystream.create;
  146.     b:=false;
  147.     try
  148.     Decompress(r2,r);
  149.     r.Seek(0,soFromBeginning);
  150.     r.read(header,sizeof(Tskinheader));
  151.     if header.version=20000 then begin
  152.        setlength(s,header.dirlen);
  153.        r.read(s[1],header.dirlen);
  154.        dir.text:=lowercase(s);
  155.        Num:=dir.count;
  156.        r.read(sizes[0],num*sizeof(integer));
  157.        i:=(num)*sizeof(integer)+header.dirlen+sizeof(Tskinheader);
  158.        ms.Seek(0,soFromBeginning);
  159.        ms.write(Pointer(Longint(r.Memory)+i)^,r.size-i);
  160.        b:=true;
  161.     end else if header.version=30000 then begin
  162.        setlength(s,$200);
  163.        r.Read(s[1],$100);
  164.        setlength(s,header.dirlen);
  165.        r.read(s[1],header.dirlen);
  166.        dir.text:=lowercase(s);
  167.        Num:=dir.count;
  168.        r.read(sizes[0],num*sizeof(integer));
  169.        i:=(num)*sizeof(integer)+header.dirlen+sizeof(Tskinheader)+$100;
  170.        ms.Seek(0,soFromBeginning);
  171.        ms.write(Pointer(Longint(r.Memory)+i)^,r.size-i);
  172.        b:=true;
  173.     end else if header.version=40000 then begin
  174.        setlength(s,$200);
  175.        r.Read(s[1],$50);
  176.        setlength(s,header.dirlen);
  177.        r.read(s[1],header.dirlen);
  178.        dir.text:=lowercase(s);
  179.        Num:=dir.count;
  180.        r.read(sizes[0],num*sizeof(integer));
  181.        i:=(num)*sizeof(integer)+header.dirlen+sizeof(Tskinheader)+$50;
  182.        ms.Seek(0,soFromBeginning);
  183.        ms.write(Pointer(Longint(r.Memory)+i)^,r.size-i);
  184.        b:=true;
  185.     end else if header.version=50000 then begin
  186.        setlength(s,$100);
  187.        r.Read(s[1],$30);
  188.        setlength(s,header.dirlen);
  189.        r.read(s[1],header.dirlen);
  190.        dir.text:=lowercase(s);
  191.        Num:=dir.count;
  192.        r.read(sizes[0],num*sizeof(integer));
  193.        i:=(num)*sizeof(integer)+header.dirlen+sizeof(Tskinheader)+$30;
  194.        ms.Seek(0,soFromBeginning);
  195.        ms.write(Pointer(Longint(r.Memory)+i)^,r.size-i);
  196.        b:=true;
  197.     end else if header.version=60000 then begin
  198.        setlength(s,$100);
  199.        r.Read(s[1],$75);
  200.        setlength(s,header.dirlen);
  201.        r.read(s[1],header.dirlen);
  202.        dir.text:=lowercase(s);
  203.        Num:=dir.count;
  204.        r.read(sizes[0],num*sizeof(integer));
  205.        i:=(num)*sizeof(integer)+header.dirlen+sizeof(Tskinheader)+$75;
  206.        ms.Seek(0,soFromBeginning);
  207.        ms.write(Pointer(Longint(r.Memory)+i)^,r.size-i);
  208.        b:=true;
  209.     end else if header.version=70000 then begin
  210.        setlength(s,$100);
  211.        r.Read(s[1],$45);
  212.        setlength(s,header.dirlen);
  213.        r.read(s[1],header.dirlen);
  214.        dir.text:=lowercase(s);
  215.        Num:=dir.count;
  216.        r.read(sizes[0],num*sizeof(integer));
  217.        i:=(num)*sizeof(integer)+header.dirlen+sizeof(Tskinheader)+$45;
  218.        ms.Seek(0,soFromBeginning);
  219.        ms.write(Pointer(Longint(r.Memory)+i)^,r.size-i);
  220.        b:=true;
  221.     end else showmessage('This is Older Skin File'#13'Please update to new version !');
  222.     finally
  223.     r.free;
  224.     end;
  225.     result:=b;
  226. end;
  227. {$IFDEF skinfile1}
  228. function TSkinReader.loadfromfile(const aname:string):boolean;
  229. var r,r2:Tmemorystream;
  230.     s,s1:string;
  231.     i:integer;
  232.     b:boolean;
  233. begin
  234.     b:=false;
  235.     if not fileexists(aname) then exit;
  236.     s1:= Extractfilepath(aname);
  237.     r:=Tmemorystream.create;
  238.     r2:=Tmemorystream.create;
  239.     try
  240.     r2.loadfromfile(aname);
  241.     Decompress(r2,r);
  242.     r.Seek(0,soFromBeginning);
  243.     r.read(dirlen,sizeof(integer));
  244.     if dirlen>0 then  begin
  245.        setlength(s,dirlen);
  246.        r.read(s[1],dirlen);
  247.        dir.text:=lowercase(s);
  248.        Num:=dir.count;
  249.        r.read(sizes[0],num*sizeof(integer));
  250.        i:=(num+1)*sizeof(integer)+dirlen;
  251.        ms.Seek(0,soFromBeginning);
  252.        ms.write(Pointer(Longint(r.Memory)+i)^,r.size-i);
  253.        b:=true;
  254.     end;
  255.     finally
  256.     r.free;
  257.     r2.free;
  258.     end;
  259.     result:=b;
  260. end;
  261. function TSkinReader.loadfromstream(r2:Tmemorystream):boolean;
  262. var r:Tmemorystream;
  263.     s,s1:string;
  264.     i:integer;
  265.     b:boolean;
  266. begin
  267.     r:=Tmemorystream.create;
  268.     b:=false;
  269.     try
  270.     Decompress(r2,r);
  271.     r.Seek(0,soFromBeginning);
  272.     r.read(dirlen,sizeof(integer));
  273.     if dirlen>0 then begin
  274.        setlength(s,dirlen);
  275.        r.read(s[1],dirlen);
  276.        dir.text:=lowercase(s);
  277.        Num:=dir.count;
  278.        r.read(sizes[0],num*sizeof(integer));
  279.        i:=(num+1)*sizeof(integer)+dirlen;
  280.        ms.Seek(0,soFromBeginning);
  281.        ms.write(Pointer(Longint(r.Memory)+i)^,r.size-i);
  282.        b:=true;
  283.     end;
  284.     finally
  285.     r.free;
  286.     end;
  287.     result:=b;
  288. end;
  289. {$ENDIF}
  290. procedure TSkinReader.Decompress(source,Dest:TStream);
  291. var
  292.    LZH: TLZH;
  293.    Size, Bytes: Longint;
  294. begin
  295.     // Decompress in memory blob.
  296.     LZH := TLZH.Create;
  297.     try
  298.        LZH.StreamIn:= source;
  299.        LZH.StreamOut:=dest;
  300.        LZH.StreamIn.Position := 0;
  301.        LZH.StreamOut.Position := 0;
  302.        // Uncompressed file size
  303.        LZH.StreamIn.Read(size, sizeof(Longint));
  304.        Bytes := Size;
  305.        // Decompress rest of stream.
  306.        LZH.LZHUnpack(Bytes, LZH.GetBlockStream, LZH.PutBlockStream);
  307.     finally
  308.        LZH.Free;
  309.     end;
  310. end;
  311. procedure TSkinReader.readfile( aname:string;m:TmemoryStream);
  312. var i,j:integer;
  313. begin
  314.   m.clear;
  315.   ms.Seek(0,soFromBeginning);
  316.   j:=0;
  317.   aname:=lowercase(aname);
  318.   for i:= 0 to num-1 do begin
  319.     if dir[i]=aname then begin
  320.       m.write(Pointer(Longint(ms.Memory)+j)^,sizes[i]);
  321.       m.Seek(0,soFromBeginning);
  322.       break;
  323.     end;
  324.     inc(j,sizes[i]);
  325.   end;
  326. end;
  327. procedure TSkinReader.readIni(const aname:string;m:TmemoryStream;var fname:string);
  328. var i,j:integer;
  329. begin
  330.   m.clear;
  331.   ms.Seek(0,soFromBeginning);
  332.   j:=0;
  333.   for i:= 0 to num-1 do begin
  334.     if pos(aname,dir[i])>0 then begin
  335.       m.write(Pointer(Longint(ms.Memory)+j)^,sizes[i]);
  336.       m.Seek(0,soFromBeginning);
  337.       fname:=dir[i];
  338.       break;
  339.     end;
  340.     inc(j,sizes[i]);
  341.   end;
  342. end;
  343. end.