Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TRegistry (https://www.delphipraxis.net/9846-tregistry.html)

derhoeppi 6. Okt 2003 10:03


TRegistry
 
Hallo liebe Delphi Praxis User
Ich bin Schüler und arbeite seit gut zwei Wochen mit Delphi in der Schule. Leider immer nur 3 Stunden pro Woche, so dass ich noch nicht wirklich die Ahnung habe. Jetzt steh ich aber vor einem Problem. Und zwar möchte ich ein kleines Programm erstellen bzw. "schreiben" mit dem überprüft wird, ob ein Registrierungeintrag vorhanden ist bzw., ob Powerpoint auf dem Computer installiert ist. Wenn dies nicht der Fall ist soll die Meldung kommen, dass Powerpoint nicht installiert ist und gefragt werden ob der Viewer installiert werden soll.Ist Powerpoint installiert so soll die Präsentation gestartet werden.Gibt es dafür eine Möglichkeit???Ich würd das ganze mit einer if-then-else Anweisung realisieren nur kenn ich mich mit dem Part der Registry überhaupt nicht aus.Es wär also nett wenn ihr mir helfen könntet.

Phoenix 6. Okt 2003 10:24

Re: TRegistry
 
Der Titel besagt ja schon, was Du dazu benötigst: Die TRegistry - Komponente.
Wenn Du dazu mal die Onlinehilfe aufrufst steht sogar mit einem Codebeispiel drin, wie Du damit umgehen musst.

Prinzipiell versuchst Du einfach, den gefragten Schlüssel zu öffnen. Schlägt das fehl, ist er nicht da. Das kannst Du dann entsprechend als Kriterium für Deine Auswahl verwenden.

Blechwolf 6. Okt 2003 10:25

Re: TRegistry
 
Salut,

da ich gerade auch fleissig auf der Suche nach dem editieren der Registry war, kann ich nur sagen: Wer suchet, der findet.

Ich würde das ganze allerdings anders machen.
Ich würde folgendes probieren:

Delphi-Quellcode:
  if ShellExecute(0,nil,'Pres.ppt',nil,nil,0) = SE_ERR_NOASSOC then
    begin
      // Nix mit ppt-Files verknüpft -> Powerpoint o.ä. nicht installiert
      // Tu dies Tu das
    end;
Du solltest dann allerdings wohl noch die Unit ShellAPI in der uses-Anweisung verwenden und 'Pres.ppt' durch Deinen FileName ersetzen.

Zu ShellExecute gibts auch eine Hilfe. Allerdings kann ich Dir nicht sagen, ob die direkt unter Delphi zu finden ist (bei mir z.B. nicht). Schau mal unter

C:\Programme\Gemeinsame Dateien\Borland Shared\MSHelp\Win32.hlp

[EDIT]
Noch kurz zur Erläuterung:
Mit dem Aufruf versuchst Du die mit dem Dateityp '.ppt' verknüpfte Anwendung zu öffnen. Also eben halt Power-Point, den Power-Point Viewer, das äquivalente Prog bei OpenOffice etc. Also das Prog, das sich auch öffnet, wenn Du einfach einen Doppelklick auf Deine ppt Datei machst.
[/EDIT]

[EDIT die zweite]
Allerdings hat das jetzt wohl nix mehr mit der Registry zu tun. Sollte die Aufgabenstellung also Explizit mit der Registry gelöst werden, so ist das wohl nicht so günstig :?
[/EDIT die zweite]

Grüße

Blechwolf

derhoeppi 6. Okt 2003 18:06

Re: TRegistry
 
Hallo Leutz
Ich hab nun seit heut Nachmittag etwas gelesen und mein Grundgerüst geschrieben. Allerdings ist es noch nicht so, dass ich sagen kann so möchte ich es lassen.Zum Beispiel startet die Anwendung jetzt erst, wenn ich den Button betätige - ich will aber das es automatisch startet (anders hab ich es in der Schule noch nicht gelernt). Weiterhin hab ich auch noch nicht gelernt wie ich eine Datei aufrufe. Ich möchte ja wenn Powerpoint oder der Viewer nicht installiert ist, dass der Viewer installiert wird.
Hier mal mein momentaner Quellcode:
Delphi-Quellcode:
unit regzugriff;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, Registry;

type
  TForm1 = class(TForm)
    pb_test: TBitBtn;
    procedure pb_testClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;


implementation

{$R *.dfm}

procedure TForm1.pb_testClick(Sender: TObject);
var
    Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CLASSES_ROOT;
    if not Reg.OpenKey('\.ppt', True) then
    begin
      //pptv install
      pb_test.Caption := '&install'
    end;
  finally
    Reg.Free;
    inherited;
  end;
end;

end.

Christian Seehase 6. Okt 2003 18:19

Re: TRegistry
 
Moin Hoeppi,

das wird jetzt etwas aufwendiger.
Damit Dein Programm mitbekommt, wenn versucht wird eine PPT Datei zu öffnen, müsste sich Dein Programm als Anwendung registrieren, die mit PPT verknüpft ist.
Um den Button wirst Du also nicht so leicht herumkommen.

Wie ich die MS-Setups kenne, müsste es möglich sein, den PPT Viewer ohne manuelle Eingriffe zu installieren.
Leider kenne ich das Setup und die möglichen Parameter jetzt nicht auswendig (sollte es sich nicht um ein MSI Setup handeln, könntest Du mit "Setup.exe /?" näheres herausbekommen.), aber es sollte mit einer ShellExecute Zeile zu erledigen sein. Dazu müsste Deinem Programm natürlich bekannt sein wo sich das Setup des Viewers befindet.

Zwei Fehler hab' ich in Deinem Codeschnipsel noch gefunden.
Der gravierendste: Da Du als zweiten Parameter true angegeben hast wird der Aufruf nicht unbedingt fehlschlagen, da der Key ja angelegt wird, wenn er nicht existiert.
Für so eine Anwendung ist OpenKeyReadonly besser geeignet.
Der andere Fehler: Du schliesst den Key nicht, wenn er geöffnet wurde. Du hast zwar an das try/finally für das TRegistry Objekt gedacht, nur für den offenen Key fehlt sie.

Ausserdem ist mir das inherited nicht klar. Das kann wegfallen.

derhoeppi 6. Okt 2003 18:41

Re: TRegistry
 
Hey Christian
Ich hab jetzt mal deine zwei genannten Fehler korrigiert, aber es funzt mit dem Reg.OpenKeyReadOnly nicht mehr. Also mein neuer Quellcode:
Delphi-Quellcode:
unit regzugriff;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, Registry;

type
  TForm1 = class(TForm)
    pb_test: TBitBtn;
    Text: TLabel;
    Ja: TButton;
    Nein: TButton;
    procedure pb_testClick(Sender: TObject);
    procedure NeinClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;


implementation

{$R *.dfm}

procedure TForm1.pb_testClick(Sender: TObject);
var
    Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CLASSES_ROOT;
    if not Reg.OpenKeyReadonly('\.ppt', True) then
    begin
      //pptv install
      pb_test.Caption := '&install'
    end;
  finally
    Reg.CloseKey;
    Reg.Free;
   end;
end;

procedure TForm1.NeinClick(Sender: TObject);
begin
close;
end;

end.
Wie ihr sehen könnt hab ich das ganze noch etwas geändert, weil ich eben auch mitbekommen habe, dass ich um den ButtonClick nicht herumkomme - ist zwar schade aber damit muss ich wohl Leben. Ich habe dafür ein Label für den Text erstellt und dann noch zwei Button (Ja/Nein zur Beantwortung der Frage aus dem Label). Wenn Nein angeklickt wird wird das ganze geschlossen, wenn Ja sollte die Überprüfung für den Viewer dargestellt werden.


Ich schreibe gleich noch eine Antwort bei der ich mal die Struktur meines Programms nennen möchte.

Christian Seehase 6. Okt 2003 18:58

Re: TRegistry
 
Moin Hoeppi,

bei OpenKeyReadOnly gibt es nur einen Parameter, nämlich den Key. Da ja in jedem Falle nur gelesen wird, macht es keinen Sinn das Anlegen des Keys vorzusehen.
Ausserdem hab' ich noch eine kleine Korrektur:

Delphi-Quellcode:
  try
    Reg.RootKey := HKEY_CLASSES_ROOT;
    if not Reg.OpenKeyReadonly('\.ppt') then
    begin
      //pptv install
      pb_test.Caption := '&install'
    end else begin
      Reg.CloseKey;
    end;
  finally
    Reg.Free;
  end;
Den Key nur zu schliessen, wenn er auch geöffnet wurde ist sauberer.
Passiert zwischen öffnen und schliessen des Keys noch mehr, könnte es dann etwas umfangreicher aussehen:

Delphi-Quellcode:
    end else begin
      try
        // Mit dem geöffneten Key arbeiten
      finally
        Reg.CloseKey;
      end;
    end;

derhoeppi 6. Okt 2003 19:24

Re: TRegistry
 
Also das ganze Projekt soll für eine CD sein. Auf die CD soll eine Präsentation über eine Reise. Die Präsentaion wurde mit PowerPoint erstellt und nicht jeder hat PowerPoint auf seinem Rechner. Also möchte ich eine Möglichkeit schaffen, dass sich alle die an der Reise teilgenommen haben auch die Präsentation sehen können. Dazu muss ich nun ein kleines Programm schreiben mit dem überprüft wird, ob die Präsentation dargestellt werden kann.Das ganze soll also über eine Autostartfunktion nach der einlage der CD gestartet werden. Das Programm soll vollgendermaßen aussehen.Ein kleines Formular öffnet sich. Auf diesem befindet sich eine Frage, die mit Ja oder Nein beantwortet werden kann. Wenn die Frage mit Nein beantwortet wird dann soll sich das Formular schließen. Wird die Frage mit Ja beantwortet so soll überprüft werden, ob die Präsentation dargestellt werden kann oder nicht. Wenn sie dargestellt werden kann, soll sich die Präsentation öffnen, wennn nicht dann soll der Viewer installiert werden.ICh hoffe das ist soweit überschaubar.

derhoeppi 6. Okt 2003 20:37

Re: TRegistry
 
Hey
Ich hab inzwischen mal weiter gemacht und bin jetzt auf ein anderes Problem gestoßen. Und zwar hab ich eben die Erfahrung gemacht, dass nach einer Windowsinstallation in der Registry die .ppt schon auf ein Programm verweist. Das beste ist, dass das Programm PowerPoint 4.0 ist. Ich kann damit allerdings keine Präsentationen öffnen. Dadurch wird meine Überprüfung immer negativ ausfallen, so dass der Viewer nicht installiert wird. Wie kann ich das jetztz noch realisieren???
Mein neuer Quelltext:
Delphi-Quellcode:
 unit regzugriff;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, Registry, shellapi;

type
  TForm1 = class(TForm)
    pb_test: TBitBtn;
    Text: TLabel;
    Ja: TButton;
    Nein: TButton;
    Button1: TButton;
    procedure pb_testClick(Sender: TObject);
    procedure NeinClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;


implementation

{$R *.dfm}

procedure TForm1.pb_testClick(Sender: TObject);
var
    Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CLASSES_ROOT;
    if not Reg.OpenKeyReadonly('\.ppt') then
    begin
     ShellExecute(Handle, nil, 'ppview97.exe', nil, nil, SW_SHOW );
      pb_test.Caption := '&install'
    end;
  finally
    Reg.CloseKey;
    Reg.Free;
    inherited;
  end;
end;

procedure TForm1.NeinClick(Sender: TObject);
begin
close;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShellExecute(Handle, nil, 'ppview97.exe', nil, nil, SW_SHOW )
end;
end.

derhoeppi 6. Okt 2003 21:35

Re: TRegistry
 
Hey Leutz
Momentan bin ich richtig glücklich, weil dieses Prog soweit läuft.
Delphi-Quellcode:
unit regzugriff;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, Registry, shellapi;

type
  TForm1 = class(TForm)
    Text: TLabel;
    Ja: TButton;
    Nein: TButton;
    procedure pb_testClick(Sender: TObject);
    procedure NeinClick(Sender: TObject);
      private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;


implementation

{$R *.dfm}

procedure TForm1.pb_testClick(Sender: TObject);
var
    Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CLASSES_ROOT;
    if not Reg.OpenKeyReadOnly('\.ppt\PowerPoint.Show.8') then
    begin
     ShellExecute(Handle, nil, 'ppview97.exe', nil, nil, SW_SHOW );
      Ja.Caption := 'Installation'
    end;
  finally
    Reg.CloseKey;
    Reg.Free;
    inherited;
  end;
end;

procedure TForm1.NeinClick(Sender: TObject);
begin

close;
end;


end.
So weit sieht es meiner Meinung nach gut aus. Jetzt muss nur noch die Anweisung rein, wenn positiv überprüft wurde das die Präsentation gestartet wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:30 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz