Avatar billede jes_petersen Nybegynder
25. august 2000 - 22:58 Der er 3 kommentarer og
2 løsninger

Åbn fil i program

Jeg har et program der fungerer som en slags tekstbehandler, hvor tekstfeltet er et Richedit-felt. Jeg skal have den til at gøre to ting med hensyn til at åbne filer. 1) Man skal kunne \"trække\" en fil ind fra en mappe i Windows til tekstfelter, hvorpå den bliver åbnet. og 2) Man skal kunne relatere en bestemt filtype til mit program, så programmet bliver åbnet med den relevante fil, når man dobbeltklikker på den.
Avatar billede kokoko Nybegynder
26. august 2000 - 14:57 #1
den sidste skal du gå ned i Start->Settings->Folder Options ... Der skal du hen og vælge det faneblad der hedder File Types og der skal du tilføje en ny type fil eller rette i en gammel..
Avatar billede kokoko Nybegynder
26. august 2000 - 15:08 #2
Det var vel en slags svar, men ud over det skal du gøre så dit program kan bruge parametre... så du kan åbne en fil i dit program ved f.eks. at skrive \"notepad minfil.txt\".

Du skal bruge disse to functioner:
function ParamCount: Integer; // fortæller hvor mange parametre der er..
function ParamStr(Index: Integer): string; // fortæller dig hvilken hvad der står i index parameteren...


Håber det kan hjælpe...
Avatar billede borrisholt Novice
26. august 2000 - 16:41 #3
Puuuh det var meget hva ?

Nå men du starter med at modificere din dpr fil til noget der ligener den her ...

program Project1;

uses
  Forms,
  Windows,
  Registry,
  Unit1 in \'Unit1.pas\' {Form1};

{$R *.RES}

procedure SetAssociation(Ext, Key, Name : String);
//Funktion til at sætte en Association til en filtype i registeringsdatabasen
var
  Regist : TRegistry;
begin
  Regist := TRegistry.Create;
  try
    with Regist do
      begin
        RootKey := HKEY_LOCAL_MACHINE;
        if OpenKey(\'\\Software\\Classes\\.\'+Ext,true) then
          begin
            WriteString(\'\',Key);
              if OpenKey(\'\\Software\\Classes\\\'+Key,true) then
                begin
                  WriteString(\'\', Name);
                  if OpenKey(\'\\Software\\Classes\\\'+Key+\'\\DefaultIcon\',true) then
                    WriteString(\'\',Application.ExeName+\',0\');
                  if OpenKey(\'\\Software\\Classes\\\'+Key+\'\\shell\\open\\command\',true) then
                    WriteString(\'\',Application.ExeName+\' %1\');
              end;
        end;
      end;
  finally
    Regist.Free;
  end;
end;

//Mens vi alligevel er her så sikere at dit program kun kan lukkes op en gang
const
MemFileSize = 1024;
MemFileName = \'The Monty Python System\'; //Navnet på din applikation

begin
CreateFileMapping(HWND($FFFFFFFF), nil,PAGE_READWRITE,0,MemFileSize, MemFileName);
//Søg efter en anden instans af dit program
if GetLastError <> ERROR_ALREADY_EXISTS then //Hvis det ikke findes så ..
  begin
      SetAssociation(\'Mpf\', \'Monty Python File\', \'The Monty Python System\'); //Register din fil type

      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
  end
  else
    Application.BringToFront; //Ellers sæt det forest.
end.

Så skal vi til alt det andet sjove du efterspurget

Der vil jeg anbefale det følgende :

program Project1;

uses
  Forms,
  Windows,
  Registry,
  Unit1 in \'Unit1.pas\' {Form1};

{$R *.RES}

procedure SetAssociation(Ext, Key, Name : String);
//Funktion til at sætte en Association til en filtype i registeringsdatabasen
var
  Regist : TRegistry;
begin
  Regist := TRegistry.Create;
  try
    with Regist do
      begin
        RootKey := HKEY_LOCAL_MACHINE;
        if OpenKey(\'\\Software\\Classes\\.\'+Ext,true) then
          begin
            WriteString(\'\',Key);
              if OpenKey(\'\\Software\\Classes\\\'+Key,true) then
                begin
                  WriteString(\'\', Name);
                  if OpenKey(\'\\Software\\Classes\\\'+Key+\'\\DefaultIcon\',true) then
                    WriteString(\'\',Application.ExeName+\',0\');
                  if OpenKey(\'\\Software\\Classes\\\'+Key+\'\\shell\\open\\command\',true) then
                    WriteString(\'\',Application.ExeName+\' %1\');
              end;
        end;
      end;
  finally
    Regist.Free;
  end;
end;

//Mens vi alligevel er her så sikere at dit program kun kan lukkes op en gang
const
MemFileSize = 1024;
MemFileName = \'The Monty Python System\'; //Navnet på din applikation

begin
CreateFileMapping(HWND($FFFFFFFF), nil,PAGE_READWRITE,0,MemFileSize, MemFileName);
//Søg efter en anden instans af dit program
if GetLastError <> ERROR_ALREADY_EXISTS then //Hvis det ikke findes så ..
  begin
      SetAssociation(\'Mpf\', \'Monty Python File\', \'The Monty Python System\'); //Register din fil type

      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
  end
  else
    Application.BringToFront; //Ellers sæt det forest.
end.


Jens B
Avatar billede jes_petersen Nybegynder
27. august 2000 - 12:58 #4
Borrisholt - du må meget undskylde, men for mig ser det altså ud som om, at du først skriver noget kode (som ellers er udmærket) - så skriver du \"Så skal vi til alt det andet sjove du efterspurget\" - men det ser altså ud som om at det er den samme kode du skriver nedenunder det, som du også har skrevet ovenover.
Avatar billede borrisholt Novice
28. august 2000 - 11:34 #5
Det har du vist ret i .... Beklager !

Her kommer så unit1 :

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    RichEdit1: TRichEdit;
    procedure FormCreate(Sender: TObject);
  private
  procedure AppMessageHandler(var Msg : TMsg; var Handled : Boolean); //Ny message handlet for hele applikatinen
  procedure WMDropFiles(var WinMsg : TWMDropFiles); message wm_DropFiles; //message handler for wm_DropFiles
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

uses
  ShellAPI; //ej at froglemme :-)

procedure TForm1.AppMessageHandler(var Msg: TMsg; var Handled: Boolean);
begin
  if (Msg.Message = WM_DropFiles) and IsIconic(Application.Handle) then //Tjek om det er den rigtige message der kom
  begin
    Perform(Msg.Message,Msg.WParam,Msg.LParam);//Hvis så udfør message handleren for WM_DropFiles
    Handled := true;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
i : Integer;
s : String;
begin
  DragAcceptFiles(Handle,true);
  DragAcceptFiles(Application.Handle,true);
  Application.OnMessage := AppMessageHandler;

  for i:= 0 to ParamCount do
  begin
    s := AnsiUpperCase(ParamStr(i));
    if pos(\'.MPF\',s) = 0 then //Hvis det ikke er en af vores egne filer der er belvet givet som parameter
      Continue; //Så fortsæt til den næste fil i rækken
    RichEdit1.Lines.LoadFromFile(ExpandFileName(ParamStr(i)));
  end;
end;

procedure TForm1.WMDropFiles(var WinMsg: TWMDropFiles);
const
  BufSize = 256;
var
  TempStr : array[0..pred(BufSize)] of char;
  i,NumDroppedFiles : integer;
begin
  NumDroppedFiles := DragQueryFile(WinMsg.Drop,$ffffffff,nil,0);
  for i := 0 to pred(NumDroppedFiles) do //Det er her det sneer
  begin //For alle filer der er blever trukker hen over dit program do
    DragQueryFile(WinMsg.Drop,i,TempStr,BufSize); //Begynd file drag and drop
    Richedit1.Lines.LoadFromFile(StrPas(TempStr));
  end;
  DragFinish(WinMsg.Drop);
  WinMsg.Result := 0;
  Application.BringToFront;
end;

end.

Håber du får glæde af det ...

Jens B
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester