Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Öffnen mit... (https://www.delphipraxis.net/57636-oeffnen-mit.html)

robinWie 24. Nov 2005 13:31


Öffnen mit...
 
Hi,

Ich progge gerade einen Rich-Text Editor. Aber wenn ich bei rtf-Dateien einstelle das sie mit meiem Programm geöffnet werden sollen, funzt das nicht. Meine Frage: Hat einer ne Ahnung wie man das Programmieren muss damit das geht?

Danke im Voraus

dataspider 24. Nov 2005 13:36

Re: Öffnen mit...
 
Es sollte eigentlich reichen, wenn man den ParamStr auswertet.
Hab es aber nicht probiert.
In etwa:
Delphi-Quellcode:
if ParamCount > 1 then
  if FileExists(ParamStr(1) then
    OpenFile(ParamStr(1));
Frank

Matze 24. Nov 2005 13:41

Re: Öffnen mit...
 
Ergänzend dazu: Manchmal geht es dennoch nicht, fragt mich aber nicht wieso.

robinWie 24. Nov 2005 13:43

Re: Öffnen mit...
 
Ne funzt nicht. :cry: Es kommt zwar keine Fehlermeldung, aber passieren tut auch nichts

igel457 24. Nov 2005 13:49

Re: Öffnen mit...
 
Bei einem leerzeichen werden die weitere Parameter hinzugefügt. Du musst es also so machen:

Delphi-Quellcode:
procedure Form1OnCreate(sender:TObject);
var i:integer;
    s:string;
begin
  if ParamCount > 1 then
  begin
    for i := 1 to paramcount-1 do
      s := s + paramsstr(i)
    if FileExists(s) then
      OpenFile(s);
  end;
end;
mit dem "for i := 1..." bin ich mir nicht so sicher, könnte auch sein das du 0 schreiben musst.

dataspider 24. Nov 2005 14:11

Re: Öffnen mit...
 
Wenn du im OnCreate des MainForms reinschreibst:
Delphi-Quellcode:
procedure TMainForm.FormCreate(Sender: TObject);
begin
  if ParamCount > 1 then
    ShowMessage(ParamStr(1));
end;
Zeigt er dann was an?
Frank

robinWie 24. Nov 2005 14:18

Re: Öffnen mit...
 
Zitat:

Wenn du im OnCreate des MainForms reinschreibst:
[...]
Zeigt er dann was an?
Frank
Nein, nix wir angezeigt.

ich habe dan mal das vom "IGEL" mit 1 und O bei "FormCreate" ausprobiert
Delphi-Quellcode:
var i:integer;
    s:string;
begin
  if ParamCount > 1 then
  begin
    for i := 0 to paramcount-1 do
      s := s + ParamStr(i);
    if FileExists(s) then
      FileOpen(s); //Einge Procedure um Dateien zu öffen
  end;
end;
funzt aber nicht.

dataspider 24. Nov 2005 14:26

Re: Öffnen mit...
 
Folgendes Beispiel funktioniert bei mir (Form mit einem TRichEdit...
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TFRMMain = class(TForm)
    EDTRtf: TRichEdit;
  private
    { Private-Deklarationen }
  public
    procedure AfterConstruction; override;
    { Public-Deklarationen }
  end;

var
  FRMMain: TFRMMain;

implementation

{$R *.dfm}

procedure TFRMMain.AfterConstruction;
begin
  inherited;
  // ShowMessage(IntToStr(ParamCount));
  if ParamCount > 0 then
    if FileExists(ParamStr(1)) then
      if UpperCase(ExtractFileExt(ParamStr(1))) = '.RTF' then
        EDTRtf.Lines.LoadFromFile(ParamStr(1));
end;

end.
Ich hatte das mit ParamCount verhauen. ParamStr(0) ist zwar der Exename, aber ParamCount zählt den nicht mit.
Frank

robinWie 24. Nov 2005 14:54

Re: Öffnen mit...
 
Es passiert was! Leider nich das was passieren soll. Ich erhalte die Fehlermeldung:
Die Ausnahme "Unbekannter Softwarefehler" 0x0eedfade ist in der Anwendung an der Stelle 0x7c81eb33 aufgetreten.

Ich schreibe den Editor dals MDI-Anwendung, demnach habe ich deien Code so modifizierd:
Delphi-Quellcode:
procedure TMainForm.AfterConstruction;
begin
  inherited;
  // ShowMessage(IntToStr(ParamCount));
  with TTextForm.Create(Self) do begin //MID Formular
  if ParamCount > 0 then
    if FileExists(ParamStr(1)) then
      if UpperCase(ExtractFileExt(ParamStr(1))) = '.RTF' then
        Editor.Lines.LoadFromFile(ParamStr(1));
  end;
end;

dataspider 24. Nov 2005 15:14

Re: Öffnen mit...
 
Bei MDI kann in AfterConstruction kein Form geöffnet werden.
Ich hab es mal im onIdle der App untergebracht, da hier auf jeden Fall das MainForm vollständig erzeugt ist.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, AppEvnts;

type
  TFRMMain = class(TForm)
    procedure doAppIdle(Sender: TObject; var Done: Boolean);
  private
    procedure OpenParamFile;
    { Private-Deklarationen }
  public
    procedure AfterConstruction; override;
    { Public-Deklarationen }
  end;

var
  FRMMain: TFRMMain;

implementation

uses FRMText;

{$R *.dfm}

procedure TFRMMain.AfterConstruction;
begin
  inherited;
  Application.OnIdle := doAppIdle;
end;

procedure TFRMMain.OpenParamFile;
Var
  f : TTextForm;
begin
  if ParamCount > 0 then
    if FileExists(ParamStr(1)) then
      if UpperCase(ExtractFileExt(ParamStr(1))) = '.RTF' then
      begin
        f := TTextForm.Create(Self);
        f.Editor.Lines.LoadFromFile(ParamStr(1));
        f.Show;
      end;
end;

procedure TFRMMain.doAppIdle(Sender: TObject;
  var Done: Boolean);
begin
  Application.OnIdle := nil;
  OpenParamFile;
end;

end.
Cu, Frank

dataspider 24. Nov 2005 15:22

Re: Öffnen mit...
 
bzw. für mehrere Dateien:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, AppEvnts;

type
  TFRMMain = class(TForm)
    ApplicationEvents1: TApplicationEvents;
    procedure doAppIdle(Sender: TObject; var Done: Boolean);
  private
    procedure OpenRTFFile(const AFileName: String);
    { Private-Deklarationen }
  public
    procedure AfterConstruction; override;
    { Public-Deklarationen }
  end;

var
  FRMMain: TFRMMain;

implementation

uses FRMText;

{$R *.dfm}

procedure TFRMMain.AfterConstruction;
begin
  inherited;
  Application.OnIdle := doAppIdle;
end;

procedure TFRMMain.OpenRTFFile(const AFileName: String);
Var
  f : TTextForm;
begin
  f := TTextForm.Create(Self);
  f.Editor.Lines.LoadFromFile(AFileName);
  f.Show;
end;

procedure TFRMMain.doAppIdle(Sender: TObject;
  var Done: Boolean);
Var
  i : Integer;
begin
  Application.OnIdle := nil;
  for i := 1 to ParamCount do
    if FileExists(ParamStr(i)) then
      if UpperCase(ExtractFileExt(ParamStr(i))) = '.RTF' then
        OpenRTFFile(ParamStr(i));
end;

end.
Frank

robinWie 24. Nov 2005 15:48

Re: Öffnen mit...
 
ES KLAPPT :hello:
Jetzt muss ich nur noch das Problem beheben das die Datei so ca. 475 mal geöffnet wird und gut!

dataspider 24. Nov 2005 16:18

Re: Öffnen mit...
 
du hast auch ganz sicher das

Application.OnIdle := nil;

in der Methode doAppIdle stehen???

Frank

robinWie 24. Nov 2005 16:51

Re: Öffnen mit...
 
Ja hab' ich. Was kommt den da hin. Ich habe mich mit den ParamStr noch nie befasst.

dataspider 24. Nov 2005 18:51

Re: Öffnen mit...
 
Also, wenn du das mit den 400 mal Öffnen der Datei nicht findest, poste mal deinen Code.
Das darf ... kann eigentlich nicht sein.
Die Funktion ParamStr(Index): String; liefert dir die an deine Exe übergebenen Parameter.
Wenn also der Aufruf etwa so erfolgt:
MyRTFEditor Hallo Ballo
...liefert ParamStr(1) Hallo und ParamStr(2) Ballo. ParamCount ist 2.
ParamStr(0) ist immer der Exename mit komplettem Pfad bei WindowsApps.
Ich nutze das Ereignis OnIdle der Applikation als Startzeitpunkt, weil hier mit Sicherheit das MainForm komplett gezeichet ist. Ein besserer Zeitpunkt fällt mir nicht ein.
Damit nur einmal das Öffnen der TextForms erfolgt, setze ich in der Methode den Zeiger von Application.OnIdle wieder auf nil (damit eben nicht die Datei 400 mal aufgemacht wird).
Wie gesagt, ich kann mir nicht vorstellen, dass es nicht funzt.

Gruß, Frank

robinWie 26. Nov 2005 15:34

Re: Öffnen mit...
 
@ dataspider: hab die den Code als pn gepostet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:14 Uhr.

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