📄 main.pas
字号:
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 + -