m-khorsandi
پنج شنبه 06 آبان 1389, 13:49 عصر
تشخيص نسخههای نصب شده دلفی:
كليدی كه برای تشخيص نسخههای نصب شدهی دلفی يا RAD Studio بر روی يك كامپيوتر بايد در رجيستری چك شود در ريشهی HKEY_CURRENT_USER قرار دارد.
برای بورلند دلفی تا نسخهی 7 از آدرس :
\Software\Borland\Delphi\DelphiVersion
مثال : برای دلفی بايد آدرسی به صورت زير داشته باشيد :
\Software\Borland\Delphi\7.0
برای بورلند دلفی 8 تا BDS 2006 از آدرس :
\Software\Borland\BDS\BdsVersion
مثال : برای BDS 2005 بايد آدرسی به صورت زير داشته باشيد :
\Software\Borland\BDS\2.0
برای CodeGear Rad Studio 2009, 2010 از آدرس :
\Software\CodeGear\BDS\BdsVersion
مثال : برای دلفی 2009 بايد آدرسی به صورت زير داشته باشيد :
\Software\CodeGear\BDS\6.0
و در نهايت برای دلفی XE از آدرس زير استفاده كنيد :
\Software\Embarcadero\BDS\8.0
حالا برای بدست آوردن محل نصب دلفی بايد مقدار ذخيره شده در فيلد App را بخوانيد.
میتوانيد با ساختن يونيتی شبيه به ساختار زير، به همهی اينها دسترسی داشته باشيد.
type
TDelphiVersions =
(
Delphi4,
Delphi5,
Delphi6,
Delphi7,
Delphi8,
Delphi2005,
Delphi2006,
Delphi2007,
Delphi2009,
Delphi2010,
DelphiXE
);
const
DelphiVersionsNames: array[TDelphiVersions] of string = (
'Delphi 4',
'Delphi 5',
'Delphi 6',
'Delphi 7',
'Delphi 8',
'BDS 2005',
'BDS 2006',
'RAD Studio 2007',
'RAD Studio 2009',
'RAD Studio 2010',
'RAD Studio XE'
);
DelphiRegPaths: array[TDelphiVersions] of string = (
'\Software\Borland\Delphi\4.0',
'\Software\Borland\Delphi\5.0',
'\Software\Borland\Delphi\6.0',
'\Software\Borland\Delphi\7.0',
'\Software\Borland\BDS\2.0',
'\Software\Borland\BDS\3.0',
'\Software\Borland\BDS\4.0',
'\Software\Borland\BDS\5.0',
'\Software\CodeGear\BDS\6.0',
'\Software\CodeGear\BDS\7.0',
'\Software\Embarcadero\BDS\8.0');
توابع زير را برای راحتی كار تعريف كنيد :
function RegKeyExists(const RegPath: string;const RootKey :HKEY): Boolean;
var
Reg: TRegistry;
begin
try
Reg := TRegistry.Create;
try
Reg.RootKey := RootKey;
Result := Reg.KeyExists(RegPath);
finally
Reg.Free;
end;
except
Result := False;
end;
end;
function RegReadStr(const RegPath, RegValue:string; var Str: string;const RootKey :HKEY): Boolean;
var
Reg: TRegistry;
begin
try
Reg := TRegistry.Create;
try
Reg.RootKey := RootKey;
Result := Reg.OpenKey(RegPath, True);
if Result then Str:=Reg.ReadString(RegValue);
finally
Reg.Free;
end;
except
Result := False;
end;
end;
procedure ExtractIconFileToImageList(ImageList: TImageList; const Filename: string);
var
FileInfo: TShFileInfo;
begin
if FileExists(Filename) then
begin
FillChar(FileInfo, SizeOf(FileInfo), 0);
SHGetFileInfo(PChar(Filename), 0, FileInfo, SizeOf(FileInfo), SHGFI_ICON or SHGFI_SMALLICON);
if FileInfo.hIcon <> 0 then
begin
ImageList_AddIcon(ImageList.Handle, FileInfo.hIcon);
DestroyIcon(FileInfo.hIcon);
end;
end;
end;
و در آخر ميتوانيم يك ListView را از نتيجهی بدست آمده به علاوهی آيكن دلفی پر كنيم :
Var
item : TListItem;
DelphiComp : TDelphiVersions;
FileName : string;
ImageIndex : Integer;
begin
for DelphiComp := Low(TDelphiVersions) to High(TDelphiVersions) do
if RegKeyExists(DelphiRegPaths[DelphiComp],HKEY_CURRENT_USER) then //check if exist the key
if RegReadStr(DelphiRegPaths[DelphiComp],'App',FileName,HKEY_CURRENT_USER) and FileExists(FileName) then //Now read the App value and check the existence of the file
begin
item:=ListViewIDEs.Items.Add;
item.Caption:=DelphiVersionsNames[DelphiComp];
item.SubItems.Add(FileName);
ExtractIconFileToImageList(ImageList1,Filename); //add the icon to the listview
ImageIndex :=ImageList1.Count-1;
item.ImageIndex:=ImageIndex;
end;
end;
و اين هم نتيجهی نهايی :
http://theroadtodelphi.files.wordpress.com/2010/10/select-delphi-compiler.png?w=449&h=181
پروژه رو ميتونيد از اينجا (http://go2.wordpress.com/?id=725X1342&site=theroadtodelphi.wordpress.com&url=http%3A%2F%2Fdl.dropbox.com%2Fu%2F12733424%2FS electDelphiVersion.rar&sref=http%3A%2F%2Ftheroadtodelphi.wordpress.com%2F 2010%2F10%2F27%2Fdetecting-installed-delphi-versions%2F) دانلود كنيد.
منبع : Detecting installed delphi versions (http://theroadtodelphi.wordpress.com/2010/10/27/detecting-installed-delphi-versions/)
كليدی كه برای تشخيص نسخههای نصب شدهی دلفی يا RAD Studio بر روی يك كامپيوتر بايد در رجيستری چك شود در ريشهی HKEY_CURRENT_USER قرار دارد.
برای بورلند دلفی تا نسخهی 7 از آدرس :
\Software\Borland\Delphi\DelphiVersion
مثال : برای دلفی بايد آدرسی به صورت زير داشته باشيد :
\Software\Borland\Delphi\7.0
برای بورلند دلفی 8 تا BDS 2006 از آدرس :
\Software\Borland\BDS\BdsVersion
مثال : برای BDS 2005 بايد آدرسی به صورت زير داشته باشيد :
\Software\Borland\BDS\2.0
برای CodeGear Rad Studio 2009, 2010 از آدرس :
\Software\CodeGear\BDS\BdsVersion
مثال : برای دلفی 2009 بايد آدرسی به صورت زير داشته باشيد :
\Software\CodeGear\BDS\6.0
و در نهايت برای دلفی XE از آدرس زير استفاده كنيد :
\Software\Embarcadero\BDS\8.0
حالا برای بدست آوردن محل نصب دلفی بايد مقدار ذخيره شده در فيلد App را بخوانيد.
میتوانيد با ساختن يونيتی شبيه به ساختار زير، به همهی اينها دسترسی داشته باشيد.
type
TDelphiVersions =
(
Delphi4,
Delphi5,
Delphi6,
Delphi7,
Delphi8,
Delphi2005,
Delphi2006,
Delphi2007,
Delphi2009,
Delphi2010,
DelphiXE
);
const
DelphiVersionsNames: array[TDelphiVersions] of string = (
'Delphi 4',
'Delphi 5',
'Delphi 6',
'Delphi 7',
'Delphi 8',
'BDS 2005',
'BDS 2006',
'RAD Studio 2007',
'RAD Studio 2009',
'RAD Studio 2010',
'RAD Studio XE'
);
DelphiRegPaths: array[TDelphiVersions] of string = (
'\Software\Borland\Delphi\4.0',
'\Software\Borland\Delphi\5.0',
'\Software\Borland\Delphi\6.0',
'\Software\Borland\Delphi\7.0',
'\Software\Borland\BDS\2.0',
'\Software\Borland\BDS\3.0',
'\Software\Borland\BDS\4.0',
'\Software\Borland\BDS\5.0',
'\Software\CodeGear\BDS\6.0',
'\Software\CodeGear\BDS\7.0',
'\Software\Embarcadero\BDS\8.0');
توابع زير را برای راحتی كار تعريف كنيد :
function RegKeyExists(const RegPath: string;const RootKey :HKEY): Boolean;
var
Reg: TRegistry;
begin
try
Reg := TRegistry.Create;
try
Reg.RootKey := RootKey;
Result := Reg.KeyExists(RegPath);
finally
Reg.Free;
end;
except
Result := False;
end;
end;
function RegReadStr(const RegPath, RegValue:string; var Str: string;const RootKey :HKEY): Boolean;
var
Reg: TRegistry;
begin
try
Reg := TRegistry.Create;
try
Reg.RootKey := RootKey;
Result := Reg.OpenKey(RegPath, True);
if Result then Str:=Reg.ReadString(RegValue);
finally
Reg.Free;
end;
except
Result := False;
end;
end;
procedure ExtractIconFileToImageList(ImageList: TImageList; const Filename: string);
var
FileInfo: TShFileInfo;
begin
if FileExists(Filename) then
begin
FillChar(FileInfo, SizeOf(FileInfo), 0);
SHGetFileInfo(PChar(Filename), 0, FileInfo, SizeOf(FileInfo), SHGFI_ICON or SHGFI_SMALLICON);
if FileInfo.hIcon <> 0 then
begin
ImageList_AddIcon(ImageList.Handle, FileInfo.hIcon);
DestroyIcon(FileInfo.hIcon);
end;
end;
end;
و در آخر ميتوانيم يك ListView را از نتيجهی بدست آمده به علاوهی آيكن دلفی پر كنيم :
Var
item : TListItem;
DelphiComp : TDelphiVersions;
FileName : string;
ImageIndex : Integer;
begin
for DelphiComp := Low(TDelphiVersions) to High(TDelphiVersions) do
if RegKeyExists(DelphiRegPaths[DelphiComp],HKEY_CURRENT_USER) then //check if exist the key
if RegReadStr(DelphiRegPaths[DelphiComp],'App',FileName,HKEY_CURRENT_USER) and FileExists(FileName) then //Now read the App value and check the existence of the file
begin
item:=ListViewIDEs.Items.Add;
item.Caption:=DelphiVersionsNames[DelphiComp];
item.SubItems.Add(FileName);
ExtractIconFileToImageList(ImageList1,Filename); //add the icon to the listview
ImageIndex :=ImageList1.Count-1;
item.ImageIndex:=ImageIndex;
end;
end;
و اين هم نتيجهی نهايی :
http://theroadtodelphi.files.wordpress.com/2010/10/select-delphi-compiler.png?w=449&h=181
پروژه رو ميتونيد از اينجا (http://go2.wordpress.com/?id=725X1342&site=theroadtodelphi.wordpress.com&url=http%3A%2F%2Fdl.dropbox.com%2Fu%2F12733424%2FS electDelphiVersion.rar&sref=http%3A%2F%2Ftheroadtodelphi.wordpress.com%2F 2010%2F10%2F27%2Fdetecting-installed-delphi-versions%2F) دانلود كنيد.
منبع : Detecting installed delphi versions (http://theroadtodelphi.wordpress.com/2010/10/27/detecting-installed-delphi-versions/)