Einzelnen Beitrag anzeigen

Benutzerbild von SoD
SoD

Registriert seit: 9. Dez 2008
Ort: Oberasbach
33 Beiträge
 
Delphi 2007 Professional
 
#1

Inno Setup: Bereits installierte Komponenten disablen

  Alt 25. Nov 2009, 16:22
Hallo liebe DP'ler,

ich habe in meinem Inno Setup die Idee gehabt, dass man bei der Auswahl der Komponenten bereits vorhandene Zusatz-Tools die Checkboxen ausgrauen könnte.

Konkret bestehen die Zusatztools aus: Ghostscript, FreePDF, BDE. Ich hab gelesen es wäre nicht empfehlenswert einfach drüber zu installieren, deswegen sollen die Checkboxen deaktiviert werden, wenn mein Setup feststellt, dass diese Programme bereits vorhanden sind. Dazu gibt's ne Hinweismeldung.

So weit, so gut. Nun steh ich vor dem Problem der Erkennung dieser Tools. Ich lese dafür aus der Registry, das ist nicht das Problem; das Problem steckt in einer Schleife und ich weiß nicht mehr weiter, mit welchen Daten ich meine Funktionen füttern soll. Ich steh total auf'm Schlauch. Anbei der Code:

Delphi-Quellcode:
function CheckForComponents(): Boolean;
var i: Integer;
begin
  for i := 0 to WizardForm.ComponentsList.ItemIndex - 1 do
  begin
    if ComponentInstalled then Result := true;
  end;
end;

function gsInstalled(): Boolean;
begin
  if RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\GPL Ghostscript') then //Check auf installiertes Ghostscript
  Result := true;
end;

function FreePDFinstalled(): Boolean;
begin
  if RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\shbox\FreePdfXP') then //Check auf installiertes FreePDF
    Result := true
end;

function BDEinstalled(): Boolean;
begin
  if RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Borland\Database Engine') then //Check auf installierte BDE
    Result := true;
end;

function AlreadyInstalledComponents(): String;
var
  List: TStrings;
  i: Integer;
  ComponentInstalled: Boolean;
begin
  for i := 0 to WizardForm.ComponentsList.ItemIndex - 1 do
  begin
    if ComponentInstalled then
    List.Add(WizardForm.ComponentsList.ItemCaption[i] + #13 + #10);
  end;
  Result := List.Text;
end;

procedure CurPageChanged(CurPageID: Integer);
var
  i: Integer;
begin
  if CurPageID = wpSelectComponents then
  begin
    for i := 0 to WizardForm.ComponentsList.ItemIndex - 1 do
    begin
      if CheckForComponents() then
        MsgBox('Es wurden folgende bereits installierte Komponenten gefunden:' + #13 + #10 + #13 + #10 + AlreadyInstalledComponents() + #13 + #10 + #13 + #10 + 'Wenn Sie diese aktualisieren möchten, brechen Sie die Installation jetzt ab, deinstallieren Sie die aufgeführten Programme und starten Sie Setup erneut.', mbError, MB_OK);
    end;
  end;
end;
Ich bin mir im Klaren, dass ComponentInstalled nirgends deklariert wurde. Es ist auch nur als Platzhalter gedacht. Gleich noch ne Frage aus Interesse: Macht an diesen Stelle der Aufruf einer weiteren Funktion Sinn?

Sinn und Unsinn der Vorgehensweise mit der ich an den User herantrete sei mal dahingestellt. Es geht primär darum: Einen Warnhinweis mit einer Liste der Komponenten auszugeben, die mein Setup auf dem Zielsystem entdeckt hat und die entprechenden Komponenten von der Auswahl und Installation durch den User auszuschließen (Sprich: CheckBox.Enabled := False).

Vielen Dank schon mal im Vorraus für eure Hilfe,
SoD
Keinen Bock anständig zu debuggen?
try stuff;
except ShowMessage('Bug, bug, bug!!! Dont do this shit!');
end;
  Mit Zitat antworten Zitat