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

📄 rmd_expfrm.pas

📁 report machine 2.3 功能强大
💻 PAS
📖 第 1 页 / 共 2 页
字号:
  try
    FReportExplorer.GetItems(itRecycleBin, itAllFolders, sl);
    if sl.Count > 0 then
    begin
      FRecycleBinNode.ImageIndex := 1;
      FRecycleBinNode.SelectedIndex := 1;
    end
    else
    begin
      FRecycleBinNode.ImageIndex := 3;
      FRecycleBinNode.SelectedIndex := 3;
    end;
  finally
    sl.Free;
  end;
end;

procedure TRMDFormReportExplorer.padFilePrintClick(Sender: TObject); //打印报表
begin
  if FListView.ItemName <> '' then
    FReportExplorer.Print(FListView.ItemName, FListView.ItemId);
end;

procedure TRMDFormReportExplorer.padFilePrintPreviewClick(Sender: TObject); //预览报表
begin
  if FListView.ItemName <> '' then
    FReportExplorer.PrintPreview(FListView.ItemName, FListView.ItemId);
end;

procedure TRMDFormReportExplorer.padFileOpenClick(Sender: TObject);
begin
  if trvFolders.Focused then
  begin
    if (trvFolders.Selected <> nil) and (not trvFolders.Selected.Expanded) then
      trvFolders.Selected.Expanded := True;
  end
  else
    OpenItem;
end;

procedure TRMDFormReportExplorer.padFileNewReportClick(Sender: TObject); //新报表
var
  i: Integer;
begin
  if trvFolders.Selected <> nil then
    i := Integer(trvFolders.Selected.Data)
  else
    i := itAllFolders;
  FReportExplorer.New(i);
end;

procedure TRMDFormReportExplorer.padFileNewFolderClick(Sender: TObject); //新文件夹
var
  Item: TTreeNode;
  lsName: string;
  FolderId: Integer;
begin
  Item := trvFolders.Selected;
  if (Item = nil) or (Integer(Item.Data) = itRecycleBin) then Exit;
  trvFolders.Items.BeginUpdate;
  lsName := FReportExplorer.GetNewFolderName(Integer(Item.Data));
  if (trvFolders.Selected <> nil) then
    FReportExplorer.AddFolder(Integer(trvFolders.Selected.Data), lsName, FolderID)
  else
    FReportExplorer.AddFolder(itAllFolders, lsName, FolderId);

  Item := trvFolders.Items.AddChild(trvFolders.Selected, lsName);
  Item.Data := TObject(FolderID);
  Item.ImageIndex := 0;
  Item.SelectedIndex := 2;
  if (Item.Parent <> nil) then
    Item.Parent.Expand(False);
  trvFolders.Selected := Item;
  trvFolders.Items.EndUpdate;
  trvFolders.Selected.EditText;
end;

procedure TRMDFormReportExplorer.padFileDeleteClick(Sender: TObject);
var
  Node: TTreeNode;
  NewNode: TTreeNode;
  FolderId: Integer;
begin
  Node := trvFolders.Selected;
  if Node = nil then Exit;
  if trvFolders.Focused then
  begin
    FolderId := Integer(Node.Data);
    if (FolderId = itRecycleBin) or (FolderId = itAllFolders) then Exit;
    if Application.MessageBox('真的删除这个文件夹吗?', '删除', MB_ICONQUESTION + MB_YESNO) = IDYES then
    begin
      if FReportExplorer.ChangeParentFolder(FolderId, itRecycleBin) then
      begin
        NewNode := FindNearestNode(Node);
        SelectFolder(Integer(NewNode.Data));
        Node.Free;
      end;
    end;
  end
  else
    FListView.DeleteSelection;
  UpdateRecycleBin;
end;

procedure TRMDFormReportExplorer.padViewListClick(Sender: TObject);
begin
  SetViewStyle(True);
end;

procedure TRMDFormReportExplorer.padViewDetailsClick(Sender: TObject);
begin
  SetViewStyle(False);
end;

procedure TRMDFormReportExplorer.padViewToolbarClick(Sender: TObject);
begin
  SetViewToolbar(not (padViewToolbar.Checked));
end;

procedure TRMDFormReportExplorer.padViewStatusBarClick(Sender: TObject);
begin
  SetViewStatusBar(not (padViewStatusBar.Checked));
end;

procedure TRMDFormReportExplorer.padFileCloseClick(Sender: TObject);
begin
  Close;
end;

procedure TRMDFormReportExplorer.trvFoldersEdited(Sender: TObject; Node: TTreeNode;
  var S: string); //重命名文件夹
begin
  FReportExplorer.RenameFolder(Integer(Node.Data), S);
end;

procedure TRMDFormReportExplorer.padFileRenameClick(Sender: TObject); //重命名报表
var
  Node: TTreeNode;
begin
  if trvFolders.Focused then
  begin
    Node := trvFolders.Selected;
    if (Node <> nil) and (Integer(Node.Data) > itAllFolders) then
      Node.EditText;
  end
  else
    FListView.RenameItem;
end;

procedure TRMDFormReportExplorer.ListDoubleClickEvent(Sender: TObject);
begin
  OpenItem;
end;

procedure TRMDFormReportExplorer.ListRenameFolderEvent(Sender: TObject; aFolderId: Integer; const aNewName: string);
var
  TreeNode: TTreeNode;
begin
  TreeNode := FindDataInTreeView(trvFolders, aFolderId);
  TreeNode.Text := aNewName;
end;

function TRMDFormReportExplorer.FindDataInTreeView(aTreeView: TTreeView; aData: Integer): TTreeNode;
var
  Index: Integer;
  TreeNode: TTreeNode;
begin
  Result := nil;
  if (aTreeView.Items.Count = 0) then Exit;

  Index := 0;
  TreeNode := aTreeView.Items[Index];
  while (Index < aTreeView.Items.Count) and (Integer(TreeNode.Data) <> aData) do
  begin
    Inc(Index);
    TreeNode := aTreeView.Items[Index];
  end;
  Result := TreeNode;
end;

procedure TRMDFormReportExplorer.ListFolderChangeEvent(Sender: TObject);
begin
//  UpdateTreeView;
  SelectFolder(FListView.FolderId);
end;

procedure TRMDFormReportExplorer.ListSelectionChangeEvent(Sender: TObject);
begin
  UpdateStatusBar;
end;

procedure TRMDFormReportExplorer.trvFoldersEditing(Sender: TObject; Node: TTreeNode; var AllowEdit: Boolean);
begin
  if (Integer(Node.Data) = itAllFolders) or (Integer(Node.Data) = itRecycleBin) then
    AllowEdit := False;
end;

procedure TRMDFormReportExplorer.trvFoldersDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
var
  Item: TTreeNode;
  tmpSelected: TTreeNode;
begin
  Accept := False;
  tmpSelected := trvFolders.Selected;
  if (tmpSelected = nil) then Exit;
  if (Source = trvFolders) and ((tmpSelected = FAllFoldersNode) or (tmpSelected = FRecycleBinNode)) then Exit;
  Item := trvFolders.GetNodeAt(X, Y);
  if (Source = trvFolders) and (Item <> nil) then
    Accept := (Item <> tmpSelected) and (Item <> tmpSelected.Parent)
  else
    Accept := True;
end;

procedure TRMDFormReportExplorer.trvFoldersDragDrop(Sender, Source: TObject; X, Y: Integer);
var
  TargetItem: TTreeNode;
  SourceItem: TTreeNode;
  NewNode: TTreeNode;
  TargetFolderId: Integer;
  SourceFolderId: Integer;
  FolderId: Integer;
begin
  TargetItem := trvFolders.GetNodeAt(X, Y);
  if TargetItem <> nil then
  begin
    TargetFolderId := Integer(TargetItem.Data);
    if Source = trvFolders then
    begin
      SourceItem := trvFolders.Selected;
      if SourceItem = nil then Exit;
      SourceFolderId := Integer(SourceItem.Data);
      if FReportExplorer.ChangeParentFolder(SourceFolderId, TargetFolderId) then
      begin
        if TargetFolderId = itRecycleBin then
        begin
          NewNode := FindNearestNode(SourceItem);
          if NewNode <> nil then
            FolderId := Integer(NewNode.Data)
          else
            FolderId := itAllFolders;
        end
        else
          FolderId := SourceFolderId;

        UpdateTreeView;
        SelectFolder(FolderId);
      end;
    end
    else if Source = FListView then
    begin
      FListView.MoveSelectionToFolder(TargetFolderId);
      SourceItem := trvFolders.Selected;
      if SourceItem = nil then Exit;
      SourceFolderId := Integer(SourceItem.Data);
      if TargetFolderId = itRecycleBin then
        UpdateRecycleBin
      else if SourceFolderId = itRecycleBin then
        UpdateRecycleBin
    end;
  end;
end;

function TRMDFormReportExplorer.FindNearestNode(aNode: TTreeNode): TTreeNode;
begin
  Result := aNode.GetNextSibling;
  if (Result <> nil) then Exit;
  Result := aNode.GetPrevSibling;
  if (Result <> nil) then Exit;
  Result := aNode.Parent;
  if (Result <> nil) then Exit;
  Result := trvFolders.Items[0];
end;

procedure TRMDFormReportExplorer.UpdateTreeView;
var
  Index: Integer;
  Items: TTreeNodes;
  Item: TTreeNode;
  Folders: TStringList;
  FolderNodes: TStringList;
  FolderInfo: TRMFolderInfo;
  ParentIndex: Integer;
  ParentNode: TTreeNode;
begin
  Folders := TStringList.Create;
  FolderNodes := TStringList.Create;
  FReportExplorer.GetFolders(Folders);
  Items := trvFolders.Items;
  Items.BeginUpdate;
  Items.Clear;
  try
    FAllFoldersNode := trvFolders.Items.AddObject(nil, '所有文件夹', TObject(itAllFolders));
    FAllFoldersNode.ImageIndex := 0;
    FAllFoldersNode.SelectedIndex := 2;
    FolderNodes.AddObject(IntToStr(itAllFolders), FAllFoldersNode);

    FRecycleBinNode := trvFolders.Items.AddObject(nil, '回收站', TObject(itRecycleBin));
    FolderNodes.AddObject(IntToStr(itRecycleBin), FRecycleBinNode);
    while Folders.Count > 0 do
    begin
      Index := 0;
      FolderInfo := TRMFolderInfo(Folders.Objects[Index]);
      ParentIndex := FolderNodes.IndexOf(IntToStr(FolderInfo.ParentId));
      while (ParentIndex = -1) and (Index < Folders.Count - 1) do
      begin
        Inc(Index);
        FolderInfo := TRMFolderInfo(Folders.Objects[Index]);
        ParentIndex := FolderNodes.IndexOf(IntToStr(FolderInfo.ParentId));
      end;
      if (ParentIndex <> -1) then
        ParentNode := TTreeNode(FolderNodes.Objects[ParentIndex])
      else
        ParentNode := FAllFoldersNode;

      Item := Items.AddChild(ParentNode, FolderInfo.Name);
      Item.Data := TObject(FolderInfo.FolderId);
      Item.ImageIndex := 0;
      Item.SelectedIndex := 2;
      FolderNodes.AddObject(IntToStr(FolderInfo.FolderId), Item);
      FolderInfo.Free;
      Folders.Delete(Index);
    end;
  finally
    UpdateRecycleBin;
    Items.EndUpdate;
    Folders.Free;
    FolderNodes.Free;
    FAllFoldersNode.Expanded := True;
  end;
end;

procedure TRMDFormReportExplorer.ppmReportsPopup(Sender: TObject);
var
  Node: TTreeNode;
  FolderId: Integer;
begin
  Node := trvFolders.Selected;
  if Node = nil then Exit;
  FolderId := Integer(Node.Data);
  if FolderId = itRecycleBin then
  begin
    ppmReportsNewFolder.Enabled := False;
    ppmReportsNewReport.Enabled := False;
    ppmReportsRename.Enabled := False;
  end
  else
  begin
    ppmReportsNewFolder.Enabled := True;
    ppmReportsNewReport.Enabled := True;
    ppmReportsRename.Enabled := True;
  end;
end;

procedure TRMDFormReportExplorer.ppmFoldersPopup(Sender: TObject);
var
  Node: TTreeNode;
  FolderId: Integer;
begin
  Node := trvFolders.Selected;
  if Node = nil then Exit;
  FolderId := Integer(Node.Data);
  ppmFoldersEmptyRecycleBin.Visible := (FolderId = itRecycleBin);
  if FolderId = itRecycleBin then
  begin
    ppmFoldersExplore.Enabled := False;
    ppmFoldersOpen.Enabled := False;
    ppmFoldersNewFolder.Enabled := False;
    ppmFoldersNewReport.Enabled := False;
    ppmFoldersDelete.Enabled := False;
    ppmFoldersRename.Enabled := False;
  end
  else if FolderId = itAllFolders then
  begin
    ppmFoldersExplore.Enabled := False;
    ppmFoldersOpen.Enabled := False;
    ppmFoldersNewFolder.Enabled := True;
    ppmFoldersNewReport.Enabled := True;
    ppmFoldersDelete.Enabled := False;
    ppmFoldersRename.Enabled := False;
  end
  else
  begin
    ppmFoldersExplore.Enabled := True;
    ppmFoldersOpen.Enabled := True;
    ppmFoldersNewFolder.Enabled := True;
    ppmFoldersNewReport.Enabled := True;
    ppmFoldersDelete.Enabled := True;
    ppmFoldersRename.Enabled := True;
  end;
end;

procedure TRMDFormReportExplorer.FormCreate(Sender: TObject);
begin
	Localize;
  FReportExplorer := nil;
  FListView := TRMItemList.Create(Self);
  FListView.Parent := pnlReports;
  FListView.Align := alClient;
  FListView.MultiSelect := True;
  FListView.PopupMenu := ppmReports;
  FListView.ViewStyle := vsList;
  FListView.SmallImages := ImageListListView;
  FListView.HideSelection := FALSE;

  FListView.OnDoubleClick := ListDoubleClickEvent;
  FListView.OnFolderChange := ListFolderChangeEvent;
  FListView.OnRenameFolder := ListRenameFolderEvent;
  FListView.OnSelectionChange := ListSelectionChangeEvent;
end;

procedure TRMDFormReportExplorer.FormDestroy(Sender: TObject);
begin
  SaveToIniFile;
end;

procedure TRMDFormReportExplorer.FormShow(Sender: TObject);
begin
  LoadFromIniFile;
  UpdateTreeView;
  SelectFolder(FListView.FolderId);
end;

procedure TRMDFormReportExplorer.ppmFoldersEmptyRecycleBinClick(Sender: TObject);
begin
  FListView.EmptyRecycleBin;
  UpdateRecycleBin;
end;

procedure TRMDFormReportExplorer.trvFoldersChange(Sender: TObject;
  Node: TTreeNode);
begin
  if Node <> nil then
    SelectFolder(Integer(Node.Data));
end;

procedure TRMDFormReportExplorer.btnUpOneLevelClick(Sender: TObject);
var
  Item: TTreeNode;
begin
  Item := trvFolders.Selected;
  if (Item.Parent <> nil) then
    SelectFolder(Integer(Item.Parent.Data));
end;

end.

⌨️ 快捷键说明

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