DVDUnit.pas
上传用户:wanyu_2000
上传日期:2021-02-21
资源大小:527k
文件大小:9k
源码类别:

DVD

开发平台:

Delphi

  1. unit DVDUnit;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  5.   Menus, ExtCtrls, ComCtrls, StdCtrls, DVDImage, ISO9660MicroUDFImageTree,
  6.   ImgList,Resources;
  7. type
  8.   TISOForm = class(TForm)
  9.     StatusBar1: TStatusBar;
  10.     MainMenu1: TMainMenu;
  11.     mm_File: TMenuItem;
  12.     sm_File_Open: TMenuItem;
  13.     sm_File_Close: TMenuItem;
  14.     sm_File_Break1: TMenuItem;
  15.     sm_File_Quit: TMenuItem;
  16.     dlg_OpenImage: TOpenDialog;
  17.     SaveDialog1: TSaveDialog;
  18.     sm_File_SaveAs: TMenuItem;
  19.     ImageList1: TImageList;
  20.     Panel1: TPanel;
  21.     mem_DebugOut: TMemo;
  22.     tv_Directory: TTreeView;
  23.     Panel2: TPanel;
  24.     VolIDEdit: TEdit;
  25.     Label1: TLabel;
  26.     PopupMenu1: TPopupMenu;
  27.     CreateDirctory1: TMenuItem;
  28.     N2: TMenuItem;
  29.     DeleteDirectory1: TMenuItem;
  30.     AddFile1: TMenuItem;
  31.     OpenDialog2: TOpenDialog;
  32.     NewISOImage1: TMenuItem;
  33.     SaveDVDImageas1: TMenuItem;
  34.     N3: TMenuItem;
  35.     Procedure ISOStatus(CurrentStatus:String);
  36.     procedure sm_File_QuitClick(Sender: TObject);
  37.     procedure sm_File_OpenClick(Sender: TObject);
  38.     procedure FormCreate(Sender: TObject);
  39.     procedure FormDestroy(Sender: TObject);
  40.     procedure tv_DirectoryDblClick(Sender: TObject);
  41.     procedure sm_File_CloseClick(Sender: TObject);
  42.     procedure tv_DirectoryChange(Sender: TObject; Node: TTreeNode);
  43.     procedure Image1Click(Sender: TObject);
  44.     procedure CheckDirs1Click(Sender: TObject);
  45.     procedure CreateDVDDirctory;
  46.     procedure CreateDirctory1Click(Sender: TObject);
  47.     procedure AddFile1Click(Sender: TObject);
  48.     procedure DeleteDirectory1Click(Sender: TObject);
  49.     procedure SaveDVDImageas1Click(Sender: TObject);
  50.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  51.   private
  52.     TreeObj : TObject;
  53.     FDVDImage  : TDVDImage;
  54.     Procedure  BuildStructureTree(ATV: TTreeView; RootNode : TTreeNode; ADirEntry : TDirectoryEntry);
  55.   public
  56.     ISOFilename : String;
  57.   end;
  58. var
  59.   ISOForm: TISOForm;
  60. implementation
  61. {$R *.DFM}
  62. procedure TISOForm.ISOStatus(CurrentStatus:String);
  63. begin
  64.    mem_debugout.Lines.Add(CurrentStatus);
  65. end;
  66. procedure TISOForm.sm_File_QuitClick(Sender: TObject);
  67. begin
  68.   Close;
  69. end;
  70. procedure TISOForm.sm_File_OpenClick(Sender: TObject);
  71. Var
  72.   Node : TTreeNode;
  73. begin
  74.   If ( dlg_OpenImage.Execute ) Then
  75.   Begin
  76.     If ( Assigned(FDVDImage) ) Then  FreeAndNil(FDVDImage);
  77.     mem_DebugOut.Clear;
  78.     tv_Directory.Items.Clear;
  79.     FDVDImage := TDVDImage.Create;
  80.     Try
  81.       FDVDImage.Filename := dlg_OpenImage.FileName;
  82.       FDVDImage.OnDVDStatus := ISOStatus;
  83.       //FDVDImage.OpenImage;
  84.       Node := tv_Directory.Items.Add(Nil, FDVDImage.Volume_ID+'/');
  85.       Node.Data := FDVDImage.Structure.RootDirectory;
  86.       BuildStructureTree(tv_Directory, Node, FDVDImage.Structure.RootDirectory);
  87.       sm_File_SaveAs.Enabled := True;
  88.       sm_File_Close.Enabled := True;
  89.     Except
  90.          mem_DebugOut.Lines.Add('Exception: ' + Exception(ExceptObject).ClassName + ' -> ' + Exception(ExceptObject).Message);
  91.       Raise;
  92.     End;
  93.   End;
  94. end;
  95. procedure TISOForm.FormCreate(Sender: TObject);
  96. begin
  97.   FDVDImage := Nil;   // not necessary, but safety first...
  98. end;
  99. procedure TISOForm.FormDestroy(Sender: TObject);
  100. begin
  101.   If ( Assigned(FDVDImage) ) Then FreeAndNil(FDVDImage);
  102. end;
  103. procedure TISOForm.tv_DirectoryDblClick(Sender: TObject);
  104. Var
  105.   Node : TTreeNode;
  106.   Obj  : TObject;
  107. begin
  108.   Node := TTreeView(Sender).Selected;
  109.   If Assigned(Node.Data) Then
  110.   Begin
  111.     Obj := TObject(Node.Data);
  112.     If ( Obj Is TFileEntry ) And ( SaveDialog1.Execute ) Then
  113.       FDVDImage.ExtractFile(TFileEntry(Obj), SaveDialog1.FileName);
  114.   End;
  115. end;
  116. Procedure TISOForm.BuildStructureTree(ATV: TTreeView; RootNode : TTreeNode; ADirEntry : TDirectoryEntry);
  117. Var
  118.   i : Integer;
  119.   Node : TTreeNode;
  120.   Dir  : TDirectoryEntry;
  121.   Fil  : TFileEntry;
  122. Begin
  123.   For i:=0 To ADirEntry.DirectoryCount-1 Do
  124.   Begin
  125.     Dir := ADirEntry.Directories[i];
  126.     Node := ATV.Items.AddChild(RootNode, Dir.Name + '/');
  127.     Node.ImageIndex := 1;
  128.     Node.SelectedIndex := 1;
  129.     Node.Data := Pointer(Dir);
  130.     BuildStructureTree(ATV, Node, Dir);
  131.   End;
  132.   For i:=0 To ADirEntry.FileCount-1 Do
  133.   Begin
  134.     Fil := ADirEntry.Files[i];
  135.     Node := ATV.Items.AddChild(RootNode, Fil.Name);
  136.     Node.ImageIndex := 2;
  137.     Node.SelectedIndex := 2;
  138.     Node.Data := Pointer(Fil);
  139.   End;
  140. End;
  141. procedure TISOForm.sm_File_CloseClick(Sender: TObject);
  142. begin
  143.   If ( Assigned(FDVDImage) ) Then FDVDImage.CloseImage;
  144.   sm_File_Close.Enabled  := False;
  145.   sm_File_SaveAs.Enabled := False;
  146. end;
  147. procedure TISOForm.tv_DirectoryChange(Sender: TObject; Node: TTreeNode);
  148. begin
  149.   If Assigned(Node) Then
  150.   Begin
  151.     TreeObj := TObject(Node.Data);
  152.  End;
  153. end;
  154. procedure TISOForm.Image1Click(Sender: TObject);
  155. var
  156.      DirEntry : TDirectoryEntry;
  157.      FileEntry : TFileEntry;
  158. begin
  159.     If ( Assigned(FDVDImage) ) Then FreeAndNil(FDVDImage);
  160.     FDVDImage := TDVDImage.Create;
  161.     FDVDImage.OnDVDStatus := ISOStatus;
  162.     CheckDirs1Click(nil);
  163.     CreateDVDDirctory;
  164. end;
  165. procedure TISOForm.CheckDirs1Click(Sender: TObject);
  166. Var
  167.   Node : TTreeNode;
  168. begin
  169.     tv_Directory.Items.Clear;
  170.     Try
  171.       Node := tv_Directory.Items.Add(Nil, '/');
  172.       Node.ImageIndex := 0;
  173.       Node.Data := FDVDImage.Structure.RootDirectory;
  174.       BuildStructureTree(tv_Directory, Node, FDVDImage.Structure.RootDirectory);
  175.       tv_Directory.Items[0].Expand(true);
  176.     Except
  177.       mem_DebugOut.Lines.Add('Exception: ' + Exception(ExceptObject).ClassName + ' -> ' + Exception(ExceptObject).Message);
  178.       Raise;
  179.     End;
  180. end;
  181. procedure TISOForm.CreateDVDDirctory;
  182. var
  183.         DirName : String;
  184.         DirEntry : TDirectoryEntry;
  185. begin
  186.         DirEntry := FDVDImage.Structure.RootDirectory;
  187.         DirName := 'VIDEO_TS';
  188.         if DirName <> '' then
  189.         begin
  190.            DirEntry := TDirectoryEntry.Create(FDVDImage.Structure,DirEntry,dsfFromImage);
  191.            DirEntry.Name := DirName;
  192.         end;
  193.         DirEntry := FDVDImage.Structure.RootDirectory;
  194.         DirName := 'AUDIO_TS';
  195.         if DirName <> '' then
  196.         begin
  197.            DirEntry := TDirectoryEntry.Create(FDVDImage.Structure,DirEntry,dsfFromImage);
  198.            DirEntry.Name := DirName;
  199.         end;
  200.         CheckDirs1Click(nil);
  201. end;
  202. procedure TISOForm.CreateDirctory1Click(Sender: TObject);
  203. var
  204.         DirName : String;
  205.         DirEntry : TDirectoryEntry;
  206. begin
  207.     If Assigned(TreeObj) Then
  208.     Begin
  209.       If ( TreeObj Is TDirectoryEntry ) Then
  210.       Begin
  211.         DirEntry := TDirectoryEntry(TreeObj);
  212.         DirName := InputBox('New Dir : ','Dir : ','');
  213.         if DirName <> '' then
  214.         begin
  215.            DirEntry := TDirectoryEntry.Create(FDVDImage.Structure,DirEntry,dsfFromImage);
  216.            DirEntry.Name := DirName;
  217.         end;
  218.         CheckDirs1Click(nil);
  219.       End;
  220.     End;
  221. end;
  222. procedure TISOForm.AddFile1Click(Sender: TObject);
  223. var
  224.         DirName : String;
  225.         DirEntry : TDirectoryEntry;
  226.         FileEntry : TFileEntry;
  227. begin
  228.     If Assigned(TreeObj) Then
  229.     Begin
  230.       If ( TreeObj Is TDirectoryEntry ) Then
  231.       Begin
  232.         DirEntry := TDirectoryEntry(TreeObj);
  233.         if OpenDialog2.execute then
  234.         begin
  235.            FileEntry := TFileEntry.Create(DirEntry,dsfFromLocal);
  236.            FileEntry.Name := ExtractFilename(Opendialog2.filename);
  237.            FileEntry.SourceFileName := Opendialog2.filename;
  238.         end;
  239.         CheckDirs1Click(nil);
  240.       End;
  241.     End;
  242. end;
  243. procedure TISOForm.DeleteDirectory1Click(Sender: TObject);
  244. var
  245.         DirName : String;
  246.         DirEntry : TDirectoryEntry;
  247. begin
  248.     If Assigned(TreeObj) Then
  249.     Begin
  250.       If ( TreeObj Is TDirectoryEntry ) Then
  251.       Begin
  252.         DirEntry := TDirectoryEntry(TreeObj).Parent;
  253.         DirEntry.DelDirectory(TDirectoryEntry(TreeObj));
  254.         CheckDirs1Click(nil);
  255.       End;
  256.     End;
  257. end;
  258. procedure TISOForm.SaveDVDImageas1Click(Sender: TObject);
  259. begin
  260.     savedialog1.Title := resFileDialogTitle;
  261.     if savedialog1.execute then
  262.     begin
  263.        ISOFilename := savedialog1.filename;
  264.        FDVDImage.Filename := ISOFilename;
  265.        FDVDImage.Volume_ID := VolIDEdit.text;
  266.        FDVDImage.SaveDVDImageToDisk;
  267.        ShowMessage(resISOSaved);
  268.     end;
  269. end;
  270. procedure TISOForm.FormClose(Sender: TObject; var Action: TCloseAction);
  271. begin
  272. If ( Assigned(FDVDImage) ) Then FreeAndNil(FDVDImage);
  273. end;
  274. end.