📄 delphidata.pas
字号:
NewS := '';
end;
end;
Inc(I);
end;
end;
function TCompileTarget.InsertDirMacros(const Dir: string): string;
begin
Result := Dir;
if AnsiStartsText(RootDir + PathDelim, Dir) then
begin
if IsBCB then
Result := '$(BCB)' // do not localize
else if not IsBDS then
Result := '$(DELPHI)' // do not localize
else
Result := '$(BDS)'; // do not localize
Result := Result + Copy(Dir, Length(RootDir) + 1, MaxInt);
end;
end;
function TCompileTarget.FindPackage(const PackageName: string): TDelphiPackage;
function Find(List: TDelphiPackageList): TDelphiPackage;
var
i: Integer;
begin
for i := 0 to List.Count - 1 do
if CompareText(PackageName, List[i].Name) = 0 then
begin
Result := List[i];
Exit;
end;
Result := nil;
end;
begin
Result := Find(KnownIDEPackages);
if Result = nil then
Result := Find(KnownPackages);
end;
function TCompileTarget.FindPackageEx(const PackageNameStart: string): TDelphiPackage;
function Find(List: TDelphiPackageList): TDelphiPackage;
var
i: Integer;
begin
for i := 0 to List.Count - 1 do
if AnsiStartsText(PackageNameStart, List[i].Name) then
begin
Result := List[i];
Exit;
end;
Result := nil;
end;
begin
Result := Find(KnownIDEPackages);
if Result = nil then
Result := Find(KnownPackages);
end;
function TCompileTarget.IsBCB: Boolean;
begin
Result := (CompareText(Name, 'Delphi') <> 0);
end;
function TCompileTarget.IsBDS: Boolean;
begin
Result := CompareText(IDEName, 'BDS') = 0;
end;
function TCompileTarget.IsPersonal: Boolean;
begin
Result := (CompareText(Edition, 'PER') = 0) or // do not localize
(CompareText(Edition, 'PERS') = 0) or // do not localize
(CompareText(Edition, 'STD') = 0); // do not localize
end;
procedure TCompileTarget.LoadFromRegistry;
var
Reg: TRegistry;
List: TStrings;
i: Integer;
begin
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKeyReadOnly(HKLMRegistryKey) then
begin
if Reg.ValueExists('Edition') then
FEdition := Reg.ReadString('Edition')
else
if Reg.ValueExists('Version') then
FEdition := Reg.ReadString('Version') // do not localize
else
FEdition := 'Pers';
FExecutable := Reg.ReadString('App'); // do not localize
FRootDir := ExcludeTrailingPathDelimiter(Reg.ReadString('RootDir')); // do not localize
if IsBDS then
FBDSProjectsDir := ReadBDSProjectsDir // reads from COREIDExx.XX's resource strings
else
FBDSProjectsDir := RootDir + '\Projects';
// obtain updates state
List := TStringList.Create;
try
Reg.GetValueNames(List);
for i := 1 to 10 do
begin
if Reg.ValueExists('Update #' + IntToStr(i)) then // do not localize
FLatestUpdate := i;
if i = 1 then
begin
if Reg.ValueExists('Pascal RTL Patch') then // do not localize
FLatestRTLPatch := i;
end
else
if Reg.ValueExists('Pascal RTL Patch #' + IntToStr(i)) then // do not localize
FLatestRTLPatch := i;
end;
finally
List.Free;
end;
end;
Reg.RootKey := HKEY_CURRENT_USER;
if Reg.OpenKeyReadOnly(RegistryKey) then
begin
// obtain updates state
List := TStringList.Create;
try
Reg.GetValueNames(List);
for i := 1 to 10 do
begin
if Reg.ValueExists('Update #' + IntToStr(i)) then // do not localize
if FLatestUpdate < i then
FLatestUpdate := i;
if i = 1 then
begin
if Reg.ValueExists('Pascal RTL Patch') then // do not localize
if FLatestRTLPatch < i then
FLatestRTLPatch := i;
end
else
if Reg.ValueExists('Pascal RTL Patch #' + IntToStr(i)) then // do not localize
if FLatestRTLPatch < i then
FLatestRTLPatch := i;
end;
finally
List.Free;
end;
Reg.CloseKey;
end;
// get library paths
if Reg.OpenKeyReadOnly(RegistryKey + '\Library') then // do not localize
begin
FDCPOutputDir := ExcludeTrailingPathDelimiter(Reg.ReadString('Package DCP Output')); // do not localize
FBPLOutputDir := ExcludeTrailingPathDelimiter(Reg.ReadString('Package DPL Output')); // do not localize
ConvertPathList(Reg.ReadString('Browsing Path'), FBrowsingPaths); // do not localize
ConvertPathList(Reg.ReadString('Package Search Path'), FPackageSearchPaths); // do not localize
ConvertPathList(Reg.ReadString('Search Path'), FSearchPaths); // do not localize
end;
if Reg.OpenKeyReadOnly(RegistryKey + '\Debugging') then // do not localize
ConvertPathList(Reg.ReadString('Debug DCUs Path'), FDebugDcuPaths); // do not localize
finally
Reg.Free;
end;
LoadPackagesFromRegistry(FKnownIDEPackages, 'Known IDE Packages'); // do not localize
LoadPackagesFromRegistry(FKnownPackages, 'Known Packages'); // do not localize
LoadPackagesFromRegistry(FDisabledPackages, 'Disabled Packages'); // do not localize
end;
procedure TCompileTarget.LoadPackagesFromRegistry(APackageList: TDelphiPackageList;
const SubKey: string);
var
Reg: TRegistry;
List: TStrings;
I: Integer;
begin
APackageList.Clear;
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_CURRENT_USER;
if Reg.OpenKeyReadOnly(RegistryKey + '\' + SubKey) then
begin
List := TStringList.Create;
try
Reg.GetValueNames(List);
for i := 0 to List.Count - 1 do
APackageList.Add(List[i], Reg.ReadString(List[i]));
finally
List.Free;
end;
end;
finally
Reg.Free;
end;
end;
procedure TCompileTarget.SavePackagesToRegistry(APackageList: TDelphiPackageList;
const SubKey: string);
var
Reg: TRegistry;
List: TStrings;
I: Integer;
begin
{ for I := 0 to APackageList.Count - 1 do
APackageList[I].FFilename := InsertDirMacros(APackageList[I].FFilename);}
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_CURRENT_USER;
if Reg.OpenKey(RegistryKey + '\' + SubKey, False) then
begin
List := TStringList.Create;
try
Reg.GetValueNames(List);
// remove old packages
for I := 0 to List.Count - 1 do
if APackageList.IndexOfFilename(List[I]) = -1 then
Reg.DeleteValue(List[I]);
// add new packages
for I := 0 to APackageList.Count - 1 do
if List.IndexOf(APackageList[I].Filename) = -1 then
Reg.WriteString(APackageList[I].Filename, APackageList[I].Description);
finally
List.Free;
end;
end;
finally
Reg.Free;
end;
end;
function TCompileTarget.GetHomepage: string;
begin
if IsBCB then
Result := 'http://www.borland.com/products/downloads/download_cbuilder.html' // do not localize
else
begin
if Version = 5 then
Result := 'http://info.borland.com/devsupport/delphi/downloads/index.html' // do not localize
else
Result := 'http://www.borland.com/products/downloads/download_delphi.html' // do not localize
end;
end;
procedure TCompileTarget.SavePackagesLists;
begin
SavePackagesToRegistry(FKnownPackages, 'Known Packages'); // do not localize
SavePackagesToRegistry(FDisabledPackages, 'Disabled Packages'); // do not localize
end;
procedure TCompileTarget.SavePaths;
var
Reg: TRegistry;
S: string;
begin
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_CURRENT_USER;
if Reg.OpenKey(RegistryKey + '\Library', False) then // do not localize
begin
Reg.WriteString('Browsing Path', ConvertPathList(FBrowsingPaths)); // do not localize
Reg.WriteString('Search Path', ConvertPathList(FSearchPaths)); // do not localize
end;
if Reg.OpenKey(RegistryKey + '\Debugging', False) then // do not localize
begin
S := ConvertPathList(FDebugDcuPaths);
if S <> Reg.ReadString('Debug DCUs Path') then
Reg.WriteString('Debug DCUs Path', ConvertPathList(FDebugDcuPaths)); // do not localize
end;
finally
Reg.Free;
end;
end;
function TCompileTarget.GetMake: string;
begin
Result := RootDir + '\Bin\make.exe'; // do not localize
end;
function TCompileTarget.GetBplDir: string;
begin
Result := ExpandDirMacros(BPLOutputDir);
end;
function TCompileTarget.GetDcpDir: string;
begin
Result := ExpandDirMacros(DCPOutputDir);
end;
procedure TCompileTarget.GetBDSVersion(out Name: string; out Version: Integer; out VersionStr: string);
begin
if (IDEVersion >= Low(BDSVersions)) and (IDEVersion <= High(BDSVersions)) then
begin
Name := BDSVersions[IDEVersion].Name;
VersionStr := BDSVersions[IDEVersion].VersionStr;
Version := BDSVersions[IDEVersion].Version;
end
else
begin
Name := IDEName;
Version := IDEVersion;
VersionStr := IDEVersionStr;
end;
end;
function TCompileTarget.ReadBDSProjectsDir: string;
var
h: HMODULE;
LocaleName: array[0..4] of Char;
Filename: string;
PersDir: string;
begin
if IsBDS and (IDEVersion >= Low(BDSVersions)) and (IDEVersion <= High(BDSVersions)) then
begin
Result := 'Borland Studio Projects'; // do not localize
FillChar(LocaleName, SizeOf(LocaleName[0]), 0);
GetLocaleInfo(GetThreadLocale, LOCALE_SABBREVLANGNAME, LocaleName, SizeOf(LocaleName));
if LocaleName[0] <> #0 then
begin
Filename := RootDir + '\Bin\coreide' + BDSVersions[IDEVersion].CIV + '.';
if FileExists(Filename + LocaleName) then
Filename := Filename + LocaleName
else
begin
LocaleName[2] := #0;
if FileExists(Filename + LocaleName) then
Filename := Filename + LocaleName
else
Filename := '';
end;
if Filename <> '' then
begin
h := LoadLibraryEx(PChar(Filename), 0,
LOAD_LIBRARY_AS_DATAFILE or DONT_RESOLVE_DLL_REFERENCES);
if h <> 0 then
begin
SetLength(Result, 1024);
SetLength(Result, LoadString(h, BDSVersions[IDEVersion].ProjectDirResId, PChar(Result), Length(Result) - 1));
FreeLibrary(h);
end;
end;
end;
SetLength(PersDir, MAX_PATH);
if SHGetSpecialFolderPath(0, PChar(PersDir), CSIDL_PERSONAL, False) then
begin
SetLength(PersDir, StrLen(PChar(PersDir)));
Result := ExcludeTrailingPathDelimiter(PersDir) + '\' + Result;
end
else
Result := '';
end
else
Result := '';
end;
function TCompileTarget.VersionedDCP(const Filename: string): string;
begin
if Version > 5 then
Result := Filename
else
Result := ChangeFileExt(Filename, '') + IntToStr(Version) + '0' + ExtractFileExt(Filename);
end;
{ TDelphiPackageList }
procedure TDelphiPackageList.Add(const Filename, Description: string);
var
Item: TDelphiPackage;
begin
Item := TDelphiPackage.Create(Filename, Description);
inherited Add(Item);
end;
function TDelphiPackageList.GetItems(Index: Integer): TDelphiPackage;
begin
Result := TDelphiPackage(inherited Items[Index]);
end;
function TDelphiPackageList.IndexOfFilename(const Filename: string): Integer;
begin
for Result := 0 to Count - 1 do
if CompareText(Items[Result].Filename, Filename) = 0 then
Exit;
Result := -1;
end;
{ TDelphiPackage }
constructor TDelphiPackage.Create(const AFilename, ADescription: string);
begin
inherited Create;
FFilename := AFilename;
FDescription := ADescription;
end;
function TDelphiPackage.GetName: string;
begin
Result := ExtractFileName(Filename);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -