📄 main.~pas
字号:
begin
with DM.adoqryDirectory do
begin
Close;
SQL.Clear;
SQL.Add('DELETE FROM directory ');
SQL.Add('WHERE ID = :DirID');
end;
DeleteDir(TV.Selected);
end;
UpdateAbsoluteIndex;
end;
//删除指定的目录和子目录
procedure TfrmMain.DeleteDir(node: TTreeNode);
begin
if MessageBox(handle,
'将要删除目录以及目录中包含的子目录和文件,是否继续进行?',
'文件管理器',
MB_YESNO + MB_ICONWARNING) = IDNO then
Exit;
if node = nil then exit;
//迭代删除子孙
while node.Count >0 do
DeleteDir(node.GetLastChild);
//删除目录中的文件
DeleteFiles(PDirItem(node.data)^.ID);
//删除自己
with DM.adoqryDirectory do
begin
Parameters.ParamByName('DirID').Value := PDirItem(node.data)^.ID;
Prepared := True;
ExecSQL;
end;
node.Delete;
end;
//当选中的节点改变时,显示当前节点中的所有文件
procedure TfrmMain.TVChange(Sender: TObject; Node: TTreeNode);
var
pfi:PFileItem;
begin
with DM.adoqryitems do
begin
Close;
SQL.Clear;
SQL.Add('SELECT * FROM items');
SQL.Add('WHERE DirectoryID = :DirectoryID');
SQL.Add('ORDER BY FileName');
Parameters.ParamByName('DirectoryID').Value := PDirItem(node.data)^.ID;
Prepared := True;
Open;
ClearListView; //清除列表中的内容
First;
while not eof do
begin
New(pfi);
pfi^.DirID := PDirItem(TV.Selected.Data);
pfi^.ID := FieldByName('ID').AsInteger;
pfi^.FileName := Trim(FieldByName('FileName').AsString);
pfi^.CreateDate := FieldByName('CreateDate').AsDateTime;
pfi^.CreateUser := Trim(FieldByName('CreateUser').AsString);
pfi^.FileType := Trim(FieldByName('FileType').AsString);
pfi^.FileSize := FieldByName('FileSize').AsInteger;
pfi^.Password := Trim(FieldByName('FilePassword').AsString);
pfi^.OriginalFolder := Trim(FieldByName('OriginalFolder').AsString);
LoadFileItems(pfi);
Next;
end;
end;
end;
//清除列表及列表中数据所占内存
procedure TfrmMain.ClearListView;
var
i:integer;
begin
for i := 0 to ListView.Items.Count -1 do
if ListView.Items[i].Data <> nil then
Dispose(ListView.Items[i].Data);
ListView.Items.Clear;
end;
//返回到上一级目录
procedure TfrmMain.ActionUpLevelExecute(Sender: TObject);
begin
if (TV.Selected <> nil) and (not TV.Selected.IsFirstNode) then
TV.Select(TV.Selected.GetPrev);
end;
//单击时改变显示风格
procedure TfrmMain.ActionLargeIconExecute(Sender: TObject);
begin
ListView.ViewStyle := TViewStyle((Sender as TComponent).Tag);
end;
procedure TfrmMain.TVKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of
VK_DELETE:
if TV.Selected <> nil then
DeleteDir(TV.Selected);
VK_UP:
ActionUpLevelExecute(Sender);
end;
end;
//将文件导入到当前的目录中
procedure TfrmMain.ActionCheckInExecute(Sender: TObject);
var
fn:String;
pfi:PFileItem;
begin
if OpenDialog1.Execute then
begin
fn := OpenDialog1.FileName;
if FileExists(fn) then
begin
New(pfi);
pfi^.DirID := PDirItem(TV.Selected.Data);
pfi^.FileName := ExtractFileName(fn);
pfi^.OriginalFolder := ExtractFilePath(fn);
pfi^.CreateDate := Now;
pfi^.CreateUser := FUserName;
with DM.adotblItems do
begin
if not Active then
Open;
Append;
FieldByName('DirectoryID').Value := PDirItem(pfi^.DirID)^.ID;
FieldByName('FileName').Value := pfi^.FileName;
FieldByName('OriginalFolder').Value := pfi^.OriginalFolder;
FieldByName('CreateDate').Value := pfi^.CreateDate;
FieldByName('CreateUser').Value := pfi^.CreateUser;
TBlobField(FieldByName('FileItem')).LoadFromFile(fn);
Post;
pfi^.ID := FieldByName('ID').AsInteger;
end;
LoadFileItems(pfi);
end;
end;
end;
//在ListView中添加文件
procedure TfrmMain.LoadFileItems(pfi:PFileItem);
var
li:TListItem;
begin
li := ListView.Items.Add;
li.Caption := pfi^.FileName;
li.ImageIndex := 0;
li.Data := pfi;
if ListView.ViewStyle <> vsReport then exit;
li.SubItems.Add(pfi^.OriginalFolder);
li.SubItems.Add(DateTimeToStr(pfi^.CreateDate));
li.SubItems.Add(pfi^.CreateUser);
//li.SubItems.Add(IntToStr(pfi^.FileSize));
//li.SubItems.Add(pfi^.FileType);
end;
//删除选中的文件
procedure TfrmMain.DeleteFiles(DirectoryID: Integer);
begin
//删除跟自己相关的文件
with DM.adoqryItems do
begin
Close;
SQL.Clear;
SQL.Add('DELETE FROM items');
SQL.Add('WHERE DirectoryID = :DirectoryID');
Parameters.ParamByName('DirectoryID').Value := DirectoryID;
Prepared := True;
ExecSQL;
end;
end;
//删除列表视图中选中的文件
procedure TfrmMain.DeleteSelectedFiles;
begin
with DM.adoqryItems do
begin
Close;
SQL.Clear;
SQL.Add('DELETE FROM items');
SQL.Add('WHERE ID = :FileID');
end;
while ListView.SelCount > 0 do
begin
with DM.adoqryItems do
begin
Parameters.ParamByName('FileID').Value :=
PFileItem(Listview.Selected.Data)^.ID;
Prepared := True;
ExecSQL;
end;
ListView.Items.Delete(ListView.ItemIndex);
end;
end;
//菜单或者工具栏按钮单击时,删除选中的文件
procedure TfrmMain.ActionDeleteFilesExecute(Sender: TObject);
begin
DeleteSelectedFiles;
end;
//将选中的文件保存到原始路径中
procedure TfrmMain.ActionSaveExecute(Sender: TObject);
var
fn:String;
ret,i :Integer;
begin
if ListView.SelCount < 1 then exit;
with DM.adoqryItems do
begin
Close;
SQL.Clear;
SQL.Add('SELECT * FROM items');
SQL.Add('WHERE ID = :FileID');
end;
for i := 0 to ListView.Items.Count -1 do
begin
//只对选中的文件进行操作
if ListView.Items[i].Selected then
begin
with DM.adoqryItems do
begin
Parameters.ParamByName('FileID').Value :=
PFileItem(ListView.Items[i].Data)^.ID;
Prepared := True;
Open;
fn := Trim(FieldByName('OriginalFolder').AsString);
fn := fn + Trim(FieldByName('FileName').AsString);
end;
if FileExists(fn) then
begin
ret := MessageBox(handle, '文件已经存在是否覆盖?',
'文件管理器',
MB_YESNOCANCEL + MB_ICONQUESTION );
case ret of
IDYES: //覆盖文件
TBlobField(DM.adoqryItems.FieldByName('FileItem')).SaveToFile(fn);
IDNO: //进行另存操作
ActionSaveAsExecute(Sender);
IDCANCEL: //取消操作
Exit;
end;
end; //end of if FileExists(fn) then
end; //end of if ListView.Items[i].Selected then
end; //end for
end;
//将单个文件保存到其他路进
procedure TfrmMain.ActionSaveAsExecute(Sender: TObject);
begin
if SaveDialog1.Execute then
with DM.adoqryItems do
begin
Close;
SQL.Clear;
SQL.Add('SELECT * FROM items');
SQL.Add('WHERE ID = :FileID');
Parameters.ParamByName('FileID').Value :=
PFileItem(Listview.Selected.Data)^.ID;
Prepared := True;
Open;
TBlobField(DM.adoqryItems.FieldByName('FileItem')).SaveToFile(
SaveDialog1.FileName);
end;
end;
//拖拽移动到组件上面时
procedure TfrmMain.TVDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept := (Source is TTreeView) or (Source is TListView);
end;
//拖拽节点时,移动目录
procedure TfrmMain.TVDragDrop(Sender, Source: TObject; X, Y: Integer);
var
tar:TTreeNode;
i:integer;
begin
if ((not (Sender is TTreeView)) or (not (Source is TTreeView))) and
(not (Source is TListView)) then
exit;
//获得目的目录节点
tar := TV.GetNodeAt(X, Y);
//当拖拽的是目录时,更新目录信息
if Source is TTreeView then
begin
TV.Selected.MoveTo(tar, naAddChild);
UpdateAbsoluteIndex;
end;
//当拖拽的是列表中的文件时,移动文件
if Source is TListView then
begin
with DM.adoqryItems do
begin
CLose;
SQL.Clear;
SQL.Add('UPDATE items ');
SQL.Add('SET DirectoryID = :DirID');
SQL.Add('WHERE ID = :ID');
end;
for i := 0 to ListView.Items.Count -1 do
if ListView.Items[i].Selected then
With DM.adoqryItems do
begin
Parameters.ParamByName('DirID').Value := PDirItem(Tar.Data)^.ID;
Parameters.ParamByName('ID').Value :=
PFileItem(ListView.Items[i].Data)^.ID;
Prepared := True;
ExecSQL;
end;
end;
//选中拖拽的目标目录
TV.Select(tar);
tar.Expand(False);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -