打个比方,我有个自己编的记事本,然后自己定义了一种文件的扩展名,
请问怎么才能在我双击这个自定义扩展名的文件的时候自动打开的的程序并将文件中的内容读到程序中?
请问怎么才能在我双击这个自定义扩展名的文件的时候自动打开的的程序并将文件中的内容读到程序中?
解决方案 »
- 大家都来支持Delphi吧
- 想听听不同的声音
- 怎样才能学好Delphi?
- 要把窗体从内存中释放是不是在formclose中使用action:=cafree吗?
- 雪地跪求~~~请问怎样在同一个工程共用两个包含同一个pas文件的控件?~~100分相赠!!UP有分!
- 我把一个控件hide了,现在怎么把它弄出来呢
- 用lable组件的时候如果输入中文经常会出现字体变形或重叠的情况怎么解决啊
- 怎样将文本框里的值转成16进制数(不考虑异常处理)
- 急!哪里有Dx系列的控件下载?
- 关于memo控件内容存储问题
- 关于数据库里面DATE格式的field如何用combobox(或者DBComboBox)显示?
- DBE事務回滾怎么写?
我也想知道具體如何做,大家可能都知道是通過注冊表實現的。
能不能透點代碼出來呀。
uses
registry, shlobj; procedure TForm1.RegisterFileType(prefix: string; exepfad: string);
var
reg: TRegistry;
begin
reg := TRegistry.Create;
try
reg.RootKey := HKEY_CLASSES_ROOT;
//create a new key --> .pci
reg.OpenKey('.' + prefix, True);
try
//create a new value for this key --> pcifile
reg.Writestring('', prefix + 'file');
finally
reg.CloseKey;
end;
//create a new key --> pcifile
reg.CreateKey(prefix + 'file');
//create a new key pcifile\DefaultIcon
reg.OpenKey(prefix + 'file\DefaultIcon', True);
//and create a value where the icon is stored --> c:\project1.exe,0
try
reg.Writestring('', exepfad + ',0');
finally
reg.CloseKey;
end;
reg.OpenKey(prefix + 'file\shell\open\command', True);
//create value where exefile is stored --> c:\project1.exe "%1"
try
reg.Writestring('', exepfad + ' "%1"');
finally
reg.CloseKey;
end;
finally
reg.Free;
end;
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
RegisterFileType('pci', 'c:\project1.exe');
end;
*****************************************
注意,在下面这些操作之后,应该发送一个刷新的消息给系统:
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);通过对注册表进行修改,可以删除一种文件名后缀与某个应用程序相关联
程序例如下:
procedure deregisterFileType(ft: String);
//ft:将要删除文件关联的后缀,如.tst
var
myreg:TRegistry;
key: String;
begin
myreg:=TRegistry.Create;
myReg.RootKey:=HKEY_CLASSES_ROOT;
myReg.OpenKey(ft, False);
key:=MyReg.ReadString('');
MyReg.CloseKey;
myReg.DeleteKey(ft);
myReg.DeleteKey(key);
myReg.Free;
end;
调用例子:
Example:
deregisterFileType('.tst');
通过对注册表进行修改,可以删除资源管理器上下文件菜单中的新建子菜单中的命令
程序例如下:procedure FileTDelNew(ft: String);//fp:文件后缀键值,如.tst
var
myReg:TRegistry;
begin
myReg:=TRegistry.Create;
myReg.RootKey:=HKEY_CLASSES_ROOT;
if not myReg.KeyExists(ft) then
begin
MyReg.Free;
Exit;
end;
MyReg.OpenKey(ft, true);
if MyReg.KeyExists('ShellNew') then
MyReg.DeleteKey('ShellNew');
MyReg.CloseKey;
MyReg.Free;
end;
调用例子:
Example:
FileTDelNew('.tst');
原理说明:
将后缀键的下面的子键ShellNew删除即可。
通过对注册表进行修改,可以删除资源管理器上下文件菜单中对某类文件的处理命令
程序例如下:
procedure FileTDelAction(key, name: String);
//key:关联键值为后缀的描述键值,如.tst对应testfile,则key:=testfile
//name:命令名称
var
myReg: TRegistry;
begin
myReg:=TRegistry.Create;
myReg.RootKey:=HKEY_CLASSES_ROOT; //如果给出的是一个文件后缀,则转换成对应的描述键值
//在生成文件关联时,如果未给出描述键值,则会自动生成,此处与上面是联系的{ if key[1] = '.' then
key:= copy(key,2,maxint)+'_auto_file';} if key[1] = '.' then
begin
if myReg.KeyExists(key) then //首先看注册表中是否有此键,有则取出
begin
myReg.OpenKey(key, false);
key:=myReg.ReadString ('');
end
else
key:= copy(key,2,maxint)+'_auto_file';
end; if key[Length(key)-1] <> '\' then
key:=key+'\';
myReg.OpenKey('\'+key+'shell\', true);
if myReg.KeyExists(name) then
myReg.DeleteKey(name);
myReg.CloseKey;
myReg.Free;
end;
Example:
FileTDelAction('test','edit');原理说明:
将注册表中对应的键值删除就可以了。
通过对注册表进行修改,可以实现一种文件名后缀与某个应用程序相关联
程序例如下:
procedure registerfiletype(ft,key,desc,icon,prg:string);
//ft:文件名后缀,如可以为'.tst'或'afile.tst'
//key:在注册表中的键值,要唯一
//desc:关联程序的描述
//icon:缺省的程序图标,如Application.ExeName+',1',可以缺省
//prg:对应的应用程序
var myreg : treginifile;
ct : integer;
begin // 取文件的后缀
ct := pos('.',ft);
while ct > 0 do begin
delete(ft,ct,1);
ct := pos('.',ft);
end;
if (ft = '') or (prg = '') then exit; //判断后缀及应用程序是否有效
ft := '.'+ft;
myreg := treginifile.create('');
try
myreg.rootkey := hkey_classes_root; // 根应该为HKEY_CLASSES_ROOT
if key = '' then key := copy(ft,2,maxint)+'_auto_file';
// 如果没给出键值,则自动创建一个
myreg.writestring(ft,'',key); // 写入描述的键值
myreg.writestring(key,'',desc); // 写入描述
if icon <> '' then
myreg.writestring(key+'\DefaultIcon','',icon);
// 写入缺省图标
myreg.writestring(key+'\shell\open\command','',prg+' "%1"');
//写入相关联的应用程序
finally
myreg.free;
end;
end;
调用例子:
Example:
registerFileType('.tst',
'testfile',
'测试关联文件',
Application.ExeName+',1',
Application.ExeName);
原理说明:
程序关联的键值放在注册表根为HKEY_CLASSES_ROOT下面。实现文件关联要写入两
个键值:后缀键值和描述键值(可用术语用的不对)
如实现将.tst与程序tstfile.exe相关联
其中后缀键值形为: .tst myprogram
key值为文件后缀,取值为对于key的一个描述
描述键值形为: myprogram 文件描述
其中还有相应的子键,如缺省的程序图标,形为:
myprogram\DefaultIcon '', 'tstfile.exe,1'
打开命令,形为:
myprogram\shell\open\command '', 'tstfile.exe "%1"'
写入完这两个键值后就可以实现文件与应用程序相关联了。
通过对注册表进行修改,可以在资源管理器上下文件菜单中的新建子菜单中增加新的命令
程序例如下:
type
TFileNewType = (ftNullFile, ftFileName, ftCommand); procedure FileTAddNew(ft, param: String; newType: TFileNewType);
//fp:文件后缀键值,如.tst
//param:传递参数
//newType:新建的类型,有空文件, 文件名, 命令
var
myReg:TRegistry;
begin
myReg:=TRegistry.Create;
myReg.RootKey:=HKEY_CLASSES_ROOT;
if not myReg.KeyExists(ft) then
begin
MyReg.Free;
Exit;
end;
myReg.OpenKey(ft+'\ShellNew', true);
case NewType of
ftNullFile : MyReg.WriteString('NullFile', '');
ftFileName : MyReg.WriteString('FileName', param);
ftCommand : MyReg.WriteString('Command', param);
end;
MyReg.CloseKey;
MyReg.Free;
end;
调用例子:
Example:
FileTAddNew('.tst','', ftNullFile);
原理说明:
在后缀键的下面增加子键ShellNew。如在上下文菜单中增加新建.tst文件的命令
在.tst键值下面增加子键 .tst\ShellNew 'NullFile', ''
通过对注册表进行修改,可以在资源管理器上下文菜单中增加对某类文件的处理命令
程序例如下:procedure FileTAddAction(key, name, display, action: String);
//key:关联键值为后缀的描述键值,如.tst对应testfile,则key:=testfile
//name:命令名称
//display:在上下文件菜单上显示的提示信息
//action:对应的命令
var
myReg:TRegistry;
begin
myReg:=Tregistry.Create;
myReg.RootKey:=HKEY_CLASSES_ROOT;
if name='' then name:=display;
//如果给出的是一个文件后缀,则转换成对应的描述键值
//在生成文件关联时,如果未给出描述键值,则会自动生成,此处与上面是联系的{ if key[1] = '.' then
key:= copy(key,2,maxint)+'_auto_file';} if key[1] = '.' then
begin
if myReg.KeyExists(key) then //首先看注册表中是否有此键,有则取出
begin
myReg.OpenKey(key, false);
key:=myReg.ReadString ('');
end
else
key:= copy(key,2,maxint)+'_auto_file';
end; if key[Length(key)-1] <> '\' then
key:=key+'\';
if name[Length(name)-1] <> '\' then
name:=name+'\'; myReg.OpenKey(key+'Shell\'+name, true);
myReg.WriteString('', display);
MyReg.CloseKey;
MyReg.OpenKey(key+'Shell\'+name+'Command\', true);
MyReg.WriteString('', action);
myReg.Free;
end;
调用例子:
Example:
FileTAddAction('testfile','edit','Edit',Application.ExeName+'-e "%1"');原理说明:
如.txt对应的描述键值为testfile
则在testfile的键值下面,增加动作子键
如: testfile\shell\ '', Edit
testfile\shell\Command\ '', 'c:\testfile -e "%1"'
就像Word一样,只要打开*.doc文件就会把Word打开然后文件的内容就会在Word上显示出来,
我的问题就是怎么在打开文件时读到文件内容??
我都晕死了!!!!!......../////
大家为什么就是听不明白呢??!!打比方说:我编一个记事本,在注册表中加入扩展名.ywl,然后用户在编缉完文档后就保存为如 a.ywl ,
然后有一天用户要打开这个名为 a.ywl 的文件查看,他肯定会双击此文件,然后操作系就会根据此类扩展名文件的关联信息运行我编的记事本程序,但是里面会显示这个文件的内容吗???.....