📄 main.pas
字号:
{******************************************}
{ }
{ FastReport v3.0 }
{ FastReport client demo }
{ Copyright (c) 1998-2005 }
{ by Alexander Fediachov, }
{ Fast Reports Inc. }
{ }
{******************************************}
unit main;
{$I frx.inc}
interface
uses
Windows, SysUtils, Classes, Controls, Forms,
Dialogs, StdCtrls, ShellApi, frxClass, frxServerClient,
frxGZip, frxDCtrl, frxChBox, frxCross, frxRich, frxChart,
frxOLE, frxBarcode, ExtCtrls, frxExportPDF, frxExportImage,
frxExportRTF, frxExportXML, frxExportXLS, frxExportHTML, frxHiButtons,
frxExportTXT, frxGradient, Graphics, ComCtrls, Menus, ImgList
{$IFDEF Delphi6}
, Variants, frxExportMail, frxExportText, frxExportCSV
{$ENDIF};
type
TMainForm = class(TForm)
frxServerConnection1: TfrxServerConnection;
TestBtn: TButton;
Log: TMemo;
Rep: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
ShowBtn: TButton;
CloseBtn: TButton;
Label4: TLabel;
Label5: TLabel;
Port: TEdit;
Threads: TEdit;
Label6: TLabel;
frxBarCodeObject1: TfrxBarCodeObject;
frxOLEObject1: TfrxOLEObject;
frxChartObject1: TfrxChartObject;
frxRichObject1: TfrxRichObject;
frxCrossObject1: TfrxCrossObject;
frxCheckBoxObject1: TfrxCheckBoxObject;
frxDialogControls1: TfrxDialogControls;
Label7: TLabel;
Login: TEdit;
Label8: TLabel;
Password: TEdit;
StopBtn: TButton;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Image1: TImage;
frxGradientObject1: TfrxGradientObject;
frxHTMLExport1: TfrxHTMLExport;
frxXLSExport1: TfrxXLSExport;
frxXMLExport1: TfrxXMLExport;
frxRTFExport1: TfrxRTFExport;
frxBMPExport1: TfrxBMPExport;
frxJPEGExport1: TfrxJPEGExport;
frxTIFFExport1: TfrxTIFFExport;
frxPDFExport1: TfrxPDFExport;
ProxyHost: TEdit;
Label12: TLabel;
Label13: TLabel;
ProxyPort: TEdit;
Label14: TLabel;
Label15: TLabel;
Panel2: TPanel;
Panel4: TPanel;
Host: TEdit;
ReportsTree: TTreeView;
Description: TMemo;
Label16: TLabel;
Panel5: TPanel;
ExportBtn: TButton;
Label17: TLabel;
Panel10: TPanel;
ConnectBtn: TButton;
Panel11: TPanel;
Panel9: TPanel;
Panel12: TPanel;
Panel13: TPanel;
Panel14: TPanel;
Label18: TLabel;
PopupMenu1: TPopupMenu;
Clear1: TMenuItem;
frxReportClient1: TfrxReportClient;
ImageList1: TImageList;
frxCSVExport1: TfrxCSVExport;
frxSimpleTextExport1: TfrxSimpleTextExport;
frxMailExport1: TfrxMailExport;
procedure TestBtnClick(Sender: TObject);
procedure CloseBtnClick(Sender: TObject);
procedure ShowBtnClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure StopBtnClick(Sender: TObject);
procedure ListBox1DblClick(Sender: TObject);
procedure ListBox1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure Label11Click(Sender: TObject);
procedure ConnectBtnClick(Sender: TObject);
procedure Clear1Click(Sender: TObject);
procedure ReportsTreeChange(Sender: TObject; Node: TTreeNode);
procedure ReportsTreeCustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
procedure ExportBtnClick(Sender: TObject);
private
ThreadList: TList;
ReportsList: TStringList;
procedure ClearThreads;
end;
TfrxClientTestThread = class (TThread)
protected
procedure Execute; override;
private
CountRep: Integer;
ErrorsCount: Integer;
Log: TMemo;
ThreadID: Integer;
procedure AppendLog;
procedure FinishLog;
public
Report: TfrxReportClient;
Done: Boolean;
constructor Create(C: TfrxServerConnection; RepName: String;
Id: Integer; Rep: Integer; L: TMemo);
destructor Destroy; override;
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
procedure TMainForm.TestBtnClick(Sender: TObject);
var
i, j, k: Integer;
Thread: TfrxClientTestThread;
s: String;
begin
frxServerConnection1.Host := Host.Text;
frxServerConnection1.Port := StrToInt(Port.Text);
frxServerConnection1.Login := Login.Text;
frxServerConnection1.Password := Password.Text;
if (Length(ProxyHost.Text) > 0) then
begin
frxServerConnection1.ProxyHost := ProxyHost.Text;
frxServerConnection1.ProxyPort := StrToInt(ProxyPort.Text);
end;
ClearThreads;
j := StrToInt(Threads.Text);
k := StrToInt(Rep.Text);
i := Integer(ReportsTree.Selected.Data);
if i <> -1 then
begin
Log.Lines.Add('Start test');
s := ReportsList[i + 1];
for i := 1 to j do
begin
Thread := TfrxClientTestThread.Create(frxServerConnection1, s, i, k, Log);
ThreadList.Add(Thread);
end;
end;
end;
procedure TMainForm.CloseBtnClick(Sender: TObject);
begin
Close;
end;
procedure TMainForm.ShowBtnClick(Sender: TObject);
var
t: Cardinal;
tf: Double;
i: Integer;
begin
frxServerConnection1.Host := Host.Text;
frxServerConnection1.Port := StrToInt(Port.Text);
frxServerConnection1.Login := Login.Text;
frxServerConnection1.Password := Password.Text;
if (Length(ProxyHost.Text) > 0) then
begin
frxServerConnection1.ProxyHost := ProxyHost.Text;
frxServerConnection1.ProxyPort := StrToInt(ProxyPort.Text);
end;
i := Integer(ReportsTree.Selected.Data);
if i <> -1 then
begin
frxReportClient1.LoadFromFile(ReportsList[i + 1]);
t := GetTickCount;
if frxReportClient1.PrepareReport then
begin
tf := (GetTickCount - t) / 1000;
Log.Lines.Add(frxReportClient1.ReportName +
' Time=' + FloatToStr(tf) + ' Size=' + IntToStr(frxReportClient1.Client.StreamSize));
frxReportClient1.ShowPreparedReport;
end;
Log.Lines.AddStrings(frxReportClient1.Errors);
end;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
Label14.Caption := #174;
Label15.Caption := #169 + Label15.Caption;
ThreadList := TList.Create;
ReportsList := TStringList.Create;
end;
procedure TMainForm.ClearThreads;
var
i: Integer;
begin
for i := 0 to ThreadList.Count - 1 do
if Assigned(TfrxClientTestThread(ThreadList[i])) then
TfrxClientTestThread(ThreadList[i]).Terminate;
ThreadList.Clear;
end;
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ReportsList.Free;
ClearThreads;
ThreadList.Free;
end;
procedure TMainForm.StopBtnClick(Sender: TObject);
begin
ClearThreads;
end;
procedure TMainForm.ListBox1DblClick(Sender: TObject);
begin
ShowBtnClick(Sender);
end;
procedure TMainForm.ListBox1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = 13 then
ShowBtnClick(Sender);
end;
procedure TMainForm.Label11Click(Sender: TObject);
begin
ShellExecute(GetDesktopWindow, 'open', PChar(Label11.Caption), nil, nil, SW_SHOW);
end;
procedure TMainForm.ConnectBtnClick(Sender: TObject);
var
t: Cardinal;
tf: Double;
s, s1: String;
AccessFlag: Boolean;
i: Integer;
Node: TTreeNode;
TopNode: TTreeNode;
OldName: String;
begin
ReportsTree.Items.Clear;
ReportsList.Clear;
Log.Clear;
frxServerConnection1.Host := Host.Text;
frxServerConnection1.Port := StrToInt(Port.Text);
frxServerConnection1.Login := Login.Text;
frxServerConnection1.Password := Password.Text;
if (Length(ProxyHost.Text) > 0) then
begin
frxServerConnection1.ProxyHost := ProxyHost.Text;
frxServerConnection1.ProxyPort := StrToInt(ProxyPort.Text);
end;
t := GetTickCount;
Log.Lines.Text := Log.Lines.Text +
frxReportClient1.GetServerVariable('SERVER_NAME');
tf := (GetTickCount - t) / 1000;
if frxReportClient1.Errors.Count = 0 then
begin
Log.Lines.Text := Log.Lines.Text +
'Version: ' + frxReportClient1.GetServerVariable('SERVER_SOFTWARE');
Log.Lines.Text := Log.Lines.Text +
'From: ' + frxReportClient1.GetServerVariable('SERVER_LAST_UPDATE');
Log.Lines.Text := Log.Lines.Text +
'Uptime: ' + frxReportClient1.GetServerVariable('SERVER_UPTIME');
Log.Lines.Add('Ping:' + FloatToStr(tf) + 'ms.');
end;
Log.Lines.AddStrings(frxReportClient1.Errors);
AccessFlag := frxReportClient1.Errors.Count = 0;
if AccessFlag then
begin
ReportsList.Text := frxReportClient1.GetServerVariable('SERVER_REPORTS_LIST');
if ReportsList.Count > 0 then
begin
ReportsTree.Items.BeginUpdate;
TopNode := nil;
Oldname := '';
for i := 0 to (ReportsList.Count div 3) - 1 do
begin
s := ReportsList[(i * 3) + 1];
s := StringReplace(StringReplace(s, ExtractFileName(s), '', []), '\', ' ', [rfReplaceAll]);
if s <> OldName then
begin
if s = '' then
s1 := 'Reports'
else
s1 := s;
Node := ReportsTree.Items.AddChild(nil, s1);
Node.Data := Pointer(-1);
Node.ImageIndex := 0;
TopNode := Node;
OldName := s;
end;
Node := ReportsTree.Items.AddChild(TopNode, ReportsList[i * 3]);
Node.Data := Pointer((i * 3));
Node.ImageIndex := 1;
end;
ReportsTree.Items.EndUpdate;
ReportsTree.TopItem := ReportsTree.Items[0];
ReportsTree.Selected := ReportsTree.Items[0];
ReportsTree.SetFocus;
end else
Log.Lines.Add('Nothing reports is available or information restricted.');
end;
end;
procedure TMainForm.Clear1Click(Sender: TObject);
begin
Log.Clear;
end;
procedure TMainForm.ReportsTreeChange(Sender: TObject; Node: TTreeNode);
var
i: Integer;
begin
i := Integer(Node.Data);
if i <> -1 then
Description.Text := ReportsList[i + 2]
else
Description.Text := Node.Text;
ShowBtn.Enabled := i <> -1;
ExportBtn.Enabled := ShowBtn.Enabled;
TestBtn.Enabled := ShowBtn.Enabled;
end;
procedure TMainForm.ReportsTreeCustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if Node.Count <> 0 then
ReportsTree.Canvas.Font.Style := [fsBold];
end;
procedure TMainForm.ExportBtnClick(Sender: TObject);
var
t: Cardinal;
tf: Double;
i: Integer;
begin
frxServerConnection1.Host := Host.Text;
frxServerConnection1.Port := StrToInt(Port.Text);
frxServerConnection1.Login := Login.Text;
frxServerConnection1.Password := Password.Text;
if (Length(ProxyHost.Text) > 0) then
begin
frxServerConnection1.ProxyHost := ProxyHost.Text;
frxServerConnection1.ProxyPort := StrToInt(ProxyPort.Text);
end;
i := Integer(ReportsTree.Selected.Data);
if i <> -1 then
begin
frxReportClient1.LoadFromFile(ReportsList[i + 1]);
t := GetTickCount;
if frxReportClient1.PrepareReport then
begin
tf := (GetTickCount - t) / 1000;
Log.Lines.Add(frxReportClient1.ReportName +
' Time=' + FloatToStr(tf) + ' Size=' + IntToStr(frxReportClient1.Client.StreamSize));
frxReportClient1.Export(frxPDFExport1);
end;
Log.Lines.AddStrings(frxReportClient1.Errors);
end;
end;
{ TfrxClientTestThread }
procedure TfrxClientTestThread.AppendLog;
begin
if Assigned(Log) and (Report.Errors.Count > 0) and (not Terminated) then
begin
Log.Lines.Add('Thread#' + IntToStr(ThreadID));
Log.Lines.AddStrings(Report.Errors);
end;
end;
constructor TfrxClientTestThread.Create(C: TfrxServerConnection; RepName: String;
Id: Integer; Rep: Integer; L: TMemo);
begin
inherited Create(True);
ErrorsCount := 0;
ThreadId := Id;
CountRep := Rep;
Log := L;
Report := TfrxReportClient.Create(nil);
Report.EngineOptions.EnableThreadSafe := True;
Report.ShowProgress := False;
Report.EngineOptions.SilentMode := True;
Report.Connection := C;
Report.ReportName := RepName;
Done := False;
FreeOnTerminate := True;
Resume;
end;
destructor TfrxClientTestThread.Destroy;
begin
Done := True;
Report.Free;
inherited;
end;
procedure TfrxClientTestThread.Execute;
var
i: Integer;
begin
Done := False;
i := 0;
while (i < CountRep) and (not Terminated) do
begin
Report.Clear;
Report.PrepareReport;
if not Terminated then
begin
Synchronize(AppendLog);
ErrorsCount := ErrorsCount + Report.Errors.Count;
end;
Inc(i);
end;
if not Terminated then
Synchronize(FinishLog);
Done := True;
end;
procedure TfrxClientTestThread.FinishLog;
begin
if Assigned(Log) and (not Terminated) then
Log.Lines.Add('Thread#' + IntToStr(ThreadID) + ' finished. Errors:' + IntToStr(ErrorsCount));
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -