Прошу рецензирование диссертаций помощи innosetup фрагменты


Чтобы выполнить обещание, я приготовила следующий скрипт :

[Code]
var
  BDS: string; // No trailing backslash path
  BDSCOMMONDIR: string; // No trailing backslash path
  BDSPROJECTSDIR: string; // No trailing backslash path
  BDSUSERDIR: string; // No trailing backslash path
  //
  BPLPath: string; // No trailing backslash path
  DCPPath: string; // No trailing backslash path
  //
  SearchPath: string; // Path list
  BrowsingPath: string; // Path list

function ExpandBdsEnvVar(s: string): string;
begin
  if Pos('$(BDS)', s) <> 0 then result := BDS + Copy(s,5+1,Length(s)-5)
  else if Pos('$(BDSCOMMONDIR)', s) <> 0 then result := BDSCOMMONDIR + Copy(s,15+1,Length(s)-15)
  else if Pos('$(BDSPROJECTSDIR)', s) <> 0 then result := BDSPROJECTSDIR + Copy(s,17+1,Length(s)-17)
  else if Pos('$(BDSUSERDIR)', s) <> 0 then result := BDSUSERDIR + Copy(s,12+1,Length(s)-12)
  else if Pos('$(HOMEPATH)', s) <> 0 then result := ExpandConstant('{userdesktop}') + Copy(s,11+1,Length(s)-11)
  else if Pos('$(DELPHI)', s) <> 0 then result := BDS + Copy(s,9+1,Length(s)-9)
  else result := s;
end;

function ReadBPL(s: string): string;
begin
  result := ExpandBdsEnvVar(BPLPath + Trim(s)); // Here comes the expansion for IS's sake !
end;

function CheckAndAppendPath(PathList: string; PathToCheck: string):string;
begin
  result := PathList;
  if (Pos(PathToCheck, PathList) = 0) then // Avoid duplicate append
    result := result + ';' + Trim(PathToCheck);
end;

function ReadDCP(s: string): string;
begin
  result := ExpandBdsEnvVar(DCPPath + Trim(s)); // Here comes the expansion for IS's sake !
end;

function ReadSearchPath(s: string): string;
begin
  result := CheckAndAppendPath(SearchPath,s) // Here comes the expansion for IS's sake !
end;

function ReadBrowsingPath(s: string): string;
begin
  result := CheckAndAppendPath(BrowsingPath,s)
end;

Мое намерение состоит в том, чтобы использовать их как временное отсутствие признаков указанных выше, такие как :

function InitializeSetup(): Boolean;
var
  spath: String;
begin
  result := false;
  // $(BDS)\bin\bds.exe Check
  RegQueryStringValue(HKCU,'SOFTWARE\CodeGear\BDS\7.0','RootDir', spath);
  if FileExists(spath+'\bin\bds.exe') then
    begin
      BDS := RemoveBackslash(spath);
      // $(BDSCOMMONDIR) Check
      spath := AddBackslash(ExpandConstant('{commondocs}'))+'RAD Studio\7.0'; // No trailing backslash
      if DirExists(spath) then
        begin
          BDSCOMMONDIR := spath;
          //
          BDSPROJECTSDIR:=AddBackslash(ExpandConstant('{userdocs}'))+'RAD Studio\Projects'; // Assume it exists, no trailing backslash
          BDSUSERDIR:=AddBackslash(ExpandConstant('{userdocs}'))+'RAD Studio\7.0'; // Assume it exists, no trailing backslash
          // Search Path Check
          if RegQueryStringValue(HKCU, 'SOFTWARE\CodeGear\BDS\7.0\Library', 'Search Path', sPath) then
            begin
              SearchPath := RemoveBackslash(Trim(spath)); // No trailing backslash
              // Browsing Path Check
              if RegQueryStringValue(HKCU, 'SOFTWARE\CodeGear\BDS\7.0\Library', 'Browsing Path', sPath) then
                begin
                  BrowsingPath := RemoveBackslash(Trim(spath)); // No trailing backslash
                  // Package DPL Output Check
                  if RegQueryStringValue(HKCU, 'SOFTWARE\CodeGear\BDS\7.0\Library', 'Package DPL Output', spath) then
                    begin
                      BPLPath := RemoveBackslash(Trim(spath));  // No trailing backslash, no expansion for any $(...)
                      // Package DCP Output Check
                      if RegQueryStringValue(HKCU, 'SOFTWARE\CodeGear\BDS\7.0\Library', 'Package DCP Output', spath) then
                        begin
                          DCPPath := RemoveBackslash(Trim(spath));  // No trailing backslash, no expansion for any $(...)
                          //
                          result := true; // Boooooooooooooom, blast it !
                        end
                      else
                        MsgBox(cRegistryCorrMsg, mbError, MB_OK); // No "Package DCP Output" entry in the Registry
                    end
                  else
                    MsgBox(cRegistryCorrMsg, mbError, MB_OK); // No "Package DPL Output" entry in the Registry
                end
              else
                MsgBox(cRegistryCorrMsg, mbError, MB_OK); // No "Browsing Path" entry in the Registry
            end
          else
            MsgBox(cRegistryCorrMsg, mbError, MB_OK); // No "Search Path" entry in the Registry
        end
      else
        MsgBox(cCheckInstallMsg, mbError, MB_OK); // $(BDSCOMMONDIR) not found
    end
  else
    MsgBox(cCheckInstallMsg, mbError, MB_OK); // $(BDS)\bin\bds.exe not found
...

Такой подход приемлем ?

Любые улучшения приветствуются.



668
2
задан 2 декабря 2011 в 12:12 Источник Поделиться
Комментарии
1 ответ

Некоторые общие замечания ниже. (Я не уверен, что коды действительны коды Дельфи или нет. Не стесняйтесь, чтобы исправить их.)

Вместо того, чтобы скопировать(с,15+1,Длина(с)-15) , вы должны создать функцию вроде этой:

function ReplaceLastChars(input: string, charNum: integer): string;
begin
// some input check should be here
// for example: negative charNum probably is not allowed
result := Copy(input, charNum + 1, Length(input) - charNum);
end;

Он удаляет некоторые данные и дублирования кода.

Может быть, вы могли бы изменить линии как

if Pos('$(BDSCOMMONDIR)', s) <> 0 then 
result := BDSCOMMONDIR + Copy(s,15+1,Length(s)-15)

в пользовательскую функцию:

function ChangeIfFound(input: string, pattern: string, replacement: string): string;
begin
if Pos(pattern, input) <> 0 then
result := replacement + ReplaceLastChars(input, Length(pattern));
else
result := input;
end;

затем вызвать его:

s := ChangeIfFound(s, '$(BDS)', BDS);
s := ChangeIfFound(s, '$(BDSCOMMONDIR)', BDSCOMMONDIR);
...

Это немного отличается от вашей оригинальной логике, поскольку она заменяет все матчи не только первого. Может быть, это не подходит для вас.

Если StringReplace существует в Delphi он может быть более простым:

s := StringReplace(s, '$(BDS)', BDS);
s := StringRepace(s, '$(BDSCOMMONDIR)', BDSCOMMONDIR);
...

Возможные ошибки: что происходит, когда $(...) строки не в начале входной строки? Может быть, вы хотите изменить

if Pos('$(BDS)', s) <> 0

для

if Pos('$(BDS)', s) = 1

или вы должны обрабатывать другие возвращаемые значения поз тоже.

2
ответ дан 4 декабря 2011 в 04:12 Источник Поделиться