Напук на бележника
Изглежда, че сме разбрали асоциацията на разширенията - нека да продължим. Какво означава сами да регистрирате разширения? А това означава, че трябва да кажете на Windows: "Ето ново разширение за теб, изсмуквай го, приятелко!" и регистрирайте програма, която ще работи с това разширение - това ще бъде "програмата по подразбиране". Тоест: ще регистрирате разширението .maks и сега всеки път, когато отворите *.maks файл, вашата програма (която вероятно сте създали сами) ще се отвори и ще се появи икона, съответстваща на иконата на програмата.
С това също изглежда всичко е ясно - прем напред. Регистрация на елемент от контекстното меню. Е, тук всичко е лесно - вашият елемент се създава в основния контекст на Windows, когато щракнете върху него, вашето приложение се отваря със съдържанието на файла, спрямо който се намира менюто. Prog също може да се направи от всеки.
if (ParamCount > 0) и FileExists(ParamStr(1)) then RichEdit.LoadFromFile(ParamStr(1)); // ако веднага отворим файла от Windows, след това го заредим в редактора
Сега можете лесно и бързо да работите с документи с вашия редактор, без първо да го инсталирате в системата. Самият Windows разпознава полето за редактиране и ще въвежда данни там след отваряне!
И не забравяйте, че всичко, което ще ви покажа сега, изисква познания за работа с регистъра - но това не е основното по принцип. Просто направих всичко под Windows XP, а регистърът на XP и регистърът на Lenollium са две различни неща. Следователно не давам никаква гаранция, че всичко ще бъде наред с вас в друга операционна система (дори казвам с увереност, че в допълнение към XP имате асоциация и други боклуци като цяло няма да работят в друга система:
И всичко това може да се направи програмно с помощта на нашия любим Delphi.
обяснете азЩе го направя, базирано на устройство с Delphi 7, но в други среди този процес няма да се различава изобщо, тъй като модулът на регистъра работи навсякъде.
използва unit2; //Задължително.
Свързан, както и да е, form2 няма да се вижда никъде, когато стартираме програмата. За да направите това, трябва да го извикате. Как ще го наречете, зависи от вас. Възможно е да създадете главно меню отгоре и от там, но няма да обяснявам как да стане това. Току-що взех и поставих обикновен бутон на RichEdit1 - не много правилен, но на видно място. Сега обработваме събитието onclick на бутона button1 (за да направите това, щракнете върху него 2 пъти).
procedure TForm1.Button1Click(Sender: TObject); begin // извикване на формуляра, така че да остане на фокус, докато не го деактивираме form2.ShowModal; end;
Това е всичко, сега поставяме няколко компонента на form2: 2 edit'a, 2 checkbox'a, 3 button'a.
Първото Редактиране ще бъде нашият вход за разширението, което искаме да регистрираме, така че нека променим свойството му име на extension. И първият бутон ще регистрира това разширение при нас - нека го наречем createext, вторият бутон ще дезинтегрира това разширение (каква умна дума измислих :) - нека го наречем deleteext. ако отметката е активирана - има кръстче, тогава свързваме нашата програма с разширението *.txt, ако е деактивирано - няма кръстче, тогава анулираме интеграцията, като напишем бележника "програма по подразбиране" (както беше в началото :). Така че нека променим името му на txt. Второто квадратче за отметка ще работи във връзка с edit2 : в edit2 ще въведем елемента в контекстното меню, което трябва да регистрираме, и квадратчето за отметка ще ни каже дали да създадем този елемент или да изтрием (активирано - създаване,изключено - изтрий :). Променете името на втория флаг на context и името на втория edit'a на contextstr. Направих промени в името само за удобство (за да не се обърка :). И накрая последният бутон на име Gues ще свърши работа. тогава ще разбереш :)
И така, нека започнем да кодираме, но първо ще ви дам малко информация за регистъра:
Така че трябва да присъства и този параметър - в случай че някой случайно го изтрие.
Накратко, пристъпваме към изпълнението на функцията, която свързва нашата програма и нейната икона с разширението .txt. За да направим това, ще създадем процедура, наречена fileass, и също така ще добавим модула на регистъра, който отговаря за работата с регистъра.
използва регистър;// това е задължително private // поставете го тук procedure fileass; // функцията въвежда всички параметри на асоцииране с разширение .txt в системния регистър или ги изтрива
Сега ще направим сами регистрацията на разширенията (както си спомняме, компонентите extension , createext , deleteext са отговорни за това). За да направим това, ще създадем нова следваща процедура. И процедурата delext ще бъде отговорна за разпадането. Както винаги, ние ги добавяме в секцията ЧАСТНИ и след това ги описваме.
процедура tform2.delext; var reg:tregistry; // инициализиране на променливата за работа с регистъра begin // създаване на клас за работа с регистъра reg:=tregistry.Create; // задаване на началната секция reg.RootKey:=HKEY_CLASSES_ROOT; // изтриване на ключа като ".our extension" reg.DeleteKey('.'+extension.Text); // изтриване ключ като "!на нашето разширение" reg.DeleteKey('!'+extension.Text); // затваряне reg.CloseKey; // деактивира всичко, но запазва настройките reg.Free; end;
Така че втората част от нашето добро дело е готова. Последният е отговорен за добавяне, изтриване на елемент от контекстното меню. За това имаме (е, казапомнен :) компонентите context и contextstr отговарят. Е, както винаги, създадох нова процедура за проверка и писах в нея.
Private procedure fileass; procedure newext; procedure delext; procedure checkcontext; // проверява дали квадратчето е щракнато, създава контекстен елемент, ако е успешно, изтрива го, ако не е успешно
Така че последната процедура е готова, както можете да видите, тя проверява дали флагът е активиран: ако е активиран, тогава елементът, въведен в контекста, се създава, ако е деактивиран, тогава елементът, който е бил създаден преди това, се изтрива. Но все пак забравихме най-важното: все пак имаме само процедури: и все пак те трябва да бъдат заменени някъде, за да работят. Накратко, заместваме процедурата, отговорна за създаването на ново разширение ( newext ) в компонента createext (бутон), функцията, отговорна за изтриването на разширението (delext) в компонента deleteext (бутон). И процедурата, която асоциира вашата програма с .txt ( fileass ) и процедурата за създаване, изтриване на контекстен елемент ( checkcontext ) в компонента Gues (бутон) - това е, което беше полезно, тя ще затвори формуляра, след като направи някои промени, декларирани по-горе! Е, разбира се, всички функции трябва да бъдат регистрирани в събитието onclick на бутоните:
// реакция на бутон при щракване с мишката - създаване на разширение procedure TForm2.createextClick(Sender: TObject); begin newext; end;
// реакция на бутон при щракване на мишката - изтриване на разширение procedure TForm2.deleteextClick(Sender: TObject); begin delext; end;
// реакция на бутон при щракване на мишката - свързване с разширение .txt и създаване/изтриване на елемент в контекст procedure TForm2.GuesClick(Sender: TObject); begin fileass; checkcontext; close; край;
Е, това е общо взето всичко. разбира се, беше възможно просто да се запишат кодовете на 4-те процедури по-гореbutton onclick събития, но това не е най-удобният начин.
използва Windows, съобщения, SysUtils, варианти, класове, графики, контроли, формуляри, диалогови прозорци, StdCtrls, регистър;
type TForm2 = class(TForm) разширение: TEdit; Gues: TButton; txt: TCheckBox; context: TCheckBox; contextstr: TEdit; createext: TButton; deleteext: TButton; procedure GuesClick(Sender: TObject); proced ure createextClick(Sender: TObject); procedure deleteextClick(Sender: TObject); private procedure fileass; procedure newext; procedure delext; procedure checkcontext; public < Публични декларации > end;
procedure tform2.fileass; var reg:tregistry; begin reg:=tregistry.create; if txt.Checked then begin reg := TRegistry.Create; reg.RootKey := HKEY_CLASSES_ROOT; // ключ ".my" reg.OpenKey('.t xt') се създава ,true); // създава се параметър със стойността "myfile" reg.WriteString('', '!txt'); reg.CloseKey; // ключът "myfile\DefaultIcon" reg.OpenKey('!txt\DefaultIcon',true); // се въвежда стойността на параметъра "application name, 0" - икона reg.WriteString('', приложение. ExeName + ', 0'); reg.CloseKey; // ключ "myfile\shell\open\command" reg.OpenKey('!txt\shell\open\command', true'); // параметър със стойност "име на файл %1" reg.WriteString('', ParamStr(0) + ' "%1"'); reg.CloseKey; reg.Free; end;
if not txt.Checked then begin reg := TRegistry.Create; reg.RootKey := HKEY_CLASSES_ROOT; // ключ ".my" reg.OpenKey('.txt',true); // параметър със стойност "myfile" reg.WriteString('', '!txt'); reg е създаден .CloseKey; // ключът "myfile\DefaultIcon" е създаден reg.OpenKey('!txt\DefaultIcon',true); // стойността на параметъра "application name, 0" е въведена -icon reg.WriteString('', 'NOTEPAD.exe' + ', 0'); reg.CloseKey; // създава се ключът "myfile\shell\open\command" reg.OpenKey('!txt\shell\open\command', true); // създава се параметърът със стойност "име на файл %1" reg.WriteString( '', 'NOTEPA D.exe' + ' "%1"'); reg.CloseKey; reg.Free; end; end;
процедура tform2.delext; var reg:tregistry; // инициализиране на променлива за работа с регистъра begin // създаване на клас за работа с регистъра reg:=tregistry.Create; // задаване на началната секция reg.RootKey:=HKEY_CLASSES_ROOT // изтриване на ключ като ".our extension" reg.DeleteKey('.'+extension.Text); // изтриване на ключ като "!нашето разширение" reg.DeleteKey('!'+extension.Text); // затваряне reg.CloseKey; // деактивира всичко, но запазва настройките reg.Free; end;
procedure TForm2.GuesClick(Sender: TObject); begin fileass; checkcontext; end;
procedure TForm2.createextClick(Sender: TObject); begin newext; end;
procedure TForm2.deleteextClick(Sender: TObject); begin delext; end;
Казах ви някои полезни функции, но не взех предвид тези проблеми, които веднага ще забележите - например, не регистрирах събитията oncreate и onclose на формуляра (е, трябва да запазите настройките, отговорни за активността на квадратчетата за отметка в Inifiles, така че да няма промени :). Това е всичко, което оставям на вас. за вечеря.