Autor |
Beitrag |
Terra23
      
Beiträge: 872
Win 8
Delphi 7
|
Verfasst: 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:
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...
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
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 08.11.09 19:19
Das kann ich nicht reproduzieren. Bei mir kompiliert der Quelltext einwandfrei.
Kann es sein, dass das ein Folgefehler ist oder bei dir das doch nicht ganz exakt so aussieht (Semikolon weg oder so)?
|
|
Terra23 
      
Beiträge: 872
Win 8
Delphi 7
|
Verfasst: 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
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 872
Win 8
Delphi 7
|
Verfasst: 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:
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:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure TForm1.FormCreate(Sender: TObject); begin If (ParamCount>0) and (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
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 08.11.09 20:53
Schau dir einmal das Format in der Registry an. Bei deiner Dateierweiterung ist ein Stern zu viel. 
|
|
Terra23 
      
Beiträge: 872
Win 8
Delphi 7
|
Verfasst: So 08.11.09 21:39
_________________ Hasta La Victoria Siempre
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 872
Win 8
Delphi 7
|
Verfasst: 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
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 09.11.09 00:49
Terra23 hat folgendes geschrieben : | 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 
      
Beiträge: 872
Win 8
Delphi 7
|
Verfasst: 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
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 09.11.09 00:56
Dann gehe zeilenweise durch und schau was passiert. 
|
|
Terra23 
      
Beiträge: 872
Win 8
Delphi 7
|
Verfasst: Mo 09.11.09 01:02
Wie mache ich das?
_________________ Hasta La Victoria Siempre
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 09.11.09 01:06
Du bist schon so lange dabei und kennst nicht das wichtigste Hilfsmittel beim Programmieren überhaupt?
www.delphi-treff.de/delphi-ide/debugger/
Kurzfassung: Haltepunkt setzen (F5), ausführen, mit F8 zeilenweise durchgehen.
|
|
Terra23 
      
Beiträge: 872
Win 8
Delphi 7
|
Verfasst: Mo 09.11.09 14:36
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
|
Verfasst: Mo 09.11.09 15:49
Terra23 hat folgendes geschrieben : | 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 
      
Beiträge: 872
Win 8
Delphi 7
|
Verfasst: 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
|
Verfasst: Mo 09.11.09 16:05
Da musst du mal in der Ressource deiner Exe gucken, welchen Index das gewünschte Icon hat.
|
|
Terra23 
      
Beiträge: 872
Win 8
Delphi 7
|
Verfasst: Mo 09.11.09 18:02
Luckie hat folgendes geschrieben : | 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
|
Verfasst: 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".
|
|