Autor Beitrag
Terra23
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: So 08.11.09 19:01 
Hi!

Ich möchte, dass mein Programm mit bestimmten Dateien verknüpft wird.

Dazu habe ich im EasyHelper folgenden Code gefunden:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
function InstallExt(Extension, ExtDescription, FileDescription,
OpenWith, ParamString: string; IconIndex: Integer = 0): Boolean;
var
  Reg: TRegistry;
begin
  Result := False;
  if Extension <> '' then
  begin
    if Extension[1] <> '.' then
      Extension := '.' + Extension;

    Reg := TRegistry.Create;
    try
      Reg.RootKey := HKEY_CLASSES_ROOT;
      if Reg.OpenKey(Extension, True) then
      begin
       Reg.WriteString('', ExtDescription);
       if Reg.OpenKey('\' + ExtDescription, True) then
       begin
         Reg.WriteString('', FileDescription);
         if Reg.OpenKey('DefaultIcon', True) then
         begin
           Reg.WriteString('', Format('%s,%d', [OpenWith, IconIndex]));
           if Reg.OpenKey('\' + ExtDescription + '\Shell\Open\Command', True) then
           begin
             Reg.WriteString('', Format('"%s" "%s"', [OpenWith, ParamString]));
             Result:=True;
           end;
         end;
       end;
     end;
  finally
    Reg.Free;
  end;
  end;
end;


Leider bekomme ich an der Stelle...

ausblenden Delphi-Quelltext
1:
Reg.WriteString('', Format('%s,%d', [OpenWith, IconIndex]));					


... die Fehlermeldung "Operator oder Semikolon fehlt". Was ist denn daran falsch?

Gruß,

Terra

_________________
Hasta La Victoria Siempre


Zuletzt bearbeitet von Terra23 am Di 10.11.09 14:20, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 08.11.09 19:19 
Das kann ich nicht reproduzieren. Bei mir kompiliert der Quelltext einwandfrei. :nixweiss:

Kann es sein, dass das ein Folgefehler ist oder bei dir das doch nicht ganz exakt so aussieht (Semikolon weg oder so)?
Terra23 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: So 08.11.09 20:19 
Ich weiß zwar nicht, was du unter Folgefehler verstehst, aber ich hatte einen Fehler drin. ;)

Ich hatte, als ich das Programm schrieb, eine globale Variable definiert, die Format hieß. Diese Variable habe ich nun umbenannt und nun funktioniert alles.

Gruß,

Terra

_________________
Hasta La Victoria Siempre
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 08.11.09 20:24 
Das meinte ich: Dass der Fehler eine Folge aus dem vorhergehenden Quelltext ist. ;-)

Aber an der Stelle sieht man mal wieder wie wichtig gute Bezeichner sind. Denn so kurze / allgemeine Bezeichner haben natürlich immer das Risiko, dass die schon in Delphi benutzt werden.
Terra23 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: So 08.11.09 20:33 
Da hast du natürlich Recht.

Jetzt habe ich aber folgendes Problem:

Ich kann die Dateien, die ich benutze, nicht verknüpfen.

Ich rufe die Prozedur so auf:

ausblenden Delphi-Quelltext
1:
2:
If InstallExt('*.butler''DeckButler-Datei''DeckButler', ParamStr(0), '"%1"'0)
Then ShowMessage('Programm wurde verknüpft.');


Und eine andere Sache habe ich auch noch:

In EasyHelper steht, dass der Pfad in einem Parameter übergeben wird und man z.B. so aufrufen könnte:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.FormCreate(Sender: TObject);
begin
 If (ParamCount>0and
    (FileExists(ParamStr(1))) then
   Memo1.Lines.LoadFromFile(ParamStr(1));
end;


In welcher Variablen befindet sich denn der Dateiname?

Gruß,

Terra

_________________
Hasta La Victoria Siempre
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 08.11.09 20:53 
Schau dir einmal das Format in der Registry an. Bei deiner Dateierweiterung ist ein Stern zu viel. :zwinker:
Terra23 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: So 08.11.09 21:39 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Schau dir einmal das Format in der Registry an. Bei deiner Dateierweiterung ist ein Stern zu viel. :zwinker:


Sorry, aber ich finde in meiner Registry nichts. Kann es sein, dass das Programm nichts in die Registry geschrieben hat?

_________________
Hasta La Victoria Siempre
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 09.11.09 00:16 
Bist du sicher, dass du an der richtigen Stelle geschaut hast?
Auf jeden Fall muss bei deinem Quelltext der Stern vor der Dateierweiterung weg. Und Adminrechte brauchst du natürlich auch.
Terra23 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: Mo 09.11.09 00:39 
Hi!

Ich habe nun den * rausgenommen und es funktioniert trotzdem nicht.

Weiterhin ist es so, dass ich in der Registry nichts finde, d.h. bei mir wird keine Dateinamenerweiterung in die Reg geschrieben.

Ich habe auch Admin-Rechte auf dem Laptop, da ich der einzige User und somit Admin bin.

Terra

_________________
Hasta La Victoria Siempre
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 09.11.09 00:49 
user profile iconTerra23 hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe auch Admin-Rechte auf dem Laptop, da ich der einzige User und somit Admin bin.
Sofern es sich um XP und nicht um Vista oder Windows 7 handelt reicht das, ja.

Hast du einmal debuggt und geschaut, ob das Programm dort richtig abgearbeitet wird?
Terra23 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: Mo 09.11.09 00:53 
Ich habe XP und weiß, das ich Admin bin.

Was muss ich denn tun, um zu schauen, ob mein Programm dort richtig arbeitet?

Ich habe mal testweise den Aufruf für die Verknüpfung auf nen Button gelegt. Wenn ich den drücke, dann erhalte ich nichtmal die Message, d.h. InstallExt gibt mal nicht True zurück...

_________________
Hasta La Victoria Siempre
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 09.11.09 00:56 
Dann gehe zeilenweise durch und schau was passiert. :nixweiss:
Terra23 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: Mo 09.11.09 01:02 
Wie mache ich das?

_________________
Hasta La Victoria Siempre
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 09.11.09 01:06 
Du bist schon so lange dabei und kennst nicht das wichtigste Hilfsmittel beim Programmieren überhaupt? :shock:
www.delphi-treff.de/delphi-ide/debugger/

Kurzfassung: Haltepunkt setzen (F5), ausführen, mit F8 zeilenweise durchgehen.
Terra23 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: Mo 09.11.09 14:36 
:oops:

Ich bin zwar schon lange hier im Forum dabei, habe aber zwischendurch Jahre nichts mit Delphi gemacht. Zudem habe ich auch nur einige Grundlagen von Delphi in der Schule gelernt und da gehörte der Debugger nicht dazu.

Aber ich werd's mir mal ansehen.

Danke,

Terra

EDIT:


Ich habe nun den Fehler gefunden und inzwischen wird auch durch den InstallExt-Aufruf der Wert True zurückgegeben.

Allerdings steht in der Registry anschließend nur der Wert, der bei ExtDescription übergeben wurde.

Wenn ich nun auf eine Datei doppelklicke, dann öffnet sich auch das Programm.

Soweit so gut.

Aber es sind noch Fragen offen:

1) Wie kann ich den Dateien das Icon des Programms zuweisen?
2) In welchem Parameter steht der Pfad der Datei, die per Doppelklick geöffnet werden soll?

Terra

_________________
Hasta La Victoria Siempre
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 09.11.09 15:49 
user profile iconTerra23 hat folgendes geschrieben Zum zitierten Posting springen:
1) Wie kann ich den Dateien das Icon des Programms zuweisen?

Guck dir mal den letzten Parameter der Funktion an.

Zitat:
2) In welchem Parameter steht der Pfad der Datei, die per Doppelklick geöffnet werden soll?

Im ersten bzw. zweiten je nach dem wie man zählt:
ParamStr(0): Pfad des Programmes
ParamStr(1): Erster Kommandozeilenparameter
ParamStr(1): Zweiter Kommandozeilenparameter
ParamStr(n): n-ter Kommandozeilenparameter
Terra23 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: Mo 09.11.09 15:56 
Hi Luckie!

Ich habe mir den Parameter angesehen. Ich übergebe einen Integer. Leider weiß ich nicht, wie groß der Integer sein muss, damit er das Icon des Programms übergibt.

Ich habe mir schon gedacht, dass ich vielleicht aus Integer ein TIcon zu machen und dann die Variable mit "Application.Icon" zu füllen. Aber das ist wohl nicht im Sinne des Erfinders, oder?

Aus deinen anderen Angaben werde ich zwar nicht so schlau, aber ich werde mal die Hilfe zu Rate ziehen.

MfG

Terra

_________________
Hasta La Victoria Siempre
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 09.11.09 16:05 
Da musst du mal in der Ressource deiner Exe gucken, welchen Index das gewünschte Icon hat.
Terra23 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: Mo 09.11.09 18:02 
user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
Da musst du mal in der Ressource deiner Exe gucken, welchen Index das gewünschte Icon hat.


Ich muss schon wieder fragen: Wie mache ich das?


Was deine Antwort mit den ParamStr's angeht, habe ich mal spaßeshalber ne Schleife gebaut und 20 ParamStr's abgefragt und diese in ein Memo geladen.

Da ergab sich folgendes Problem (Tiefstriche markieren die Stelle, wo eigentlich Leerzeichen sein sollten):

ParamStr(0) = Programmpfad
(1) = C:\Dokumente_
(2) = und_
(3) = Einstellungen\Lex\Eigene_
(4) = Dateien\DeckButler_
(5) = Decks\Blackwing.dckf


Die anderen ParamStr's sind leer.

Das heißt, es wurde der komplette Pfad immer dort getrennt wo sich Leerzeichen befinden und ich müsste jetzt die Leerzeichen wieder einfügen (die sind ja gelöscht und müssten dort stehen, wo ich nun Tiefstriche hingesetzt habe) und die einzelnen Strings zu einem Gesamt-String zusammenbauen. Das kann ja irgendwie auch nicht sein, oder? Es stellt zwar kein großes Problem dar, aber soweit ich den Code aus EasyHelper verstanden habe, sollte der komplette (!!!) Pfad in einem ParamStr übergeben werden.

Gruß,


Terra

_________________
Hasta La Victoria Siempre
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 09.11.09 21:44 
Pfade mit Leerzeichen müssen in Anführungszeichen gesetzt werden. Das musst du natürlich auch beim Eintragen in die Registry berücksichtigen: "%1".