PDA

View Full Version : باز کردن فایل skn مربوط به برنامه نوشته شده با دلفی



sempaisaleh
یک شنبه 25 مرداد 1394, 13:23 عصر
با سلام خدمت دوستان
من یه برنامه حسابداری دارم که با دلفی نوشته شده. ولی نمیدونم کدوم نسخه از دلفی.
تو این برنامه از فایلی با پسوند Skn برای اسکین استفاده شده. با نرم افزار vclskin builder ویرایش کردم ولی قابل استفاده نیست. ارور میگیره برنامه.
میگه :

This is Older sKIN fILE.
please Update to New Version
فکر میکنین مشکل از کجاست؟

sempaisaleh
دوشنبه 26 مرداد 1394, 07:35 صبح
توی این تاپیک (http://barnamenevis.org/showthread.php?115695-VCL-Skin-%DA%86%D8%B1%D8%A7-%D8%B2%D9%85%D8%A7%D9%86%DB%8C-%DA%A9%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%B1%D9%88-%D8%A7%D8%AC%D8%B1%D8%A7-%D9%85%DB%8C-%DA%A9%D9%86%D9%85) هم بحث شده ولی ایجاد کننده تاپیک مشخص نکرده مشکل اصلی از کجاست.
ضمنا یک سری کد پیدا کردم که توی اون یک شرط هست که نمیدونم اصلا به این کامپوننت مربوط میشه یا نه

end else if header.version=50000 then begin
setlength(s,$100);
r.Read(s[1],$30);
setlength(s,header.dirlen);
r.read(s[1],header.dirlen);
dir.text:=lowercase(s);
Num:=dir.count;
r.read(sizes[0],num*sizeof(integer));
i:=(num)*sizeof(integer)+header.dirlen+sizeof(Tski nheader)+$30;
ms.Seek(0,soFromBeginning);
ms.write(Pointer(Longint(r.Memory)+i)^,r.size-i);
b:=true;
end else showmessage('This is Older Skin File'#13'Please update to new version !');

اینم کد اصلی و کامل:

SkinRead.pas



unit SkinRead;

{$WARNINGS OFF}
{$HINTS OFF}

interface

{$define skinfile2}

uses Windows, Messages, SysUtils, Classes, Graphics, Controls,Forms,
FileCtrl,Winconvert,Dialogs;

type
TSkinHeader = record
Version:integer;
DirLen :integer;
U1 :integer;
U2 :integer;
end;

TSkinReader = class(Tobject)
private
protected
public
Dir:Tstringlist;
dirlen,Num:integer;
sizes:Array[0..1000] of integer;
ms : Tmemorystream;
header:TSkinHeader;
header2:TSkinHeader;
constructor Create;
destructor Destroy; override;
function loadfromfile(const aname:string):boolean;
procedure readfile( aname:string;m:TmemoryStream);
procedure readIni(const aname:string;m:TmemoryStream;var fname:string);
procedure Decompress(source,Dest:TStream);
function Loadfromstream(r2:Tmemorystream):boolean;
end;

implementation

constructor TSkinReader.Create;
begin
dir:=Tstringlist.create;
ms:=Tmemorystream.create;
end;

destructor TSkinReader.Destroy;
begin
dir.free;
ms.free;
end;

function TSkinReader.loadfromfile(const aname:string):boolean;
var r,r2:Tmemorystream;
s,s1,s2:string;
i:integer;
b:boolean;
begin
b:=false;
result:=b;
if not fileexists(aname) then exit;
s1:= Extractfilepath(aname);
r:=Tmemorystream.create;
r2:=Tmemorystream.create;
try
r2.loadfromfile(aname);
Decompress(r2,r);
// r.loadfromfile(aname);
r.Seek(0,soFromBeginning);
r.read(header,sizeof(Tskinheader));
if header.version=20000 then begin
setlength(s,header.dirlen);
r.read(s[1],header.dirlen);
dir.text:=lowercase(s);
Num:=dir.count;
r.read(sizes[0],num*sizeof(integer));
i:=(num)*sizeof(integer)+header.dirlen+sizeof(Tski nheader);
ms.Seek(0,soFromBeginning);
ms.write(Pointer(Longint(r.Memory)+i)^,r.size-i);
b:=true;
end else if header.version=30000 then begin
setlength(s,$100);
r.Read(s[1],$100);
setlength(s,header.dirlen);
r.read(s[1],header.dirlen);
dir.text:=lowercase(s);
Num:=dir.count;
r.read(sizes[0],num*sizeof(integer));
i:=(num)*sizeof(integer)+header.dirlen+sizeof(Tski nheader)+$100;
ms.Seek(0,soFromBeginning);
ms.write(Pointer(Longint(r.Memory)+i)^,r.size-i);
b:=true;
end else if header.version=40000 then begin
setlength(s,$100);
r.Read(s[1],$50);
setlength(s,header.dirlen);
r.read(s[1],header.dirlen);
dir.text:=lowercase(s);
Num:=dir.count;
r.read(sizes[0],num*sizeof(integer));
i:=(num)*sizeof(integer)+header.dirlen+sizeof(Tski nheader)+$50;
ms.Seek(0,soFromBeginning);
ms.write(Pointer(Longint(r.Memory)+i)^,r.size-i);
b:=true;
end else if header.version=50000 then begin
setlength(s,$100);
r.Read(s[1],$30);
setlength(s,header.dirlen);
r.read(s[1],header.dirlen);
dir.text:=lowercase(s);
Num:=dir.count;
r.read(sizes[0],num*sizeof(integer));
i:=(num)*sizeof(integer)+header.dirlen+sizeof(Tski nheader)+$30;
ms.Seek(0,soFromBeginning);
ms.write(Pointer(Longint(r.Memory)+i)^,r.size-i);
b:=true;
end else showmessage('This is Older Skin File'#13'Please update to new version !');
finally
r.free;
r2.free;
end;
result:=b;
end;

function TSkinReader.loadfromstream(r2:Tmemorystream):boole an;
var r:Tmemorystream;
s,s1,s2:string;
i:integer;
b:boolean;
begin
r:=Tmemorystream.create;
b:=false;
try
Decompress(r2,r);
r.Seek(0,soFromBeginning);
r.read(header,sizeof(Tskinheader));
if header.version=20000 then begin
setlength(s,header.dirlen);
r.read(s[1],header.dirlen);
dir.text:=lowercase(s);
Num:=dir.count;
r.read(sizes[0],num*sizeof(integer));
i:=(num)*sizeof(integer)+header.dirlen+sizeof(Tski nheader);
ms.Seek(0,soFromBeginning);
ms.write(Pointer(Longint(r.Memory)+i)^,r.size-i);
b:=true;
end else if header.version=30000 then begin
setlength(s,$200);
r.Read(s[1],$100);
setlength(s,header.dirlen);
r.read(s[1],header.dirlen);
dir.text:=lowercase(s);
Num:=dir.count;
r.read(sizes[0],num*sizeof(integer));
i:=(num)*sizeof(integer)+header.dirlen+sizeof(Tski nheader)+$100;
ms.Seek(0,soFromBeginning);
ms.write(Pointer(Longint(r.Memory)+i)^,r.size-i);
b:=true;
end else if header.version=40000 then begin
setlength(s,$200);
r.Read(s[1],$50);
setlength(s,header.dirlen);
r.read(s[1],header.dirlen);
dir.text:=lowercase(s);
Num:=dir.count;
r.read(sizes[0],num*sizeof(integer));
i:=(num)*sizeof(integer)+header.dirlen+sizeof(Tski nheader)+$50;
ms.Seek(0,soFromBeginning);
ms.write(Pointer(Longint(r.Memory)+i)^,r.size-i);
b:=true;
end else if header.version=50000 then begin
setlength(s,$100);
r.Read(s[1],$30);
setlength(s,header.dirlen);
r.read(s[1],header.dirlen);
dir.text:=lowercase(s);
Num:=dir.count;
r.read(sizes[0],num*sizeof(integer));
i:=(num)*sizeof(integer)+header.dirlen+sizeof(Tski nheader)+$30;
ms.Seek(0,soFromBeginning);
ms.write(Pointer(Longint(r.Memory)+i)^,r.size-i);
b:=true;
end else showmessage('This is Older Skin File'#13'Please update to new version !');
finally
r.free;
end;
result:=b;
end;

{$IFDEF skinfile1}
function TSkinReader.loadfromfile(const aname:string):boolean;
var r,r2:Tmemorystream;
s,s1:string;
i:integer;
b:boolean;
begin
b:=false;
if not fileexists(aname) then exit;
s1:= Extractfilepath(aname);
r:=Tmemorystream.create;
r2:=Tmemorystream.create;
try
r2.loadfromfile(aname);
Decompress(r2,r);
r.Seek(0,soFromBeginning);
r.read(dirlen,sizeof(integer));
if dirlen>0 then begin
setlength(s,dirlen);
r.read(s[1],dirlen);
dir.text:=lowercase(s);
Num:=dir.count;
r.read(sizes[0],num*sizeof(integer));
i:=(num+1)*sizeof(integer)+dirlen;
ms.Seek(0,soFromBeginning);
ms.write(Pointer(Longint(r.Memory)+i)^,r.size-i);
b:=true;
end;
finally
r.free;
r2.free;
end;
result:=b;
end;

function TSkinReader.loadfromstream(r2:Tmemorystream):boole an;
var r:Tmemorystream;
s,s1:string;
i:integer;
b:boolean;
begin
r:=Tmemorystream.create;
b:=false;
try
Decompress(r2,r);
r.Seek(0,soFromBeginning);
r.read(dirlen,sizeof(integer));
if dirlen>0 then begin
setlength(s,dirlen);
r.read(s[1],dirlen);
dir.text:=lowercase(s);
Num:=dir.count;
r.read(sizes[0],num*sizeof(integer));
i:=(num+1)*sizeof(integer)+dirlen;
ms.Seek(0,soFromBeginning);
ms.write(Pointer(Longint(r.Memory)+i)^,r.size-i);
b:=true;
end;
finally
r.free;
end;
result:=b;
end;
{$ENDIF}

procedure TSkinReader.Decompress(source,Dest:TStream);
var
LZH: TLZH;
Size, Bytes: Longint;
begin
// Decompress in memory blob.
LZH := TLZH.Create;
try
LZH.StreamIn:= source;
LZH.StreamOut:=dest;
LZH.StreamIn.Position := 0;
LZH.StreamOut.Position := 0;

// Uncompressed file size
LZH.StreamIn.Read(size, sizeof(Longint));
Bytes := Size;

// Decompress rest of stream.
LZH.LZHUnpack(Bytes, LZH.GetBlockStream, LZH.PutBlockStream);
finally
LZH.Free;
end;
end;

procedure TSkinReader.readfile( aname:string;m:TmemoryStream);
var i,j:integer;
begin
m.clear;
ms.Seek(0,soFromBeginning);
j:=0;
aname:=lowercase(aname);
for i:= 0 to num-1 do begin
if dir[i]=aname then begin
m.write(Pointer(Longint(ms.Memory)+j)^,sizes[i]);
m.Seek(0,soFromBeginning);
break;
end;
inc(j,sizes[i]);
end;
end;

procedure TSkinReader.readIni(const aname:string;m:TmemoryStream;var fname:string);
var i,j:integer;
begin
m.clear;
ms.Seek(0,soFromBeginning);
j:=0;
for i:= 0 to num-1 do begin
if pos(aname,dir[i])>0 then begin
m.write(Pointer(Longint(ms.Memory)+j)^,sizes[i]);
m.Seek(0,soFromBeginning);
fname:=dir[i];
break;
end;
inc(j,sizes[i]);
end;
end;

end.

hadisalahi2
دوشنبه 26 مرداد 1394, 09:51 صبح
پیامش مربوط به اینه که این نسخه اسکین قدیمیه و ساپورت نمیشه
باید نسخه جدید رو نصب کنی

sempaisaleh
دوشنبه 26 مرداد 1394, 09:59 صبح
پیامش مربوط به اینه که این نسخه اسکین قدیمیه و ساپورت نمیشه
باید نسخه جدید رو نصب کنی

دارم با نسخه 7 برنامه vclskin Builder کار میکنم نسخه بالاتر هم داره مگه؟

sempaisaleh
دوشنبه 26 مرداد 1394, 10:10 صبح
اینم فایل skn که میگم (http://up.persianscript.ir/do.php?filename=0d6b-SData.rar). کسی میتونه بگه با چه نسخه ای باید ویرایش بشه.

hadisalahi2
دوشنبه 26 مرداد 1394, 17:55 عصر
من خودم از اسکین های آلفا استفاده میکنم و راضی هم هستم
با این کامپوننت که میگی کار نکردم
اما توی پیامی که نوشتی میگه فایل اسکین قدیمی هستش

امکان داره فایلی که داری در نسخه های بالاتر پشتیبانی نمیشه