persia_hrn
پنج شنبه 21 شهریور 1392, 03:15 صبح
سلام بر همه اساتید محترم
من یک برنامه کوچیک نوشتم که فایلهایی با پسوند b رو رجیستر میکنه که توسط خود فایل اجرایی باز بشن ،
مثال : فرض کنیم دوتا فایل به اسم های One.b , Two.b داریم و برنامه میاد فایل ها رو رجیستر میکنه که وقتی توی ویندوز روی اونها دوتا کلیک میکنیم توسط برنامه باز بشن و آدرسشون توی لیست نمایش داده بشه .
کد زیر رو توی برنامه نوشتم که بتونه اول فایلهای با پسوند b رو رجیتسر کنه و بعد هروقت این فایلها اجرا شد توی لیست نمایش داده بشه .
uses windows , SysUtils, ShlObj, Registry;
var j: Integer;
{$R Project1.REC}
procedure RegisterFileType(ExtName:String; AppName:String) ;
var
reg:TRegistry;
begin
reg := TRegistry.Create;
try
reg.RootKey:=HKEY_CLASSES_ROOT;
reg.OpenKey('.' + ExtName, True) ;
reg.WriteString('', ExtName + 'file') ;
reg.CloseKey;
reg.CreateKey(ExtName + 'file') ;
reg.OpenKey(ExtName + 'file\DefaultIcon', True) ;
reg.WriteString('', AppName + ',0') ;
reg.CloseKey;
reg.OpenKey(ExtName + 'file\shell\open\command', True) ;
reg.WriteString('',AppName+' "%1"') ;
reg.CloseKey;
finally
reg.Free;
end;
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil) ;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
for j := 1 to ParamCount do
ListBox1.Items.Append(ParamStr(j)) ;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
RegisterFileType('b',Application.ExeName) ;
end;
توی کد بالا با کلیک روی Button1 فایل b رجیستر میشه و توی FormCreate پارامترهای ارسالی ویندوز توی لیست نمایش داده میشه .
حالا بریم سر مشکل ، مشکل اینجاست که وقتی توی ویندوز هر دوتا فایل رو همزمان انتخاب و اجرا کنیم به جای اینکه برنامه بازشه و آدرس هر دوتا فایل توی لیست نمایش داده بشه بجاش برنامه 2 بار اجرا میشه و توی هرکدوم آدرس یکی از فایلها نمایش داده میشه .
البته میدونم که با ماتکس میتونم جلوی اجرای دوباره برنامه رو بگیرم ولی بازهم درست نشد .
کسی از اساتید میدونه چطور میشه کاری کرد که هر دوتا آدرس همزمان توی لیست برنامه لود بشه ؟
من یک برنامه کوچیک نوشتم که فایلهایی با پسوند b رو رجیستر میکنه که توسط خود فایل اجرایی باز بشن ،
مثال : فرض کنیم دوتا فایل به اسم های One.b , Two.b داریم و برنامه میاد فایل ها رو رجیستر میکنه که وقتی توی ویندوز روی اونها دوتا کلیک میکنیم توسط برنامه باز بشن و آدرسشون توی لیست نمایش داده بشه .
کد زیر رو توی برنامه نوشتم که بتونه اول فایلهای با پسوند b رو رجیتسر کنه و بعد هروقت این فایلها اجرا شد توی لیست نمایش داده بشه .
uses windows , SysUtils, ShlObj, Registry;
var j: Integer;
{$R Project1.REC}
procedure RegisterFileType(ExtName:String; AppName:String) ;
var
reg:TRegistry;
begin
reg := TRegistry.Create;
try
reg.RootKey:=HKEY_CLASSES_ROOT;
reg.OpenKey('.' + ExtName, True) ;
reg.WriteString('', ExtName + 'file') ;
reg.CloseKey;
reg.CreateKey(ExtName + 'file') ;
reg.OpenKey(ExtName + 'file\DefaultIcon', True) ;
reg.WriteString('', AppName + ',0') ;
reg.CloseKey;
reg.OpenKey(ExtName + 'file\shell\open\command', True) ;
reg.WriteString('',AppName+' "%1"') ;
reg.CloseKey;
finally
reg.Free;
end;
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil) ;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
for j := 1 to ParamCount do
ListBox1.Items.Append(ParamStr(j)) ;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
RegisterFileType('b',Application.ExeName) ;
end;
توی کد بالا با کلیک روی Button1 فایل b رجیستر میشه و توی FormCreate پارامترهای ارسالی ویندوز توی لیست نمایش داده میشه .
حالا بریم سر مشکل ، مشکل اینجاست که وقتی توی ویندوز هر دوتا فایل رو همزمان انتخاب و اجرا کنیم به جای اینکه برنامه بازشه و آدرس هر دوتا فایل توی لیست نمایش داده بشه بجاش برنامه 2 بار اجرا میشه و توی هرکدوم آدرس یکی از فایلها نمایش داده میشه .
البته میدونم که با ماتکس میتونم جلوی اجرای دوباره برنامه رو بگیرم ولی بازهم درست نشد .
کسی از اساتید میدونه چطور میشه کاری کرد که هر دوتا آدرس همزمان توی لیست برنامه لود بشه ؟