⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drvdlg.pas

📁 一个磁盘文件被删除后恢复的源程序! 内嵌汇编代码~!
💻 PAS
字号:
unit drvdlg;

interface

uses
  SysUtils, Windows, Messages, Classes, Graphics, Controls,
  StdCtrls, ExtCtrls, Forms, ComCtrls, diskfs, helpers, sysinfo, devices,
  Buttons;

type
  TDriveDlg = class(TForm)
    ButtonOK: TButton;
    Button2: TButton;
    PageControl1: TPageControl;
    TabsheetLogicalDrv: TTabSheet;
    TabSheetPhysicalDrv: TTabSheet;
    Label1: TLabel;
    Panel1: TPanel;
    Button3: TButton;
    ButtonPreview: TButton;
    ListView1: TListView;
    ListView2: TListView;
    ComboBoxFAT: TComboBox;
    LabelFAT: TLabel;
    CheckBoxSkipBadClus: TCheckBox;
    ButtonFind: TBitBtn;
    procedure FormActivate(Sender: TObject);
    procedure PageControl1Change(Sender: TObject);
    procedure ButtonFindClick(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure ButtonPreviewClick(Sender: TObject);
    procedure ListView1Click(Sender: TObject);
    procedure ListView2Click(Sender: TObject);
    procedure ListView1DblClick(Sender: TObject);
    procedure ComboBoxFATChange(Sender: TObject);
  public
    DrvSelected: byte;
    useFAT: byte;
    SkipBadClus: boolean;
    function Execute: boolean;
  private
    procedure CheckControls;
    procedure UpdateDlgOptions;
  end;

var
  DriveDlg: TDriveDlg;

implementation

uses main, pdiskio, ldiskio, secdlg, statusdlg, predrdlg;

{$R *.DFM}

const
  LVM_FIRST              = $1000;      // ListView messages
  LVM_SETTEXTCOLOR       = (LVM_FIRST + 36);

  

function TDriveDlg.Execute: boolean;
begin
  if drivedlg.showmodal <> idCancel then
  begin
    DrvSelected:=ListView1.itemindex;
    useFAT:=ComboBoxFAT.itemindex;
    SkipBadClus:=CheckBoxSkipBadClus.checked;

    result:=true;
  end else result:=false;
end;

procedure TDriveDlg.FormActivate(Sender: TObject);
var
  i: integer;
  size: real;
  DevIdx: integer;
  sDev, volname: string;
  ListItem: TListItem;
begin
  ButtonOK.enabled:=false;
  ButtonPreview.enabled:=false;
  ButtonFind.enabled:=false;

  listview2.clear;
  listview1.clear;

  { list physical devices... }
  for i:=0 to MainForm.DevList.count-1 do
  begin
    with MainForm.devList.GetDevice(i) do
    begin
      if (driver = DRIVER_TYPE_PHYS) then
      begin
        ListItem := ListView2.Items.Add;
        case DevType of
          DEVICE_TYPE_FLOPPY:       ListItem.ImageIndex := 0;
          DEVICE_TYPE_REMOVABLE:    ListItem.ImageIndex := 0;
          DEVICE_TYPE_FIXED:        ListItem.ImageIndex := 1;
          else  ListItem.ImageIndex := 1;
        end;
        ListItem.Caption :=name;
      end;
    end;
  end;

  { list logical drives... }
  for i:=0 to MainForm.DrvList.count-1 do
  begin
    with MainForm.drvList.GetDrive(i) do
    begin
        ListItem := ListView1.Items.Add;
        case dev.DevType of
            DEVICE_TYPE_UNKNOWN:       ListItem.ImageIndex := 1;
            DEVICE_TYPE_FLOPPY,
            DEVICE_TYPE_REMOVABLE:     ListItem.ImageIndex := 0;
            DEVICE_TYPE_FIXED:         ListItem.ImageIndex := 1;
            DEVICE_TYPE_REMOTE:        ListItem.ImageIndex := 3;
            DEVICE_TYPE_CDROM:         ListItem.ImageIndex := 2;
            DEVICE_TYPE_RAMDISK:       ListItem.ImageIndex := 1;
            else                       ListItem.ImageIndex := 1;
        end;
        {if (condition AND drv_cond_virtual <> 0) then
          SendMessage(listitem.handle, LVM_SETTEXTCOLOR, 0, RGB(255, 0, 0));}
        volname:=name;
        if volname = '' then volname:='NONAME';
        devIdx:=MainForm.DevList.IndexOf(dev);
        if devIdx <> -1 then
          sDev:=MainForm.DevList.GetDeviceText(devIdx, false)
        else sDev:='';
        ListItem.Caption :=  volname+'   on '+sDev;
      end;
  end;
end;


procedure TDriveDlg.UpdateDlgOptions;
var
  i: integer;
  drv: TCustomDrive;
begin
  ComboBoxFAT.clear;
  if listview1.itemindex >= 0 then
  begin
    drv:=Mainform.DrvList.GetDrive(ListView1.itemindex);
    if drv is TFATdrive then
    begin
      ComboBoxFAT.items.add('no');
      for i:=1 to (Drv as TFATDrive).BootSec.BPB_NumFATs do
        ComboBoxFAT.items.add(inttostr(i));
      ComboBoxFAT.itemindex:=(Drv as TFATDrive).useFAT;
      ComboBoxFAT.enabled:=true;
    end else ComboBoxFAT.enabled:=false;
  end;
end;

procedure TDriveDlg.ComboBoxFATChange(Sender: TObject);
var
  drv: TCustomDrive;
begin
  if listview1.itemindex >= 0 then
  begin
    drv:=Mainform.DrvList.GetDrive(ListView1.itemindex);
    (drv as TFATDrive).useFAT:=ComboBoxFAT.itemindex;
  end;
end;


procedure TDriveDlg.CheckControls;
begin
  if pagecontrol1.activepage = TabSheetLogicalDrv then
  begin
    // logical drives...
    if listview1.itemindex >= 0 then
    begin
      LabelFAT.enabled:=true;
      ComboBoxFAT.enabled:=true;
      CheckboxSkipBadClus.enabled:=true;
      ButtonFind.enabled:=true;
      ButtonOK.enabled:=true;
      ButtonPreview.enabled:=true;
      UpdateDlgOptions;
    end else
    begin
      LabelFAT.enabled:=false;
      ComboBoxFAT.Clear;
      ComboBoxFAT.enabled:=false;
      CheckboxSkipBadClus.enabled:=false;
      ButtonFind.enabled:=false;
      ButtonOK.enabled:=false;
      ButtonPreview.enabled:=false;
    end;
  end else
  begin
    // physical drives...
    LabelFAT.enabled:=false;
    ComboBoxFAT.Clear;
    ComboBoxFAT.enabled:=false;
    CheckboxSkipBadClus.enabled:=false;
    ButtonPreview.Enabled:=false;
    if listview2.itemindex >= 0 then
    begin
      ButtonFind.enabled:=true;
      //ButtonOK.enabled:=true;
    end else
    begin
      ButtonFind.enabled:=false;
      ButtonOK.enabled:=false;
    end;
  end;
end;

procedure TDriveDlg.PageControl1Change(Sender: TObject);
begin
  CheckControls;
end;


// Find logical drive...
procedure TDriveDlg.ButtonFindClick(Sender: TObject);
var
  dev: TDevice;
begin
  if pagecontrol1.activepage = TabSheetLogicalDrv then
  begin
    Dev:=Mainform.DrvList.GetDrive(drivedlg.listview1.itemindex).Dev;
  end else Dev:=Mainform.DevList.GetDevice(drivedlg.listview2.itemindex);

  with SectorDialog do
  begin
    totalsec:=dev.TotalSec;
    startsec:=0;
    if (dev.TotalSec < 100000) then endsec:=dev.TotalSec-1
      else endsec:=100000;
    bytesPerSec:=dev.BytesPerSec;
  end;
  if sectordialog.execute then
  begin
    dev.FindLostDrives(MainForm.devList, sectordialog.startsec, sectordialog.endsec); 
    PageControl1.ActivePage:=TabsheetLogicalDrv;
  end;
end;


procedure TDriveDlg.Button3Click(Sender: TObject);
var
  i: integer;
  dev: TDevice;
begin
  if MessageBox(windowhandle, pchar('This will '+
      ' also clear all ''lost drives'' that have been found from the list!'+#13#10
      +'Are you sure to proceed? '),
      'Rescan for drives', mb_applmodal + mb_IconInformation + mb_yesno) = idyes then
  begin
    Mainform.detectDrives;
    FormActivate(Sender);
  end;
end;

procedure TDriveDlg.ButtonPreviewClick(Sender: TObject);
begin
  PreviewDrvDialog.drv:=Mainform.DrvList.GetDrive(listview1.itemindex);
  PreviewDrvDialog.Execute;
end;


procedure TDriveDlg.ListView1Click(Sender: TObject);
begin
  CheckControls;
end;

procedure TDriveDlg.ListView2Click(Sender: TObject);
begin
  CheckControls;
end;

procedure TDriveDlg.ListView1DblClick(Sender: TObject);
begin
  CheckControls;
  modalresult:=mrOK;
end;


end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -