У меня есть следующий код, который пытается обнаружить установки Delphi с использованием JclIDEUtils. Чтобы проверить его, я настроил две виртуальные машины, как запустить Win 7, так и в обеих системах я установил Delphi XE3, но в VM n1 я также установил Jcl, в VM n2 я этого не сделал. Ну, в n1 моя маленькая прога прекрасно работает и находит Delphi XE3, в n2 это не так! Я пытался удаленно отлаживать программу в обеих виртуальных машинах, но единственное, что я понял, это то, что объект, который запускает класс TJclBorRADToolInstallations, просто остается пустым, если Jcl не установлен.Почему JclIDEUtils работает только в том случае, если установлен Jcl?
Это мой код в OnShow случае моей формы:
procedure TForm1.FormShow(Sender: TObject);
var
I, X: Integer;
TN, SubTn: TTreeNode;
IconIndex: Integer;
begin
FDelphiInstallations := TJclBorRADToolInstallations.Create;
for I := 0 to FDelphiInstallations.Count - 1 do
begin
IconIndex := ilDelphiIcons.AddIcon(GetSmallIcon(FDelphiInstallations[I].IdeExeFileName));
TN := tvDisplay.Items.AddChild(nil, FDelphiInstallations[I].Name);
TN.ImageIndex := ilDelphiIcons.Count - 1;
TN.SelectedIndex := ilDelphiIcons.Count - 1;
with tvDisplay.Items do
begin
SubTn := AddChild(TN, 'Description: ' + FDelphiInstallations[I].Description);
SubTn.ImageIndex := 0;
SubTn := AddChild(TN, 'Root directory: ' + FDelphiInstallations[I].RootDir);
SubTn.ImageIndex := 0;
SubTn := AddChild(TN, 'Projects directory: '+ FDelphiInstallations[i].DefaultProjectsDir);
SubTn.ImageIndex := 0;
SubTn := AddChild(TN, 'Common Projects directory: '+ FDelphiInstallations[i].CommonProjectsDir);
SubTn.ImageIndex := 0;
SubTn := AddChild(TN, 'Executable File name: '+ FDelphiInstallations[i].IdeExeFileName);
SubTn.ImageIndex := 0;
SubTn := AddChild(TN, 'Build number: '+ FDelphiInstallations[i].IdeExeBuildNumber);
SubTn.ImageIndex := 0;
SubTn := AddChild(TN, 'VersionNumberStr='+ FDelphiInstallations[i].VersionNumberStr);
SubTn.ImageIndex := 0;
SubTn := AddChild(TN, 'Registry key='+ FDelphiInstallations[i].ConfigDataLocation);
SubTn.ImageIndex := 0;
for X := 0 to FDelphiInstallations[i].IdePackages.Count - 1 do
begin
SubTn := AddChild(TN, 'Description: ' + FDelphiInstallations[I].IdePackages.PackageFileNames[X]);
SubTn.ImageIndex := 0;
end;
end;
end;
end;
ли кто-то знает что-то об этой проблеме?
Заранее благодарим за любые советы.
Если вы посмотрите на исходный код, 'TJclBorRADToolInstallations.Create;' просто создает внутренний 'TObjectList' и вызывает' ReadInstallations', который просто пытается выполнить итерацию через возможные ключи реестра, чтобы увидеть, будут ли Delphi, C++ Builder или RAD Studio установлена. Нет никакого способа, которым это может потерпеть неудачу и вернуть 'nil'; он может не найти никаких установок, но он все равно вернет экземпляр объекта. 'FDelphiInstallations.Count' может быть нулевым, что остановит выполнение цикла. Вы посмотрели на реестр (используя RegEdit) на машине, которая не работает? –
Также, когда вы сделали установку, вы сделали это как администратор (щелкните правой кнопкой мыши и выберите «Запуск от имени администратора» при запуске установки) в проблемной системе? Вы устанавливали для определенного пользователя или для всех пользователей машины? –
Спасибо, Кен за помощь. Решение было очень простым и немного глупым: я должен запустить Delphi один раз, чтобы JclIDEUtils обнаружил эту установку, даже если я не понимаю, почему это влияет на обнаружение Delphi ... – Marco