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

📄 rmd_reportexplorer.pas

📁 这是一个功能强大
💻 PAS
📖 第 1 页 / 共 4 页
字号:

procedure TRMItemListView.SetParent(aParent: TWinControl);
var
  liColumn: TListColumn;
begin
  inherited SetParent(aParent);
  if (Columns.Count > 0) or (csDestroying in ComponentState) then
    Exit;

  liColumn := Columns.Add;
  liColumn.Width := 250;
  liColumn := Columns.Add;
  liColumn.Width := 120;
  liColumn.Alignment := taRightJustify;
  liColumn := Columns.Add;
  liColumn.Width := 100;
  liColumn := Columns.Add;
  liColumn.Width := 140;
end;

procedure TRMItemListView.SetReportExplorer(aExplorer: TRMReportExplorer);
begin
  FReportExplorer := aExplorer;
end;

procedure TRMItemListView.SetItemName(aName: string);
var
  liFound: Boolean;
  i: Integer;
  liListItem: TListItem;
begin
  liListItem := nil;
  liFound := False;
  for i := 0 to Items.Count - 1 do
  begin
    liListItem := Items[i];
    if AnsiCompareText(liListItem.Caption, aName) = 0 then
    begin
      liFound := True;
      Break;
    end;
  end;

  if liFound then
  begin
    Selected := liListItem;
    DoOnSelectionChange;
  end;
end;

procedure TRMItemListView.SetFolderId(aFolderId: Integer);
begin
  FFolderId := aFolderId;
  GetItemsForFolder;
end;

procedure TRMItemListView.SetSortMode(aSortMode: Integer);
begin
  FSortMode := aSortMode;
  SetSortModeDescription;
end;

function TRMItemListView.GetItemId: Integer;
var
  liListItem: TListItem;
begin
  liListItem := Selected;
  if (liListItem <> nil) and (liListItem.Data <> nil) then
    Result := PRMListItemData(liListItem.Data).ItemId
  else
    Result := -1;
end;

function TRMItemListView.GetItemType: Integer;
var
  liListItem: TListItem;
begin
  liListItem := Selected;
  if (liListItem <> nil) and (liListItem.Data <> nil) then
    Result := PRMListItemData(liListItem.Data).ItemType
  else
    Result := -1;
end;

function TRMItemListView.GetItemName: string;
var
  liListItem: TListItem;
begin
  liListItem := Selected;
  if liListItem <> nil then
    Result := liListItem.Caption
  else
    Result := '';
end;

procedure TRMItemListView.DoOnFolderChange;
begin
  if Assigned(FOnFolderChange) then
    FOnFolderChange(Self);
end;

procedure TRMItemListView.DoOnRenameFolder(aFolderId: Integer; const aNewName: string);
begin
  if Assigned(FOnRenameFolder) then
    FOnRenameFolder(Self, aFolderId, aNewName);
end;

procedure TRMItemListView.DoOnSelectionChange;
begin
  if Assigned(FOnSelectionChange) then
    FOnSelectionChange(Self);
end;

procedure TRMItemListView.ChangeEvent(Sender: TObject; Item: TListItem; Change: TItemChange);
var
  liListItem: TListItem;
  liSize: Integer;
  str: string;
  liStringList: TStrings;
  i: Integer;
begin
  liStringList := TStringList.Create;
  try
    GetSelectedItems(liStringList);
    liSize := 0;
    for i := 0 to liStringList.Count - 1 do
    begin
      liListItem := TListItem(liStringList.Objects[i]);
      if PRMListItemData(liListItem.Data).ItemType <> rmitFolder then
      begin
        FAllFolders := False;
        str := liListItem.SubItems[0];
        str := Copy(str, 1, Length(str) - Length('KB')); {'KB'}
        liSize := liSize + Round(StrToFloat(str) * 1024);
      end;
    end;

    FAllFolders := True;
    FSelectionCount := liStringList.Count;
    FSelectionSize := liSize;
    DoOnSelectionChange;
  finally
    liStringList.Free;
  end;
end;

procedure TRMItemListView.DblClickEvent(Sender: TObject);
var
  liListItem: TListItem;
begin
  liListItem := Selected;
  if liListItem = nil then Exit;

  if PRMListItemData(liListItem.Data).ItemType = rmitFolder then
  begin
    FFolderId := PRMListItemData(liListItem.Data).ItemId;
    GetItemsForFolder;
    DoOnFolderChange;
  end
  else
  begin
    if Assigned(FOnDoubleClick) then
      FOnDoubleClick(Self);
  end;
end;

procedure TRMItemListView.ColumnClickEvent(Sender: TObject; Column: TListColumn);
begin
  if FSortMode = Column.Index + 1 then
    FSortMode := FSortMode * -1
  else
    FSortMode := Column.Index + 1;
  AlphaSort;
  SetSortModeDescription;
end;

procedure TRMItemListView.CompareEvent(Sender: TObject; Item1, Item2: TListItem;
  Data: Integer; var Compare: Integer);
var
  liSize1: Integer;
  liSize2: Integer;
  liDateTime1: TDateTime;
  liDateTime2: TDateTime;
  liDiff: Double;
begin
  if (PRMListItemData(Item1.Data).ItemType = rmitFolder) and (PRMListItemData(Item2.Data).ItemType = rmitFolder) then
  begin
    case FSortMode of
      1: Compare := AnsiCompareText(Item1.Caption, Item2.Caption);
      -1: Compare := AnsiCompareText(Item2.Caption, Item1.Caption);
    end;
  end
  else if PRMListItemData(Item1.Data).ItemType = rmitFolder then
    Compare := -1
  else if PRMListItemData(Item2.Data).ItemType = rmitFolder then
    Compare := 1
  else
  begin
    case FSortMode of
      1: Compare := AnsiCompareText(Item1.Caption, Item2.Caption);
      -1: Compare := AnsiCompareText(Item2.Caption, Item1.Caption);
      2, -2:
        begin
          liSize1 := Round(StrToFloat(Copy(Item1.SubItems[0], 1, Length(Item1.SubItems[0]) - 2)));
          liSize2 := Round(StrToFloat(Copy(Item2.SubItems[0], 1, Length(Item2.SubItems[0]) - 2)));
          if FSortMode = 2 then
            Compare := liSize1 - liSize2
          else
            Compare := liSize2 - liSize1;
        end;
      3: Compare := AnsiCompareText(Item1.SubItems[1], Item2.SubItems[1]);
      -3: Compare := AnsiCompareText(Item2.SubItems[1], Item1.SubItems[1]);
      4, -4:
        begin
          liDateTime1 := StrToDateTime(Item1.SubItems[2]);
          liDateTime2 := StrToDateTime(Item2.SubItems[2]);
          if FSortMode = 4 then
            liDiff := liDateTime1 - liDateTime2
          else
            liDiff := liDateTime2 - liDateTime1;
          if liDiff > 0 then
            Compare := 1
          else if liDiff < 0 then
            Compare := -1
          else
            Compare := 0;
        end;
    end;
  end;

  if Compare = 0 then
    Compare := AnsiCompareText(Item1.Caption, Item2.Caption);
end;

procedure TRMItemListView.DragDropEvent(Sender, Source: TObject; X, Y: Integer);
var
  liListItem: TListItem;
begin
  liListItem := GetItemAt(X, Y);
  if liListItem = nil then Exit;
  if PRMListItemData(liListItem.Data).ItemType <> rmitFolder then Exit;

  MoveSelectionToFolder(PRMListItemData(liListItem.Data).ItemId);
end;

procedure TRMItemListView.DragOverEvent(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
var
  liListItem: TListItem;
begin
  liListItem := GetItemAt(X, Y);
  if liListItem <> nil then
    Accept := PRMListItemData(liListItem.Data).ItemType = rmitFolder
  else
    Accept := False;
end;

procedure TRMItemListView.EditingEvent(Sender: TObject; Item: TListItem; var AllowEdit: Boolean);
begin
  AllowEdit := FFolderId <> -2;
end;

procedure TRMItemListView.EditedEvent(Sender: TObject; Item: TListItem; var S: string);
begin
  if PRMListItemData(Item.Data).ItemType = rmitFolder then
  begin
    DoOnRenameFolder(PRMListItemData(Item.Data).ItemId, S);
    FReportExplorer.RenameFolder(PRMListItemData(Item.Data).ItemId, S);
  end
  else
  begin
    FReportExplorer.Rename(PRMListItemData(Item.Data).ItemId, S);
  end;
end;

procedure TRMItemListView.MoveSelectionToFolder(aFolderId: Integer);
var
  liListItem: TListItem;
  i: Integer;
  liStringList: TStrings;
  liChange: Boolean;
  liFolderChange: Boolean;
begin
  liStringList := TStringList.Create;
  try
    GetSelectedItems(liStringList);
    liChange := False;
    liFolderChange := False;
    for i := 0 to liStringList.Count - 1 do
    begin
      liListItem := TListItem(liStringList.Objects[i]);
      if PRMListItemData(liListItem.Data).ItemType = rmitFolder then
      begin
        if FReportExplorer.ChangeParentFolder(PRMListItemData(liListItem.Data).ItemId, aFolderId) then
          liFolderChange := True;
      end
      else
      begin
        if FReportExplorer.ChangeFolder(PRMListItemData(liListItem.Data).ItemId, aFolderId) then
          liChange := True;
      end;
    end;

    if liFolderChange then
      DoOnFolderChange
    else if liChange then
      GetItemsForFolder;
  finally
    liStringList.Free;
  end;
end;

procedure TRMItemListView.EmptyRecycleBin;
var
  liStringList: TStringList;
begin
  liStringList := TStringList.Create;
  try
    FReportExplorer.GetItems(-2, liStringList);
    while liStringList.Count > 0 do
    begin
      TRMItemInfo(liStringList.Objects[0]).Free;
      liStringList.Delete(0);
    end;

    FReportExplorer.DeleteItemsInFolder(-2);
    DoOnFolderChange;
  finally
    liStringList.Free;
  end;
end;

procedure TRMItemListView.DeleteSelection;
var
  liListItem: TListItem;
  liStringList: TStrings;
  i: Integer;
  lbFolderChange: Boolean;
begin
  if Application.MessageBox(PChar(RMLoadStr(rmRes + 3167)), PChar(RMLoadStr(rmRes + 3168)),
    MB_ICONQUESTION + MB_YESNO) <> IDYES then
    Exit;

  lbFolderChange := False;
  liStringList := TStringList.Create;
  Items.BeginUpdate;
  try
    GetSelectedItems(liStringList);
    for i := 0 to liStringList.Count - 1 do
    begin
      liListItem := TListItem(liStringList.Objects[i]);
      if PRMListItemData(liListItem.Data).ItemType = rmitFolder then
        lbFolderChange := True;

      if FFolderId = rmitRecycleBin then
        FReportExplorer.Delete(PRMListItemData(liListItem.Data).ItemId)
      else
      begin
        if PRMListItemData(liListItem.Data).ItemType = rmitFolder then
          FReportExplorer.ChangeParentFolder(PRMListItemData(liListItem.Data).ItemId, -2)
        else
          FReportExplorer.ChangeFolder(PRMListItemData(liListItem.Data).ItemId, -2);
      end;

      if liListItem.Data <> nil then
      begin
        Dispose(liListItem.Data);
        liListItem.Data := nil;
      end;
      liListItem.Free;
    end;

    if lbFolderChange then
      DoOnFolderChange;
  finally
    Items.EndUpdate;
    liStringList.Free;
  end;
end;

procedure TRMItemListView.RenameItem;
var
  liListItem: TListItem;
begin
  liListItem := Selected;
  if (liListItem <> nil) and (liListItem.Data <> nil) then
    liListItem.EditCaption;
end;

procedure TRMItemListView.SetSortModeDescription;
var
  str: string;
  liIndex: Integer;
begin
  Columns[0].Caption := RMLoadStr(rmRes + 3163); {Name}
  Columns[1].Caption := RMLoadStr(rmRes + 3164); {Size}
  Columns[2].Caption := RMLoadStr(rmRes + 3165); {Type}
  Columns[3].Caption := RMLoadStr(rmRes + 3166); {Modified}
  case FSortMode of
    1: str := ' ' + ''; {(a > z)}
    -1: str := ' ' + ''; {(z > a)}
    2: str := ' ' + ''; {(small > large)}
    -2: str := ' ' + ''; {(large > small)}

⌨️ 快捷键说明

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