📄 rmd_expfrm.pas
字号:
{*****************************************}
{ }
{ Report Machine v2.0 - Data storage }
{ Report Explorer Form }
{ }
{*****************************************}
unit RMD_ExpFrm;
interface
{$I RM.INC}
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus, ExtCtrls, Buttons, ComCtrls, RMD_RptExp
{$IFDEF Delphi4}, ImgList, TB97Tlbr, TB97Ctls, TB97{$ENDIF};
type
TRMDFormReportExplorer = class(TForm)
sbrExplorer: TStatusBar;
pnlFolders: TPanel;
pnlFolderTitle: TPanel;
trvFolders: TTreeView;
pnlReports: TPanel;
pnlReportTitle: TPanel;
MainMenu: TMainMenu;
barFile: TMenuItem;
padFileOpen: TMenuItem;
padFileNew: TMenuItem;
miN1: TMenuItem;
padFileClose: TMenuItem;
barView: TMenuItem;
padViewStatusBar: TMenuItem;
N6: TMenuItem;
padViewList: TMenuItem;
padViewDetails: TMenuItem;
padViewToolbar: TMenuItem;
padFileNewFolder: TMenuItem;
padFileNewReport: TMenuItem;
N2: TMenuItem;
padFileDelete: TMenuItem;
padFileRename: TMenuItem;
N4: TMenuItem;
padFilePrint: TMenuItem;
padFilePrintPreview: TMenuItem;
ImageListToolBar: TImageList;
ppmReports: TPopupMenu;
ppmReportsView: TMenuItem;
N8: TMenuItem;
ppmReportsNewFolder: TMenuItem;
ppmReportsNewReport: TMenuItem;
ppmReportsViewList: TMenuItem;
ppmReportsViewDetails: TMenuItem;
ppmFolders: TPopupMenu;
ppmFoldersExplore: TMenuItem;
MenuItem4: TMenuItem;
ppmFoldersNewFolder: TMenuItem;
ppmFoldersNewReport: TMenuItem;
ppmFoldersOpen: TMenuItem;
N9: TMenuItem;
ppmFoldersDelete: TMenuItem;
ppmFoldersRename: TMenuItem;
N10: TMenuItem;
ppmReportsDelete: TMenuItem;
ppmReportsRename: TMenuItem;
N5: TMenuItem;
ImageListTreeView: TImageList;
splViews: TSplitter;
ppmFoldersEmptyRecycleBin: TMenuItem;
ImageListListView: TImageList;
N1: TMenuItem;
ppmPrint: TMenuItem;
ppmPrintPreview: TMenuItem;
Dock971: TDock97;
ToolBar: TToolbar97;
btnNewFolder: TToolbarButton97;
btnUpOneLevel: TToolbarButton97;
ToolbarSep971: TToolbarSep97;
btnNewReport: TToolbarButton97;
btnOpenReport: TToolbarButton97;
btnPrintPreview: TToolbarButton97;
ToolbarSep972: TToolbarSep97;
btnPrint: TToolbarButton97;
ToolbarSep973: TToolbarSep97;
btnDelete: TToolbarButton97;
ToolbarSep974: TToolbarSep97;
btnViewDetails: TToolbarButton97;
btnViewList: TToolbarButton97;
ToolbarSep975: TToolbarSep97;
btnClose: TToolbarButton97;
procedure padFilePrintClick(Sender: TObject);
procedure padFilePrintPreviewClick(Sender: TObject);
procedure padFileOpenClick(Sender: TObject);
procedure padFileNewReportClick(Sender: TObject);
procedure padFileDeleteClick(Sender: TObject);
procedure padViewListClick(Sender: TObject);
procedure padViewDetailsClick(Sender: TObject);
procedure padViewToolbarClick(Sender: TObject);
procedure padViewStatusBarClick(Sender: TObject);
procedure padFileCloseClick(Sender: TObject);
procedure padFileNewFolderClick(Sender: TObject);
procedure trvFoldersEdited(Sender: TObject; Node: TTreeNode; var S: string);
procedure padFileRenameClick(Sender: TObject);
procedure trvFoldersDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
procedure trvFoldersDragDrop(Sender, Source: TObject; X, Y: Integer);
procedure trvFoldersEditing(Sender: TObject; Node: TTreeNode; var AllowEdit: Boolean);
procedure ppmReportsPopup(Sender: TObject);
procedure ppmFoldersPopup(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure ppmFoldersEmptyRecycleBinClick(Sender: TObject);
procedure trvFoldersChange(Sender: TObject; Node: TTreeNode);
procedure btnUpOneLevelClick(Sender: TObject);
private
FListView: TRMItemList;
FReportExplorer: TRMReportExplorer;
FAllFoldersNode: TTreeNode;
FRecycleBinNode: TTreeNode;
function FindDataInTreeView(aTreeView: TTreeView; aData: Integer): TTreeNode;
function FindNearestNode(aNode: TTreeNode): TTreeNode;
procedure ListDoubleClickEvent(Sender: TObject);
procedure ListFolderChangeEvent(Sender: TObject);
procedure ListRenameFolderEvent(Sender: TObject; aFolderId: Integer; const aNewName: string);
procedure ListSelectionChangeEvent(Sender: TObject);
procedure LoadFromIniFile;
procedure OpenItem;
procedure SaveToIniFile;
procedure SelectFolder(aFolderId: Integer);
procedure SetViewStyle(Value: Boolean);
procedure SetViewToolbar(Value: Boolean);
procedure SetViewStatusBar(Value: Boolean);
procedure UpdateRecycleBin;
procedure UpdateStatusBar;
procedure UpdateTreeView;
procedure Localize;
protected
function GetReportExplorer: TRMReportExplorer;
procedure SetReportExplorer(Value: TRMReportExplorer);
public
property ReportExplorer: TRMReportExplorer read GetReportExplorer write SetReportExplorer;
procedure Refresh;
procedure RefreshCurrentListView;
procedure RefreshCurrentListItem;
end;
implementation
{$R *.DFM}
uses Registry, RM_Const, RM_Utils;
function RMGetScreenRes: TPoint;
var
DC: HDC;
begin
DC := GetDC(0);
Result.X := GetDeviceCaps(DC, HORZRES);
Result.Y := GetDeviceCaps(DC, VERTRES);
ReleaseDC(0, DC);
end;
procedure TRMDFormReportExplorer.Localize;
begin
Font.Name := RMLoadStr(SRMDefaultFontName);
Font.Size := StrToInt(RMLoadStr(SRMDefaultFontSize));
Font.Charset := StrToInt(RMLoadStr(SCharset));
pnlFolderTitle.Caption := RMLoadStr(rmRes + 3135);
btnUpOneLevel.Hint := RMLoadStr(rmRes + 3136);
btnOpenReport.Hint := RMLoadStr(rmRes + 3137);
btnNewFolder.Hint := RMLoadStr(rmRes + 3138);
btnNewReport.Hint := RMLoadStr(rmRes + 3139);
btnPrint.Hint := RMLoadStr(rmRes + 3140);
btnPrintPreview.Hint := RMLoadStr(rmRes + 3141);
btnDelete.Hint := RMLoadStr(rmRes + 3142);
btnViewList.Hint := RMLoadStr(rmRes + 3143);
btnViewDetails.Hint := RMLoadStr(rmRes + 3144);
btnClose.Hint := RMLoadStr(rmRes + 3145);
barFile.Caption := RMLoadStr(rmRes + 154);
padFileOpen.Caption := RMLoadStr(rmRes + 3137);
padFileNew.Caption := RMLoadStr(rmRes + 3146);
padFileNewFolder.Caption := RMLoadStr(rmRes + 3147);
padFileNewReport.Caption := RMLoadStr(rmRes + 3148);
padFilePrint.Caption := RMLoadStr(rmRes + 3140);
padFilePrintPreview.Caption := RMLoadStr(rmRes + 3141);
padFileDelete.Caption := RMLoadStr(rmRes + 3142);
padFileRename.Caption := RMLoadStr(rmRes + 3149);
padFileClose.Caption := RMLoadStr(rmRes + 3145);
barView.Caption := RMLoadStr(rmRes + 3150);
padViewToolbar.Caption := RMLoadStr(rmRes + 3151);
padViewStatusBar.Caption := RMLoadStr(rmRes + 3152);
padViewList.Caption := RMLoadStr(rmRes + 3153);
padViewDetails.Caption := RMLoadStr(rmRes + 3154);
ppmReportsNewFolder.Caption := RMLoadStr(rmRes + 3138);
ppmReportsNewReport.Caption := RMLoadStr(rmRes + 3139);
ppmReportsDelete.Caption := RMLoadStr(rmRes + 3142);
ppmReportsRename.Caption := RMLoadStr(rmRes + 3149);
ppmPrint.Caption := RMLoadStr(rmRes + 3140);
ppmPrintPreview.Caption := RMLoadStr(rmRes + 3141);
ppmReportsView.Caption := RMLoadStr(rmRes + 3150);
ppmReportsViewList.Caption := RMLoadStr(rmRes + 3153);
ppmReportsViewDetails.Caption := RMLoadStr(rmRes + 3154);
ppmFoldersExplore.Caption := RMLoadStr(rmRes + 3155);
ppmFoldersOpen.Caption := RMLoadStr(rmRes + 3137);
ppmFoldersEmptyRecycleBin.Caption := RMLoadStr(rmRes + 3156);
ppmFoldersNewFolder.Caption := RMLoadStr(rmRes + 3138);
ppmFoldersNewReport.Caption := RMLoadStr(rmRes + 3139);
ppmFoldersDelete.Caption := RMLoadStr(rmRes + 3142);
ppmFoldersRename.Caption := RMLoadStr(rmRes + 3149);
end;
procedure TRMDFormReportExplorer.Refresh;
begin
UpdateTreeView;
SelectFolder(FReportExplorer.CurrentFolderId);
FListView.ItemName := FReportExplorer.CurrentItemName;
end;
procedure TRMDFormReportExplorer.RefreshCurrentListView;
begin
SelectFolder(FReportExplorer.CurrentFolderId);
FListView.ItemName := FReportExplorer.CurrentItemName;
end;
procedure TRMDFormReportExplorer.RefreshCurrentListItem;
begin
FListView.ItemName := FReportExplorer.CurrentItemName;
end;
function TRMDFormReportExplorer.GetReportExplorer: TRMReportExplorer;
begin
Result := FReportExplorer;
end;
procedure TRMDFormReportExplorer.SetReportExplorer(Value: TRMReportExplorer);
begin
FReportExplorer := Value;
FListView.ReportExplorer := Value;
end;
procedure TRMDFormReportExplorer.LoadFromIniFile; //调入配置
var
IniFile: TRegIniFile;
lScreenRes: TPoint;
liLeft: Integer;
liTop: Integer;
liWidth: Integer;
liHeight: Integer;
liWindowState: Integer;
begin
IniFile := TRegIniFile.Create(FReportExplorer.RootKey);
liLeft := IniFile.ReadInteger('Position', 'Left', -1);
if liLeft <> -1 then
begin
lScreenRes := RMGetScreenRes;
liWidth := 790;
liHeight := 600;
if lScreenRes.X <> 1024 then
begin
liWidth := (liWidth * lScreenRes.X) div 1024;
liHeight := (Height * lScreenRes.Y) div 768;
end;
liLeft := (Screen.Width - liWidth) div 2;
liTop := (Screen.Height - liHeight) div 2;
liWindowState := IniFile.ReadInteger('Position', 'WindowState', Ord(wsNormal));
if TWindowState(liWindowState) = wsNormal then
begin
liLeft := IniFile.ReadInteger('Position', 'Left', liLeft);
liTop := IniFile.ReadInteger('Position', 'Top', liTop);
liWidth := IniFile.ReadInteger('Position', 'Width', liWidth);
liHeight := IniFile.ReadInteger('Position', 'Height', liHeight);
end;
SetBounds(liLeft, liTop, liWidth, liHeight);
if TWindowState(liWindowState) <> wsMinimized then
WindowState := TWindowState(liWindowState);
SetViewStyle(IniFile.ReadBool('State', 'ViewList', True));
SetViewToolbar(IniFile.ReadBool('State', 'ViewToolbar', True));
SetViewStatusBar(IniFile.ReadBool('State', 'ViewStatusBar', True));
FListView.SortMode := IniFile.ReadInteger('State', 'SortMode', 1);
FListView.Columns[0].Width := IniFile.ReadInteger('State', 'ListViewColumn1Width', 250);
FListView.Columns[1].Width := IniFile.ReadInteger('State', 'ListViewColumn2Width', 120);
FListView.Columns[2].Width := IniFile.ReadInteger('State', 'ListViewColumn3Width', 100);
FListView.Columns[3].Width := IniFile.ReadInteger('State', 'ListViewColumn4Width', 140);
FListView.FolderId := IniFile.ReadInteger('State', 'Selected Folder', 0);
FListView.ItemName := IniFile.ReadString('State', 'Selected Item', '');
FReportExplorer.CurrentFolderId := FListView.FolderId;
FReportExplorer.CurrentItemName := FListView.ItemName;
end
else
WindowState := wsMaximized;
IniFile.Free;
end;
procedure TRMDFormReportExplorer.SaveToIniFile; //保存配置
var
IniFile: TRegIniFile;
begin
IniFile := TRegIniFile.Create(FReportExplorer.RootKey);
with IniFile do
begin
WriteInteger('Position', 'WindowState', Ord(WindowState));
WriteInteger('Position', 'Left', Left);
WriteInteger('Position', 'Top', Top);
WriteInteger('Position', 'Width', Width);
WriteInteger('Position', 'Height', Height);
WriteBool('State', 'ViewList', padViewList.Checked);
WriteBool('State', 'ViewToolbar', padViewToolbar.Checked);
WriteBool('State', 'ViewStatusBar', padViewStatusBar.Checked);
WriteInteger('State', 'SortMode', FListView.SortMode);
WriteInteger('State', 'ListViewColumn1Width', FListView.Columns[0].Width);
WriteInteger('State', 'ListViewColumn2Width', FListView.Columns[1].Width);
WriteInteger('State', 'ListViewColumn3Width', FListView.Columns[2].Width);
WriteInteger('State', 'ListViewColumn4Width', FListView.Columns[3].Width);
WriteInteger('State', 'Selected Folder', FListView.FolderId);
WriteString('State', 'Selected Item', FListView.ItemName);
end;
IniFile.Free;
end;
procedure TRMDFormReportExplorer.SetViewToolbar(Value: Boolean);
begin
padViewToolbar.Checked := Value;
ToolBar.Visible := Value;
end;
procedure TRMDFormReportExplorer.SetViewStatusBar(Value: Boolean);
begin
padViewStatusBar.Checked := Value;
sbrExplorer.Visible := Value;
end;
procedure TRMDFormReportExplorer.SetViewStyle(Value: Boolean);
begin
if Value then
begin
padViewList.Checked := True;
ppmReportsViewList.Checked := True;
btnViewDetails.Down := False;
btnViewList.Down := True;
FListView.ViewStyle := vsList;
end
else
begin
padViewDetails.Checked := True;
ppmReportsViewDetails.Checked := True;
btnViewList.Down := False;
btnViewDetails.Down := True;
FListView.ViewStyle := vsReport;
end;
end;
procedure TRMDFormReportExplorer.OpenItem; //打开,修改报表
begin
if FListView.FolderId = itRecycleBin then Exit;
if (FListView.ItemType <> itReport) or (FListView.ItemName = '') then Exit;
Cursor := crHourGlass;
FListView.Cursor := crHourGlass;
try
FReportExplorer.Open(FListView.ItemName, FListView.FolderId);
finally
Cursor := crDefault;
FListView.Cursor := crDefault;
end;
end;
procedure TRMDFormReportExplorer.SelectFolder(aFolderId: Integer); //选择文件夹
var
Index: integer;
ItemFound: TTreeNode;
begin
Index := 0; ItemFound := nil;
while Index < trvFolders.Items.Count do
begin
if Integer(trvFolders.Items[Index].Data) = aFolderId then
begin
ItemFound := trvFolders.Items[Index];
Break;
end;
Inc(Index);
end;
if ItemFound <> nil then
trvFolders.Selected := ItemFound
else
trvFolders.Selected := trvFolders.Items[0];
FListView.FolderId := Integer(trvFolders.Selected.Data);
UpdateStatusBar;
end;
procedure TRMDFormReportExplorer.UpdateStatusBar;
var
item: TTreeNode;
begin
Item := trvFolders.Selected;
if Item <> nil then
begin
if Integer(Item.Data) = itRecycleBin then
begin
btnUpOneLevel.Enabled := False;
btnNewFolder.Enabled := False;
btnNewReport.Enabled := False;
btnOpenReport.Enabled := False;
padFileOpen.Enabled := btnOpenReport.Enabled;
padFileNewFolder.Enabled := False;
padFileNewReport.Enabled := False;
padFileRename.Enabled := False;
end
else
begin
btnUpOneLevel.Enabled := (Integer(Item.Data) <> itAllFolders);
btnNewFolder.Enabled := True;
btnNewReport.Enabled := True;
btnOpenReport.Enabled := True;
padFileOpen.Enabled := True;
padFileNewFolder.Enabled := True;
padFileNewReport.Enabled := True;
padFileRename.Enabled := TRUE;
end;
end;
btnPrint.Enabled := FListView.Focused and (FListView.ItemType = itReport);
btnPrintPreview.Enabled := btnPrint.Enabled;
ppmPrint.Enabled := btnPrint.Enabled;
ppmPrintPreview.Enabled := btnPrint.Enabled;
padFilePrint.Enabled := btnPrint.Enabled;
padFilePrintPreview.Enabled := btnPrint.Enabled;
item := trvFolders.Selected;
btnDelete.Enabled := (FListView.Selected <> nil) or
((item <> nil) and (Integer(Item.Data) > itAllFolders));
end;
procedure TRMDFormReportExplorer.UpdateRecycleBin;
var
sl: TStringList;
begin
sl := TStringList.Create;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -