![]() |
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. |
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. |
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:
Du solltest dann allerdings wohl noch die Unit ShellAPI in der uses-Anweisung verwenden und 'Pres.ppt' durch Deinen FileName ersetzen.
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; 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 |
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. |
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. |
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:
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.
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. Ich schreibe gleich noch eine Antwort bei der ich mal die Struktur meines Programms nennen möchte. |
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:
Den Key nur zu schliessen, wenn er auch geöffnet wurde ist sauberer.
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; 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; |
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.
|
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. |
Re: TRegistry
Hey Leutz
Momentan bin ich richtig glücklich, weil dieses Prog soweit läuft.
Delphi-Quellcode:
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.
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:30 Uhr. |
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