25. august 2000 - 22:58Der 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.
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..
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...
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.
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.
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
Synes godt om
Ny brugerNybegynder
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.