Announcement

Collapse
No announcement yet.

programm öffnen über datei

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • programm öffnen über datei

    wenn ich zB auf eine datei.doc klicke, wird word geöffnet und datei.doc wird geladen.
    wie mach ich das, dass eine zb datei.txt in mein memo geladen wird?

    plz help
    thanks dwarf

  • #2
    Moin dwarf,<br>
    <br>
    um einen Dateityp mit einem Programm zu verknüpfen, muss dieser registriert werden (hast Du Dir wahrscheinlich auch schon gedacht ;-))<br>
    Ich schreibe Dir hier mal das einfachst mögliche Beispiel auf. Es lassen sich für Dateitypen noch sehr viel mehr Dinge eintragen. Am besten schaust Du Dir das mal im PSDK unter "Shell Basics: Extending the Shell" und dort dann "Creating a File Association" an.<br>
    <br>
    Dass wird über den Registrykey HKEY_CLASSES_ROOT gemacht.<br>
    Die zu verknüpfende Extension wird hier als Key eingetragen, so dass in der Registry anschliessend folgendes steht (für ".MeineExtension" trägst Du dann natürlich die Extension ein, die Du registrieren willst, Wichtig: Den Punkt nicht vergessen):<br>
    <br>
    HKEY_CLASSES_ROOT\.MeineExtension<br>
    <br>
    In diesen Key wird jetzt ein Standardwert geschrieben, vom Typ REG_SZ (also einfach ein String)<br>
    Dieser String dient als Key für die weiteren Eintragungen.<br>
    (Beispiel: MeinProgramm)<br>
    Über Regedit betrachtet müsste da also jetzt folgendes im Key HEKY_CLASSES_ROOT\.MeineExtension stehen (rechte Seite):<br>
    <br>
    (Standard) REG_SZ "MeinProgramm"<br>
    <br>
    Dieser Wert (MeinProgramm) muss jetzt auch als Key unter HKEY_CLASSES_ROOT angelegt werden:<br>
    <br>
    HKEY_CLASSES_ROOT\MeinProgramm<br>
    <br>
    In diesem Key muss jetzt noch eine, festgeschriebene, Keystruktur angelegt werden, und zwar shell\open\command, so dass jetzt:<br>
    <br>
    HKEY_CLASSES_ROOT\MeinProgramm\shell\open\command< br>
    <br>
    in der Registry steht.<br>
    In diesem Key wird jetzt wieder ein Standardwert eingetragen, diesmal vom Typ REG_SZ oder REG_EXPAND_SZ.<br>
    REG_EXPAND_SZ ist notwendig, falls Du den Pfad mit Hilfe von Umgebungsvariablen angeben willst, die erst noch aufgelöst werden müssen (z.B. USERPROFILE). Im Beispiel bleibe ich allerdings bei REG_SZ<br>
    Als Wert wird nun der Pfad zu Deinem Programm eingetragen, sowie ein Parameter %1 der dann Deinem Programm als ParamStr(1) übergeben wird.<br>
    Es steht dort jetzt also:<br>
    <br>
    (Standard) REG_SZ ""C:\Programme\MeinProgrammVerzeichnis\MeinProgram m.exe"" "%1"
    <br>
    Wichtig hierbei:<br>
    Der Pfad und der Parameter sind <u>jeweils</u> in doppelte Anführungsstriche einzuschliessen, damit eventuelle Leerstellen im Pfad/Parameter nicht stören.<br>
    <br>
    Das war's dann auch schon. Jetzt wird bei einem Doppelclick auf eine Datei mit der Extension .MeineExtension das Programm C:\Programme\MeinProgrammVerzeichnis\MeinProgramm. exe gestartet und der Pfad zu der Datei als Parameter übergeben.<br>
    Was Du nun mit diesem Pfad anstellst (z.B. Memo1.Lines.LoadFromFile(paramstr(1))) bleibt Dir überlassen.<br>
    <br>
    Zusammengefasst:<br>
    <br>
    HKEY_CLASSES_ROOT\.MeineExtension (Standard) REG_SZ "MeinProgramm"<br>
    HEKY_CLASSES_ROOT\MeinProgramm\shell\open\command (Standard) REG_SZ ""C:\Programme\MeinProgrammVerzeichnis\MeinProgram m.exe"" "%1"<br>
    <br>
    <b>WICHTIG:</b><br>
    Wenn Du das, wie in Deinem Beispiel, mit .TXT machst, wird ein Doppelclick auf eine .TXT auf Dein Programm umgeleitet.<br>
    <br>
    Ciao<br>
    Chri

    Comment


    • #3
      a ha
      verstanden
      aber wie macht man das :

      Comment


      • #4
        könntes du mir ein reg-datei machen und sie mir an ********* schicken?
        bidde *schleim-schleim*
        danke schon im voraus: DANKE (;D)
        dwarf
        Zuletzt editiert von dwarf; 31.07.2011, 08:54.

        Comment


        • #5
          Moin dwarf,<br>
          <br>
          'ne Reg Datei kann ich allein deshalb schon nicht machen, weil ich ja nichts über die Extension und das Programm weiss. ;-)<br>
          <br>
          Um zu erfahren, wie Du auf die Registry zugreifst, schaust Du Dir am Besten mal die Klasse TRegistry in der Hilfe an.<br>
          Die sollte hierfür locker ausreichen.<br>
          <br>
          Ciao<br>
          Chri

          Comment


          • #6
            machs doch mal für ne form mit nem memo1 und der Extension *.TXT
            bidde
            dwarf
            PS: ICH NON CHECK

            Comment


            • #7
              Moin dwarf,<br>
              <br>
              schau Dir mal dieses Beispiel in Ruhe an.<br>
              Wenn noch Fragen sind: Immer raus damit ;-) <br>
              <br>
              <pre>
              <b>const</b>
              _sMeineExtension = '.MeineExtension';

              <b>implementation</b>

              {$R *.DFM}

              // Diese Funktion überschreibt einen bereits registrierten Typ NICHT.
              // Unter Uses muss noch die Unit Registry eingetragen werden

              // p_sEXEPath : Pfad des Programmes, das bei Doppelclick auf eine Datei mit der
              // Extension p_sExtension gestartet werden soll
              // p_sExtension : Diese Extension soll registriert werden (mit führendem Punkt anzugeben)
              // p_sSign : Kennung mit der die Verbindung zwischen Extension und Programmpfad
              // gelegt wird
              // Rückgabe : True => Erfolgreich, False => hat nicht geklappt

              <b>function</b> RegisterFileType(<b>const</b> p_sEXEPath : <b>string</b>;<b>const</b> p_sExtension : <b>string</b>;<b>const</b> p_sSign : <b>string</b>) : Boolean;

              <b>const</b> // Zeichen, die in einem Dateinamen nicht auftauchen dürfen
              _sInvalidCharacters = ['*','?',':','\','/','<','>','|','"'];

              <b>var</b>
              R : TRegistry;
              i : integer;

              <b>begin</b>
              // Erst einmal annehmen, dass die Funktion nicht erfolgreich aufgerufen wird
              Result := false;
              // Existiert das zu registrierende Programm?
              <b>if</b> <b>not</b> FileExists(p_sEXEPath) <b>then</b>
              <b>begin</b> // Nein, fertig
              exit;
              <b>end</b>;
              // Ist es eine EXE?
              <b>if</b> UpperCase(ExtractFileExt(p_sEXEPath)) <> '.EXE' <b>then</b>
              <b>begin</b> // Nein, fertig
              exit;
              <b>end</b>;
              // Prüfen, ob die Extension 1. mit einem Punkt beginnt, 2. keinen Punkt > Stelle 1 enthält,3. mindestens zwei Stellen lang ist
              <b>if</b> (pos('.',p_sExtension) <> 1) <b>or</b> (pos('.',copy(p_sExtension,2,Length(p_sExtension)) ) <> 0) <b>or</b> (Length(p_sExtension) < 2) <b>then</b>
              <b>begin</b> // Mindestens eine Bedingung nicht erfüllt, fertig
              exit;
              <b>end</b>;
              // Prüfen, ob alle Zeichen in der Extension erlaubt sind
              <b>for</b> i := 2 <b>to</b> Length(p_sExtension) <b>do</b>
              <b>begin</b>
              <b>if</b> p_sExtension[i] <b>in</b> _sInvalidCharacters <b>then</b>
              <b>begin</b> // ungültiges Zeichen? dann raus
              exit;
              <b>end</b>;
              <b>end</b>;
              // Wurde eine Kennung angegeben
              <b>if</b> p_sSign = '' <b>then</b>
              <b>begin</b> // Nein, fertig
              exit;
              <b>end</b>;
              // ab hier sind die Parameter soweit erstmal gültig, und die Verknüpfung kann angelegt werden
              R := TRegistry.Create; // Registryobjekt erzeugen
              R.RootKey := HKEY_CLASSES_ROOT; // Es soll in HKEY_CLASSES_ROOT eingetragen werden.
              <b>try</b> // try/finally Block um sicherzustellen, dass das Objekt wieder freigegeben wird.
              // Ist der Typ schon registriert?
              <b>if</b> R.KeyExists(p_sExtension) <b>then</b>
              <b>begin</b> // Ja, fertig
              exit;
              <b>end</b>;
              // Wurde die Kennung schon verwendet (bei einem anderen Typ)
              <b>if</b> R.KeyExists(p_sSign) <b>then</b>
              <b>begin</b> // Ja, fertig
              exit;
              <b>end</b>;
              // Langer Rede kurzer Sinn:
              // Ab hier kann man alle Parameter als gültig und noch nicht verwendet ansehen
              // Eigentlich geht's hier erst richtig los:
              <b>if</b> <b>not</b> R.OpenKey('\'+p_sExtension,true) <b>then</b>
              <b>begin</b> // Schlüssel konnte nicht erzeugt werden fertig
              exit;
              <b>end</b>
              <b>else</b>
              <b>begin</b> // Extension erfolgreich eingetragen, dann weiter
              <b>try</b> // try/finally Block damit der geöffnete Key auch garantiert wieder geschlossen wird
              // Als Standardwert die Kennung eintragen
              R.WriteString('',p_sSign);
              <b>finally</b>
              R.CloseKey;
              <b>end</b>;
              <b>end</b>;
              // Die Extension wurde eingetragen, jetzt noch den Pfad und den Parameter eintragen
              <b>if</b> <b>not</b> R.OpenKey('\'+p_sSign+'\shell\open\command\',true) <b>then</b>
              <b>begin</b> // Schlüssel konnte nicht erzeugt werden fertig

              Comment


              • #8
                <pre>
                exit;
                <b>end</b>
                <b>else</b>
                <b>begin</b>
                <b>try</b>
                R.WriteString('','"'+p_sEXEPath+'" "%1"');
                Result := true;
                <b>finally</b>
                R.CloseKey;
                <b>end</b>;
                <b>end</b>;
                <b>finally</b>
                FreeAndNil(R);
                // falls FreeAndNil unbekannt ist geht auch
                // R.Free;
                // R := nil;
                <b>end</b>;
                <b>end</b>;

                <b>procedure</b> TForm1.Button1Click(Sender: TObject);
                <b>begin</b>
                // paramstr(0) enthält den Pfad des Programmes
                <b>if not</b> RegisterFileType(paramstr(0),_sMeineExtension,'Mei nProgramm') <b>then</b>
                <b>begin</b>
                ShowMessage('Registrieren des Dateityps fehlgeschlagen');
                <b>end</b>;
                <b>end</b>;

                <b>procedure</b> TForm1.FormCreate(Sender: TObject);
                <b>begin</b>
                // Wurde ein Parameter übergeben?
                // Ist das eine vorhandene Datei?
                // Hat die Datei meine selbstregistrierte Extension?
                <b>if</b> (paramcount = 1) <b>and</b>
                (FileExists(paramstr(1))) <b>and</b>
                (AnsiUpperCase(ExtractFileExt(paramstr(1))) = AnsiUpperCase(_sMeineExtension)) <b>then</b>
                <b>begin</b> // Alle Bedingungen erfüllt, dann Datei laden
                Memo1.Lines.LoadFromFile(paramstr(1));
                <b>end</b>;
                <b>end</b>;

                <b>end</b>.
                </pre>
                <br>
                Ciao<br>
                Chri

                Comment


                • #9
                  <pre>
                  <b>const</b><br>
                  _sMeineExtension = '.MeineExtension';<br>
                  <br>
                  <b>implementation</b><br>
                  <br>
                  {$R *.DFM}<br>
                  <br>
                  // Diese Funktion überschreibt einen bereits registrierten Typ NICHT.<br>
                  // Unter Uses muss noch die Unit Registry eingetragen werden<br>
                  <br>
                  // p_sEXEPath : Pfad des Programmes, das bei Doppelclick auf eine Datei mit der<br>
                  // Extension p_sExtension gestartet werden soll<br>
                  // p_sExtension : Diese Extension soll registriert werden (mit führendem Punkt anzugeben)<br>
                  // p_sSign : Kennung mit der die Verbindung zwischen Extension und Programmpfad<br>
                  // gelegt wird<br>
                  // Rückgabe : True => Erfolgreich, False => hat nicht geklappt<br>
                  <br>
                  <b>function</b> RegisterFileType(<b>const</b> p_sEXEPath : <b>string</b>;<b>const</b> p_sExtension : <b>string</b>;<b>const</b> p_sSign : <b>string</b>) : Boolean;<br>
                  <br>
                  <b>const</b> // Zeichen, die in einem Dateinamen nicht auftauchen dürfen<br>
                  _sInvalidCharacters = ['*','?',':','\','/','<','>','|','"'];<br>
                  <br>
                  <b>var</b><br>
                  R : TRegistry;<br>
                  i : integer;<br>
                  <br>
                  <b>begin</b><br>
                  // Erst einmal annehmen, dass die Funktion nicht erfolgreich aufgerufen wird<br>
                  Result := false;<br>
                  // Existiert das zu registrierende Programm?<br>
                  <b>if</b> <b>not</b> FileExists(p_sEXEPath) <b>then</b><br>
                  <b>begin</b> // Nein, fertig<br>
                  exit;<br>
                  <b>end</b>;<br>
                  // Ist es eine EXE?<br>
                  <b>if</b> UpperCase(ExtractFileExt(p_sEXEPath)) <> '.EXE' <b>then</b><br>
                  <b>begin</b> // Nein, fertig<br>
                  exit;<br>
                  <b>end</b>;<br>
                  // Prüfen, ob die Extension 1. mit einem Punkt beginnt, 2. keinen Punkt > Stelle 1 enthält,3. mindestens zwei Stellen lang ist<br>
                  <b>if</b> (pos('.',p_sExtension) <> 1) <b>or</b> (pos('.',copy(p_sExtension,2,Length(p_sExtension)) ) <> 0) <b>or</b> (Length(p_sExtension) < 2) <b>then</b><br>
                  <b>begin</b> // Mindestens eine Bedingung nicht erfüllt, fertig<br>
                  exit;<br>
                  <b>end</b>;<br>
                  // Prüfen, ob alle Zeichen in der Extension erlaubt sind<br>
                  <b>for</b> i := 2 <b>to</b> Length(p_sExtension) <b>do</b><br>
                  <b>begin</b><br>
                  <b>if</b> p_sExtension[i] <b>in</b> _sInvalidCharacters <b>then</b><br>
                  <b>begin</b> // ungültiges Zeichen? dann raus<br>
                  exit;<br>
                  <b>end</b>;<br>
                  <b>end</b>;<br>
                  // Wurde eine Kennung angegeben<br>
                  <b>if</b> p_sSign = '' <b>then</b><br>
                  <b>begin</b> // Nein, fertig<br>
                  exit;<br>
                  <b>end</b>;<br>
                  // ab hier sind die Parameter soweit erstmal gültig, und die Verknüpfung kann angelegt werden<br>
                  R := TRegistry.Create; // Registryobjekt erzeugen<br>
                  R.RootKey := HKEY_CLASSES_ROOT; // Es soll in HKEY_CLASSES_ROOT eingetragen werden.<br>
                  <b>try</b> // try/finally Block um sicherzustellen, dass das Objekt wieder freigegeben wird.<br>
                  // Ist der Typ schon registriert?<br>
                  <b>if</b> R.KeyExists(p_sExtension) <b>then</b><br>
                  <b>begin</b> // Ja, fertig<br>
                  exit;<br>
                  <b>end</b>;<br>
                  // Wurde die Kennung schon verwendet (bei einem anderen Typ)<br>
                  <b>if</b> R.KeyExists(p_sSign) <b>then</b><br>
                  <b>begin</b> // Ja, fertig<br>
                  exit;<br>
                  <b>end</b>;<br>
                  // Langer Rede kurzer Sinn:<br>
                  // Ab hier kann man alle Parameter als gültig und noch nicht verwendet ansehen<br>
                  // Eigentlich geht's hier erst richtig los:<br>
                  <b>if</b> <b>not</b> R.OpenKey('\'+p_sExtension,true) <b>then</b><br>
                  <b>begin</b> // Schlüssel konnte nicht erzeugt werden fertig<br>
                  exit;<br>
                  <b>end</b><br>
                  <b>else</b><br>
                  <b>begin</b> // Extension erfolgreich eingetragen, dann weiter<br>
                  <b>try</b> // try/finally Block damit der geöffnete Key auch garantiert wieder geschlossen wird<br>
                  // Als Standardwert die Kennung eintragen<br>
                  R.WriteString('',p_sSign);<br>
                  <b>finally</b><br>
                  R.CloseKey;<br>
                  <b>end</b>;<br>
                  <b>end</b>;<br>
                  // Die Extension w

                  Comment


                  • #10
                    vielen dank ich werde es mir erst mal anschauen!
                    dwar

                    Comment


                    • #11
                      function RegisterFileType(const p_sEXEPath : <font color='Red'>string</font>;const p_sExtension : string;const p_sSign : string) : Boolean; <br>
                      <font color='Red'>Ich bin ein kleiner 16-jähriger Noob(sollte als Entschuldigung für diese Frage gelten )<br>
                      muss ich anstatt <u>string</u> hier schon den pfad angeben?
                      </font>

                      Comment


                      • #12
                        Moin dwarf,<br>
                        <br>
                        das sollte doch wohl aber herauszubekommen sein:<br>
                        Die Parameter sind dokumentiert, und ein Beispiel ist auch dabei ;-)<br>
                        <br>
                        Ciao<br>
                        Chri

                        Comment

                        Working...
                        X