Задача автоматизация конвертации изображения из BMP в JPG одним кликом и интеграция с контекстным меню.
на основании статьи
http://www.itword.net/page/delphi-punkt-v-kontekstnoe http://articles.org.ru/cfaq/index.php?qid=2954
\Program Files\Borland\Delphi7\Demos\ActiveX\ShellExt - пример из демо Delphi разделим программу по конвертации appname.exe и dll для инициализации
в Dll вносим следующие изменения
1. Class_ContextMenu: TGUID = '{3ff174ae-e8bd-4d3d-95b9-9bb9cc6d4a91}';
что такое TGUID http://ru.wikipedia.org/wiki/GUID значение берем http://www.guidgenerator.com/online-guid-generator.aspx
меняем строчку добавления кнопки
2. InsertMenu(Menu, indexMenu, MF_STRING or MF_BYPOSITION, idCmdFirst,PChar('Выполнить конвертацию JPG < -- > BMP '));
3. const FileExt: array [0 .. 2] of string = ('.jpg', '.jpeg', '.bmp'); // работаем только с 3 форматами все остальное оставляем как в примере
правой кнопкой на файл с определенным расширением теперь у нас есть программа которая добавляет новый пункт в меню при щелчке на фалы с заданным разрешением. кроме того при щелчке на данные файлы происходит вызов программы appname.exe c параметрами в виде списка файлов
теперь напишем программу конвертации 1. Добавим на форму компонент TCheckListBox для выбора 2. напишем процедуру загрузки списка файлов из нашей dll
procedure TForm1.FormCreate(Sender: TObject); var cmd : string; i : Integer; pr,dir:string;
begin // Показ этих параметров - обратите внимание, что 0-ой параметр это // выполняемая команда в Windows // получаем список файлов в TCheckListBox dir:=ParamStr(2); for i := 3 to ParamCount do begin pr:=ParamStr(i); if pr<>'' then if pr[1]='*' then begin pr:=dir+copy(pr,2,length(pr)); end; form1.CheckListBox1.Checked[form1.CheckListBox1.Items.Add(pr)]:=true; end;
end
из наших примеров возьмем функции
uses jpeg;
procedure JPEGtoBMP(const FileName: TFileName);
var
jpeg: TJPEGImage;
bmp: TBitmap;
begin
jpeg := TJPEGImage.Create;
try
jpeg.CompressionQuality := 100; {Default Value}
jpeg.LoadFromFile(FileName);
bmp := TBitmap.Create;
try
bmp.Assign(jpeg);
bmp.SaveTofile(ChangeFileExt(FileName, '.bmp'));
finally
bmp.Free
end;
finally
jpeg.Free
end;
end;
procedure BMPToJPEG(const FileName: TFileName);
var
jpeg: TJPEGImage;
bmp: TBitmap;
begin
bmp := Tbitmap.Create;
jpeg := TJPEGImage.Create;
try
bmp.LoadFromFile(FileName);
try
jpeg.Assign(bmp);
jpeg.CompressionQuality := 100; {Default Value}
jpeg.SaveTofile(ChangeFileExt(FileName, '.jpg'));
finally
bmp.Free;
jpeg.Free;
end;
finally
end;
end;
теперь добавим выбор возможности конвертации с помощью компонента TCombobox Добавим в свойство Items
*.jpg *.bmp и выставим form1.ComboBox1.ItemIndex:=0 - тип выходных файлов по умолчанию JPG
Напишем процедуру конвертации списка файлов
procedure TForm1.Button1Click(Sender: TObject); var x:integer; begin for X:=0 to form1.CheckListBox1.Items.Count-1 do begin try if form1.CheckListBox1.Checked[x] then if form1.ComboBox1.ItemIndex=1 then JPEGtoBMP(form1.CheckListBox1.Items[x]) else BMPToJPEG(form1.CheckListBox1.Items[x])
except end; end; Showmessage('Файлы конвертированы '); end;
не большая команда для регистрации DLL uses Shellapi;
var dir:string; begin getdir(0,dir); Shellapi.ShellExecute(application.Handle,'open',pchar('regsvr32'),pchar('"'+dir+'\contmenu_fordll.dll"'),'',5); end;
исходник программы
/52_konvertacija_jpttobmp.zip
|