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

📄 main.pas

📁 国外著名恢复软件Drive_Rescue 公布的早期源码 版本是1.8 delphi6环境开发的。
💻 PAS
📖 第 1 页 / 共 3 页
字号:
function TMainForm.DetectDrives: boolean;
var
  dev: TDevice;
  i: integer;
begin
  DevList.clear;
  DrvList.clear;

  StatusDialog.SetStatus('Scanning devices', '', 'Please wait...', '', '', false, false);
  StatusDialog.show;

  processMessages;
  devList.detectDevices(statusdialog); // detect Devices
  if NOT StatusDialog.UserCancel then
  begin
    StatusDialog.SetStatus('Scanning drives', '', 'Please wait...', '', '', false, false);
    for i:=0 to devList.count-1 do
    begin
      dev:=devList.GetDevice(i);
      StatusDialog.UpdateStatus('Scanning drives', format('On device: %s', [dev.name]), 'Please wait...', '', '');
      processMessages;
      if StatusDialog.UserCancel then break;
     drvList.DetectDrives(dev);  // detect Drives on device
    end;
  end;

  StatusDialog.hide;
  if StatusDialog.UserCancel then result:=false
    else result:=true;
end;


procedure TMainForm.MenuDriveClick(Sender: TObject);
var
  res: boolean;
  sDev: string;
  devIdx: integer;
begin
  if FFirstDriveSelect then
  begin
    FFirstDriveSelect:=false;
    res:=DetectDrives;
  end;
  if not res then exit;

  if drivedlg.execute then
  begin
    // logical drive selected...
    currDrv:=DrvList.GetDrive(drivedlg.drvSelected);
    currDev:=currDrv.dev;
    if currDrv is TFATDrive then
    begin
      (currDrv as TFATDrive).useFAT:=drivedlg.useFAT;
      (currDrv as TFATDrive).skipBadMarkedClus:=drivedlg.SkipBadClus;
    end;

    (*devIdx:=DevList.IndexOf(currDev);
    if devIdx <> -1 then
      sDev:=DevList.GetDeviceText(devIdx, false)
    else sDev:='';
    StatusBar3.Panels[0].Text := format('Drive: %s',[currDrv.name]);*)
    StatusBar3.Panels[0].Text := 'Folders';

    debug(format('drive selected: %s', [currDrv.name]), debugLow);
      //messagebox(0, pchar(inttostr(cphys)), pchar(inttostr(clog)), mb_ok);
    SetWorkState(state_driveSelected);
    AddDriveToTree;
    ListView1.Columns.clear;
    currDrv.AddListViewColumns(ListView1);
  end;
end;


procedure TMainForm.MenuOptionsClick(Sender: TObject);
begin
  if Options.execute then
  begin
    ProcessOptions;
    LoadListView;
  end;
end;


procedure TMainForm.MenuDetailsClick(Sender: TObject);
begin
  ListView1.viewstyle:=vsReport;
  MenuDetails.checked:=true;
end;

procedure TMainForm.MenuLargeIconsClick(Sender: TObject);
begin
  ListView1.viewstyle:=vsIcon;
  MenuLargeIcons.checked:=true;
end;

procedure TMainForm.MenuSmallIconsClick(Sender: TObject);
begin
  ListView1.viewstyle:=vsSmallIcon;
  MenuSmallIcons.checked:=true;
end;

procedure TMainForm.MenuListClick(Sender: TObject);
begin
  ListView1.viewstyle:=vsList;
  MenuList.checked:=true;
end;

procedure TMainForm.MenuFindLostDataClick(Sender: TObject);
begin
   LNode.DeleteChildren; // Delete TreeView-Nodes
   currDrv.FindLostData(StatusDialog);
   LNode.HasChildren:=currDrv.RootDirLost.ChildIsSubDir;
   LNode.Expanded:=false;
   TreeView.selected:=LNode;
   TreeView.Setfocus;
   LNode.Expand(false);
   TreeViewChange(sender, LNode);   
end;


procedure TMainForm.MenuHelpTopicClick(Sender: TObject);
begin
  //htmlHelp(windowhandle, 'rescue.chm', HELP_CONTENTS, 0);
  winexec('hh.exe rescue.chm', SW_SHOWNORMAL);
end;

procedure TMainForm.MenuDriveRescueHomepageClick(Sender: TObject);
begin
  winexec(sIBrowserExec + sHomePage, SW_SHOWNORMAL);
end;

procedure TMainForm.MenuAboutClick(Sender: TObject);
begin
  AboutDialog.showmodal;
end;

procedure TMainForm.MenuSelectAllClick(Sender: TObject);
var
  j: integer;
begin
  Listview1.Items.beginUpdate;
  for j:=0 to ListView1.items.count-1 do ListView1.items[j].selected:=true;
  ListView1.Items.EndUpdate;
  updateControls;
  ShowDirInfo;
end;

procedure TMainForm.MenuInvertselectionClick(Sender: TObject);
var
  j: integer;
begin
  for j:=0 to ListView1.items.count-1 do
    if ListView1.items[j].selected then ListView1.items[j].selected:=false
      else ListView1.items[j].selected:=true;
end;

procedure TMainForm.MenuFindClick(Sender: TObject);
begin
  SNode.DeleteChildren; // Delete TreeView-Nodes
  if currDrv.FindFiles then
  begin
    SNode.HasChildren:=currDrv.RootDirSearched.ChildIsSubDir;
    SNode.Expanded:=false;
    TreeView.selected:=SNode;
    TreeView.SetFocus;
    SNode.Expand(false);
    TreeViewChange(sender, SNode);
  end;
end;

procedure TMainForm.MenuExitClick(Sender: TObject);
begin
  application.terminate;
end;


procedure TMainForm.MenuToolbarClick(Sender: TObject);
var
  c: boolean;
begin
  MenuToolbar.checked:=NOT MenuToolbar.checked;
  if MenuToolbar.checked then Toolbar1.show
    else Toolbar1.hide;
end;

procedure TMainForm.MenuStatusbarClick(Sender: TObject);
begin
  MenuStatusbar.checked:=NOT MenuStatusbar.checked;
  if MenuStatusbar.checked then Statusbar1.show
    else Statusbar1.hide;
end;


procedure TMainForm.MenuRenameClick(Sender: TObject);
var
  Item: TListItem;
  Node: TTreeNode;
begin
  if ListView1.Focused then
  begin
    Item := ListView1.Selected;
    if Assigned(Item) then
    begin
      Item.EditCaption;
    end;
  end
  else if TreeView.Focused then
  begin
    Node := TreeView.Selected;
    if Assigned(Node) then
    begin
      Node.EditText;
    end;
  end;
end;


procedure TMainForm.MenuArrangebyNameClick(Sender: TObject);
begin
  FListViewIdx := 0;
  ListView1.alphasort;
end;

procedure TMainForm.MenuArrangebytypeClick(Sender: TObject);
begin
  FListViewIdx := 5;
  ListView1.alphasort;
end;

procedure TMainForm.MenuArrangebySizeClick(Sender: TObject);
begin
  FListViewIdx := 1;
  ListView1.alphasort;
end;

procedure TMainForm.MenuArangebydateClick(Sender: TObject);
begin
  FListViewIdx := 2;
  ListView1.alphasort;
end;

procedure TMainForm.MenuArrangeDescendingOrderClick(Sender: TObject);
begin
  FListViewUseAsc:=FALSE;
  ListView1.alphasort;
end;

procedure TMainForm.MenuArrangeAscendingOrderClick(Sender: TObject);
begin
  FListViewUseAsc:=TRUE;
  ListView1.alphasort;
end;

procedure TMainForm.MenuDrvInfoClick(Sender: TObject);
begin
  DriveInfoDialog.execute(currDev);
end;

procedure TMainForm.MenuSysInfoClick(Sender: TObject);
begin
  DialogSystemInfo.execute;
end;

procedure TMainForm.MenuPropertiesClick(Sender: TObject);
var
  fitem: TfatFile;
  ditem: TfatDirectory;
  item: TListItem;
  finddeleted: boolean;
  idx: integer;
begin
  if ListView1.Focused then
  begin
    Item := ListView1.Selected;
    if Assigned(Item) AND assigned(item.data) then
    begin
      if TObject(item.data) is TfatFile then
      begin
        fitem:=TfatFile(item.data);
        ItemPropertiesDialog.ItemName:=ReplaceDeletedChar(fitem.name);
        ItemPropertiesDialog.ItemSize:=fitem.size;
        ItemPropertiesDialog.ItemCluster:=fitem.cluster;
      end else if TObject(item.Data) is TfatDirectory then
      begin
        ditem:=TfatDirectory(item.data);
        ItemPropertiesDialog.ItemName:=ReplaceDeletedChar(ditem.name);
        ItemPropertiesDialog.ItemSize:=0;
        ItemPropertiesDialog.ItemCluster:=ditem.cluster;
      end;
      if ItemPropertiesDialog.execute then
      begin
        if TObject(item.data) is TfatFile then
        begin
          fitem.name:=ItemPropertiesDialog.ItemName;
          fitem.size:=ItemPropertiesDialog.ItemSize;
          fitem.cluster:=ItemPropertiesDialog.ItemCluster;
          fitem.ChangeListViewItem(ListView1.Selected);
        end else if TObject(item.Data) is TfatDirectory then
        begin
          ditem.name:=ItemPropertiesDialog.ItemName;
          ditem.cluster:=ItemPropertiesDialog.ItemCluster;
          // update ListView...
          ditem.ChangeListViewItem(ListView1.Selected);
        end;
        //LoadListView;  { this will redraw all items...not necessary!}
        idx:=Listview1.Selected.Index;
        ListView1.UpdateItems(idx, idx);
      end;
    end;
  end;
end;


procedure TMainForm.MenuViewAsHexClick(Sender: TObject);
var
  listitem: tlistitem;
  item: TFatfile;
  FATno: byte;
  drv: TfatDrive;
  i: integer;
begin
  if NOT (currDrv is TfatDrive) then exit;
  drv:=currDrv as TfatDrive;

  with FATSelectDialog do
  begin
    ComboBoxFAT.clear;
    ComboBoxFAT.items.add('no FAT (consecutive)');
    for i:=1 to drv.BootSec.BPB_NumFATs do
      ComboBoxFAT.items.add('FAT '+inttostr(i));
    if (treeview.selected=DNode) OR (treeview.selected.HasAsParent(DNode)) then
    begin
      ComboBoxFAT.itemindex:=0; // no FAT for undeleted files!!
    end
    else begin
      ComboBoxFAT.itemindex:=drv.useFAT;
    end;
  end;

  if FATSelectDialog.execute then
  begin
    FATno:=FATSelectDialog.FATno;
    listitem:=ListView1.selected;
    item:=Tfatfile(listitem.data);
    ViewerDialog.ViewAsHex(drv, ReplaceDeletedChar(item.name), item.cluster, item.size, FATno);
  end;
end;


procedure TMainForm.MenuViewAsTextClick(Sender: TObject);
var
  listitem: tlistitem;
  item: Tfatfile;
  FATno: byte;
  drv: TfatDrive;
  i: integer;
begin
  if NOT (currDrv is TfatDrive) then exit;
  drv:=currDrv as TfatDrive;

  with FATSelectDialog do
  begin
    ComboBoxFAT.clear;
    ComboBoxFAT.items.add('no FAT (consecutive)');
    for i:=1 to drv.BootSec.BPB_NumFATs do
      ComboBoxFAT.items.add('FAT '+inttostr(i));
    if (treeview.selected=DNode) OR (treeview.selected.HasAsParent(DNode)) then
    begin
      ComboBoxFAT.itemindex:=0; // no FAT for undeleted files!!
    end
    else begin
      ComboBoxFAT.itemindex:=drv.useFAT;
    end;
  end;

  if FATSelectDialog.execute then
  begin
    FATno:=FATSelectDialog.FATno;
    listitem:=ListView1.selected;
    item:=listitem.data;
    ViewerDialog.ViewAsText(drv, ReplaceDeletedChar(item.name), item.cluster, item.size, FATno);
  end;
end;

procedure TMainForm.PopupMenuViewAsHexClick(Sender: TObject);
begin
  MenuViewAsHexClick(sender);
end;

procedure TMainForm.PopupMenuViewAsTextClick(Sender: TObject);
begin
  MenuViewAsTextClick(sender);
end;

procedure TMainForm.PopupMenuPropertiesClick(Sender: TObject);
begin
  MenuPropertiesClick(Sender);
end;

procedure TMainForm.PopupMenuRenameClick(Sender: TObject);
begin
  MenuRenameClick(Sender);
end;



// -------------------------------------------------------------------------------
//          I C O N    B U T T O N S     S T U F F
// -------------------------------------------------------------------------------


procedure TMainForm.ButtonOpenDriveClick(Sender: TObject);
begin
  MenuDriveClick(sender);
end;

procedure TMainForm.ButtonSaveToClick(Sender: TObject);
begin
  MenuSaveToClick(sender);
end;

procedure TMainForm.ButtonFindClick(Sender: TObject);
begin
  MenuFindClick(sender);
end;


procedure TMainForm.ButtonFindLostDataClick(Sender: TObject);
begin
  MenuFindLostDataClick(sender);
end;

procedure TMainForm.ButtonParentDirClick(Sender: TObject);
var
  node: TTreeNode;
  item: TCustomDirectory;
  finddeleted: boolean;
begin
  if assigned(currTreeNode) AND assigned(currTreeNode.parent) then
  begin
    node:=currTreeNode.parent;
    node.Selected:=true;
    if assigned(node.data) then
    begin
      item := TCustomDirectory(node.Data);
      finddeleted:=false;
      if (node=DNode) OR (node.HasAsParent(DNode)) then finddeleted:=true;
      item.AddChildrenToListView(ListView1, finddeleted);
      ListView1.setfocus;
      CurrTreeNode:=node;
      ShowDirInfo;
    end;
  end;
end;

procedure TMainForm.ButtonViewIconClick(Sender: TObject);
begin
  ListView1.viewstyle:=vsIcon;
end;

procedure TMainForm.ButtonViewSmallIconClick(Sender: TObject);
begin
  ListView1.viewstyle:=vsSmallIcon;
end;

procedure TMainForm.ButtonViewListClick(Sender: TObject);
begin
  ListView1.viewstyle:=vsList;
end;

procedure TMainForm.ButtonViewReportClick(Sender: TObject);
begin
  ListView1.viewstyle:=vsReport;
end;


procedure TMainForm.ButtonHelpClick(Sender: TObject);
begin
  MenuHelpTopicClick(sender);
end;


// ----------------------------------------------------------------------------
//  TreeView and ListView controls handling
// ----------------------------------------------------------------------------

procedure TMainForm.AddDriveToTree;
begin
  ListView1.Items.Clear;
  FListViewIdx := 0;
  FListViewUseAsc := TRUE;

  TreeView.Selected := nil;
  TreeView.Items.Clear;
  TreeView.ShowHint:=false;
  TreeView.ParentShowHint:=false;

  currDrv.AddDriveToTree(TreeView);
end;

procedure TMainForm.updateControls;
var
  item: TListItem;
begin
  if ListView1.selcount > 0 then
  begin
    // items selected...
    Item := ListView1.Selected;

    PopupMenuSaveFileTo.enabled:=true;
    ButtonSaveTo.enabled:=true;
    MenuSaveTo.enabled:=true;

    if (ListView1.selcount = 1) AND Assigned(Item) then
    begin
      // only 1 item selected...
      MenuRename.enabled:=true;
      MenuProperties.enabled:=true;
      PopupMenuProperties.enabled:=true;
      PopupMenuRename.enabled:=true;

      if (TObject(Item.data) is TCustomFile) then
      begin
        // item is file...
        MenuViewAsHex.enabled:=true;
        MenuViewAsText.enabled:=true;
        PopupMenuViewAsText.enabled:=TRUE;
        PopupMenuViewAsHex.enabled:=TRUE;
      end else if (TObject(Item.data) is TCustomDirectory) then

⌨️ 快捷键说明

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