В данном посте интегрируем TAudioPanelWMP и TVideoPanelWMP в TRichViewEdit. Выглядеть это будет примерно так…
Здесь нужно корректно добавить в TrichView и корректно удалить. Также, в случае TVideoPanelWMP, нужно дополнительно обработать растягивание компонента. А точнее, сделать TrichView.ReformatAll по окончании растягивания компонента.
Добавление аудио плеера
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
procedure TMainForm.AddAudio(Sender: TObject); var button:tbutton; audioPanel:TAudioPanel; audioPanelWMP:TAudioPanelWMP; ComponentName:string; Component:TComponent; TempCompName:string; DirectoryToCopyAudio:string; i:integer; ItemNo:integer; DestName: string; ItemTag: string; ShortFileName: string; begin // RichViewEdit1.SetItemExtraIntProperty(ItemNo1, rvepShared, 1) if (OpenDialog.Execute) and (ExtractFileExt(OpenDialog.FileName)='.mp3') then begin //Создание и добавление аудиоплеера inc(FAudioPanelWMPNumber); ComponentName:=FAudioPanelWMPNamePrefix+(FAudioPanelWMPNumber).ToString; TAudioPanelWMP.Create(Self).Name:=ComponentName; Component:=FindComponent(ComponentName); RichViewEdit1.InsertControl(ComponentName,TAudioPanelWMP(Component),rvvaAbsBottom); //Копируем выбранный файл в папку files\audio\ DirectoryToCopyAudio:=ExtractFileDir(Application.ExeName); DirectoryToCopyAudio:=DirectoryToCopyAudio+'\files\audio\'; // Создаем директорию, если не существовала if not TDirectory.Exists(DirectoryToCopyAudio) then begin try TDirectory.CreateDirectory(DirectoryToCopyAudio); except on E:Exception do showmessage(E.ClassName+' поднята ошибка, с сообщением : '+E.Message); end; end; //Копируем аудиофайл в нашу директорию, в папку files/audio try DestName:=DirectoryToCopyAudio+ExtractFileName(OpenDialog.FileName); // Если файла там не существует, тогда копируем его туда if not TFile.Exists(DestName) then TFile.Copy(OpenDialog.FileName,DestName); except on E:Exception do showmessage(E.ClassName+' поднята ошибка, с сообщением : '+E.Message); end; //Ограничиваем длину имени файла ShortFileName:=ExtractFileName(OpenDialog.FileName); if (length(ShortFileName))>60 then ShortFileName:=ShortFileName.Substring(0,60)+'...'; //Настраиваем путь к файлу и сам плеер TAudioPanelWMP(Component).FWMP.URL:=DestName;// OpenDialog.FileName; TAudioPanelWMP(Component).FlFileName.Caption:=ShortFileName; TAudioPanelWMP(Component).FWMP.controls.play; TAudioPanelWMP(Component).FWMP.controls.stop; //Устанавливаем в таг путь до файла .mp3 ItemNo:=RichViewEdit1.GetItemNo(RichViewEdit1.GetCurrentItem); ItemTag:=TAudioPanelWMP(Component).FWMP.URL; RichViewEdit1.SetItemTag(ItemNo,ItemTag); // showmessage(RichViewEdit1.GetItemTag(ItemNo)); // Ставим защиту от Del и BackSpace, а также говорим TRichView, не уничтожать добавленные контролы // Удаление будет происходить при нажати Del for I := 0 to RichViewEdit1.ItemCount-1 do begin RichViewEdit1.SetItemExtraIntProperty(i, rvepShared, 1); RichViewEdit1.SetItemExtraIntProperty(i, rvepDeleteProtect, 1) end; end else if (OpenDialog.FileName<>'') and (ExtractFileExt(OpenDialog.FileName)<>'.mp3') then raise Exception.Create('Only MP3 files supported for the moment'); end; |
Добавление видео-плеера
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
procedure TMainForm.bVideoClick(Sender: TObject); var ComponentName: string; Component: TComponent; DirectoryToCopyVideo: string; DestName: string; ShortFileName: string; ItemNo: Integer; ItemTag: string; local_i: Integer; begin if (OpenDialog.Execute) and (ExtractFileExt(OpenDialog.FileName)='.mp4') then begin // Вставляем новый контрол inc(FVideoPanelWMPNumber); ComponentName:=FVideoPanelWMPNamePrefix+(FVideoPanelWMPNumber).ToString; TVideoPanelWMP.Create(Self).Name:=ComponentName; Component:=FindComponent(ComponentName); RichViewEdit1.InsertControl(ComponentName,TVideoPanelWMP(Component),rvvaAbsBottom); //Копируем выбранный файл в папку files\audio\ DirectoryToCopyVideo:=ExtractFileDir(Application.ExeName); DirectoryToCopyVideo:=DirectoryToCopyVideo+'\files\video\'; // Создаем директорию, если не существовала if not TDirectory.Exists(DirectoryToCopyVideo) then begin try TDirectory.CreateDirectory(DirectoryToCopyVideo); except on E:Exception do showmessage(E.ClassName+' поднята ошибка, с сообщением : '+E.Message); end; end; //Копируем видео-файл в нашу директорию, в папку files/video try DestName:=DirectoryToCopyVideo+ExtractFileName(OpenDialog.FileName); // Если файла там не существует, тогда копируем его туда if not TFile.Exists(DestName) then TFile.Copy(OpenDialog.FileName,DestName); except on E:Exception do showmessage(E.ClassName+' поднята ошибка, с сообщением : '+E.Message); end; //Ограничиваем длину имени файла ShortFileName:=ExtractFileName(OpenDialog.FileName); if (length(ShortFileName))>60 then ShortFileName:=ShortFileName.Substring(0,60)+'...'; //Настраиваем путь к файлу и сам плеер TVideoPanelWMP(Component).FWMP.URL:=DestName;//OpenDialog.FileName; TVideoPanelWMP(Component).FlFileName.Caption:=ShortFileName; TVideoPanelWMP(Component).FWMP.controls.play; TVideoPanelWMP(Component).FWMP.controls.stop; //Устанавливаем в таг путь до файла .mp3 ItemNo:=RichViewEdit1.GetItemNo(RichViewEdit1.GetCurrentItem); ItemTag:=TVideoPanelWMP(Component).FWMP.URL; RichViewEdit1.SetItemTag(ItemNo,ItemTag); // showmessage(RichViewEdit1.GetItemTag(ItemNo)); // Ставим защиту от Del и BackSpace, а также говорим TRichView, не уничтожать добавленные контролы // Удаление будет происходить при нажати Del for local_i := 0 to RichViewEdit1.ItemCount-1 do begin RichViewEdit1.SetItemExtraIntProperty(local_i, rvepShared, 1); RichViewEdit1.SetItemExtraIntProperty(local_i, rvepDeleteProtect, 1) end; end else if (OpenDialog.FileName<>'') and (ExtractFileExt(OpenDialog.FileName)<>'.mp4') then raise Exception.Create('Only mp4 files supported for the moment'); end; |
Удаление аудио и видео плееров
В Application Events On Mesasage добавляем следующее
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
procedure TMainForm.ApplicationEventsMessage(var Msg: tagMSG; var Handled: Boolean); //var i,j:integer; IndexToDelete:integer; FilePath:string; var i:integer; begin DeleteAudioVideoPanels(Msg, i); // Для обновления форматирования после растягивания TVideoPanelWMP if Msg.message = WM_KeyDown then begin if msg.wParam = VK_SHIFT then RichViewEdit1.ReformatAll; end; end; |
Собственно удаление аудио и видео плееров
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
//------------------Удаление аудио, видео плееров procedure TMainForm.DeleteAudioVideoPanels(var Msg: tagMSG; var i: Integer); var ComponentName: string; Local_i,j,ItemNo: Integer; FilePath:string; IndexToDelete:integer; DestName: string; DestDir: string; begin // //Удаление аудио и видео-панелей if Msg.message = WM_KeyDown then begin if msg.wParam = VK_DELETE then for Local_i := 0 to Self.ComponentCount - 1 do begin //Удаление аудио-панели if (Self.Components[Local_i] is TAudioPanelWMP) and ((Self.Components[Local_i] as TAudioPanelWMP).Focused) then begin DeleteAudioPanelWMP(Local_i, DestName, DestDir, j); break; end; //Удаление видео-панели if (Self.Components[Local_i] is TVideoPanelWMP) and ((Self.Components[Local_i] as TVideoPanelWMP).Focused) then begin DeleteVideoPanelWMP(Local_i, DestName, DestDir, j); break; end; end; end; end; |
Вспомогательные методы для удаления аудио и видео плееров
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
procedure TMainForm.DeleteVideoPanelWMP(Local_i: Integer; DestName: string; DestDir: string; j: Integer); var DestNameVideo: WideString; DestDirVideo: string; Local_j: Integer; Local_j1: Integer; begin //Удаление видео-файла DestNameVideo := TVideoPanelWMP((Self.Components[Local_i] as TVideoPanelWMP)).FWMP.URL; DestDirVideo := ExtractFileDir(Application.ExeName) + '\files\video\'; DestNameVideo := DestDir + ExtractFileName(TVideoPanelWMP((Self.Components[Local_i] as TVideoPanelWMP)).FWMP.URL); try if TFile.Exists(DestName) then Tfile.Delete(DestName); except on E: EInOutError do raise Exception.Create('Please,close browser before deleting, file is busy' + ''#13''#10'' + ''#13''#10'' + E.ClassName + ' поднята ошибка, с сообщением : ' + E.Message); on E: Exception do raise Exception.Create(E.ClassName + ' Exception Raised : ' + E.Message); end; // Снимаем блокировку для всех нетекстовых итемов for Local_j := 0 to RichViewEdit1.ItemCount - 1 do RichViewEdit1.SetItemExtraIntProperty(Local_j, rvepDeleteProtect, 0); //Удаление области, занимаемой контролом RichViewEdit1.SelectControl(TVideoPanelWMP((Self.Components[Local_i] as TVideoPanelWMP))); RichViewEdit1.DeleteSelection; // Ставим блокировку для всех нетекстовых итемов for Local_j1 := 0 to RichViewEdit1.ItemCount - 1 do RichViewEdit1.SetItemExtraIntProperty(Local_j1, rvepDeleteProtect, 1); //Собственно удаление контрола из памяти TVideoPanelWMP((Self.Components[Local_i] as TVideoPanelWMP)).Free; end; procedure TMainForm.DeleteAudioPanelWMP(Local_i: Integer; var DestName: string; var DestDir: string; var j: Integer); var Local_j: Integer; Local_j1: Integer; begin //Удаление *.mp3 файла из files/audio DestName := TAudioPanelWMP((Self.Components[Local_i] as TAudioPanelWMP)).FWMP.URL; DestDir := ExtractFileDir(Application.ExeName) + '\files\audio\'; DestName := DestDir + ExtractFileName(TAudioPanelWMP((Self.Components[Local_i] as TAudioPanelWMP)).FWMP.URL); try if TFile.Exists(DestName) then Tfile.Delete(DestName); except on E: EInOutError do raise Exception.Create('Please,close browser before deleting, file is busy' + ''#13''#10'' + ''#13''#10'' + E.ClassName + ' поднята ошибка, с сообщением : ' + E.Message); on E: Exception do raise Exception.Create(E.ClassName + ' Exception Raised : ' + E.Message); end; // Снимаем блокировку для всех нетекстовых итемов for Local_j := 0 to RichViewEdit1.ItemCount - 1 do RichViewEdit1.SetItemExtraIntProperty(Local_j, rvepDeleteProtect, 0); //Удаление области, занимаемой контролом RichViewEdit1.SelectControl(TAudioPanelWMP((Self.Components[Local_i] as TAudioPanelWMP))); RichViewEdit1.DeleteSelection; // Ставим блокировку для всех нетекстовых итемов for Local_j1 := 0 to RichViewEdit1.ItemCount - 1 do RichViewEdit1.SetItemExtraIntProperty(Local_j1, rvepDeleteProtect, 1); //Собственно удаление контрола из памяти TAudioPanelWMP((Self.Components[Local_i] as TAudioPanelWMP)).Free; end; |