📄 teeexport.pas
字号:
{**********************************************}
{ TeeChart and TeeTree Common Export Dialog }
{ Copyright (c) 1996-2005 by David Berneda }
{**********************************************}
unit TeeExport;
{$I TeeDefs.inc}
interface
uses
{$IFNDEF LINUX}
Windows, Messages,
{$ENDIF}
SysUtils, Classes,
{$IFDEF CLX}
QGraphics, QControls, QForms, QDialogs, QStdCtrls, QExtCtrls, QComCtrls,
TeePenDlg,
{$ELSE}
Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls,
{$ENDIF}
{$IFDEF CLR}
System.IO, // <-- ExtractFileExt and ExtractFileName inline
{$ENDIF}
{$IFDEF LCL}
Buttons,
{$ENDIF}
TeCanvas, TeeProcs, TeeConst;
type
TeeSeparatorChar={$IFDEF CLX}WideChar{$ELSE}Char{$ENDIF};
TTeeExportFormat=class
private
FPanel : TCustomTeePanel;
protected
FFilterIndex : Integer;
Procedure CheckSize;
Procedure DoCopyToClipboard; virtual; abstract;
function FileFilterIndex:Integer; virtual;
Procedure IncFileFilterIndex(Var FilterIndex:Integer); virtual;
{$IFDEF CLR}
public
{$ENDIF}
function WantsFilterIndex(Index:Integer):Boolean; virtual; // 6.01
public
Height : Integer;
Width : Integer;
Constructor Create; virtual;
Destructor Destroy; override;
Procedure CopyToClipboard;
function Description:String; virtual; abstract;
function FileExtension:String; virtual; abstract;
function FileFilter:String; virtual; abstract;
function GraphicClass:TGraphicClass; virtual;
Procedure SaveToFile(Const FileName:String); overload; // 7.05
class procedure SaveToFile(APanel:TCustomTeePanel; const FileName:String); overload; // 7.05
Procedure SaveToStream(Stream:TStream); virtual; abstract;
Function Options(Check:Boolean=True):TForm; virtual;
property Panel:TCustomTeePanel read FPanel write FPanel;
end;
TTeeExportFormBase = class(TForm)
SaveDialogPicture: TSaveDialog;
PageControl1: TPageControl;
TabPicture: TTabSheet;
TabData: TTabSheet;
RGFormat: TGroupBox;
SaveDialogData: TSaveDialog;
TabNative: TTabSheet;
CBNativeData: TCheckBox;
SaveDialogNative: TSaveDialog;
LabelSize: TLabel;
CBFileSize: TCheckBox;
PageOptions: TPageControl;
TabOptions: TTabSheet;
TabSize: TTabSheet;
Label1: TLabel;
EWidth: TEdit;
UDWidth: TUpDown;
Label2: TLabel;
EHeight: TEdit;
UDHeight: TUpDown;
CBAspect: TCheckBox;
Panel1: TPanel;
BCopy: TButton;
BSave: TButton;
BSend: TButton;
BClose: TButton;
LBFormat: TListBox;
Label5: TLabel;
CBNativeFormat: TComboFlat;
Panel2: TPanel;
SplitPic: TSplitter;
Panel3: TPanel;
Label4: TLabel;
Label6: TLabel;
CBDelim: TComboFlat;
ECustom: TEdit;
GroupBox1: TGroupBox;
CBLabels: TCheckBox;
CBIndex: TCheckBox;
CBHeader: TCheckBox;
CBColors: TCheckBox;
EQuotes: TEdit;
Panel5: TPanel;
Label3: TLabel;
CBSeries: TComboFlat;
RGText: TRadioGroup;
procedure BCopyClick(Sender: TObject);
procedure BSaveClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure RGFormatClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure EWidthChange(Sender: TObject);
procedure PageControl1Change(Sender: TObject);
procedure RGTextClick(Sender: TObject);
procedure CBFileSizeClick(Sender: TObject);
procedure CBNativeDataClick(Sender: TObject);
procedure CBDelimChange(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure BSendClick(Sender: TObject);
procedure CBNativeFormatChange(Sender: TObject);
procedure Panel5Resize(Sender: TObject);
private
{ Private declarations }
IAspect : Double;
ChangingSize : Boolean;
Function CanChangeSize:Boolean;
Function GetDataFilterIndex:Integer;
Function GuessPictureFormat(const FileName:String):TTeeExportFormat;
Procedure FreeExportFormats;
Function PictureFormat:TTeeExportFormat;
Procedure SaveNativeToFile(Const FileName:String);
Procedure SavePictureToFile(Const FileName:String);
protected
Function CreateData:TTeeExportData; virtual;
Procedure DoSaveNativeToFile( Const FileName:String;
IncludeData:Boolean); virtual;
Function ExistData:Boolean; virtual;
Function CreateNativeStream:TStream; virtual;
Function GetSeparator:TeeSeparatorChar;
Function NativeAsText:Boolean;
Procedure PrepareOnShow; virtual;
Procedure SaveDataToFile(Const FileName:String);
public
{ Public declarations }
ExportPanel : TCustomTeePanel;
EmailName : String; { 5.03 }
NativeFilter : String; { 5.03 }
NativeExtension : String; { 5.03 }
DataFilter : String; { 6.01 }
procedure EnableButtons;
end;
{ Retrieves a native "*.tee" file }
Procedure LoadTeeFromFile(Var APanel:TCustomTeePanel; Const AName:String);
Procedure LoadTeeFromStream(Var APanel:TCustomTeePanel; AStream:TStream);
{ Saves a Chart or TeePanel to a native "*.tee" file format }
Procedure SaveTeeToFile(APanel:TCustomTeePanel; Const AName:String);
Procedure SaveTeeToStream(APanel:TCustomTeePanel; AStream:TStream);
{ "Tee export formats" }
type
TTeeExportFormatClass=class of TTeeExportFormat;
Procedure RegisterTeeExportFormat(AFormat:TTeeExportFormatClass);
Procedure UnRegisterTeeExportFormat(AFormat:TTeeExportFormatClass);
{ Show the Save dialog and save to AFormat export format }
{ example: TeeExportSavePanel(TGIFExportFormat,Chart1); }
Procedure TeeExportSavePanel(AFormat:TTeeExportFormatClass; APanel:TCustomTeePanel);
procedure TeeFillPictureDialog(ADialog:TSaveDialog; APanel:TCustomTeePanel; AItems:TStrings);
type
TTeeExportFormats=class(TList)
private
Function Get(Index:Integer):TTeeExportFormatClass;
public
{$IFDEF CLR}
procedure Add(Item:TTeeExportFormatClass);
procedure Remove(Item:TTeeExportFormatClass);
{$ENDIF}
property Format[Index:Integer]:TTeeExportFormatClass read Get; default;
end;
var
TeeExportFormats : TTeeExportFormats=nil;
// Returns instance of TGraphic class that corresponds to FileExtension (ie: TJPEGImage for 'jpg')
function WithFileExtension(const FileExtension:String):TGraphic;
{ starts the MAPI (eg: Outlook) application with an empty new email
message with the attachment file "FileName" }
Procedure InternalTeeEmailFile(Const FileName:String; Const Subject:String='TeeChart');
Function GetRegistryHelpPath(Const HelpFile:String):String;
implementation
{$IFNDEF CLX}
{$IFNDEF LCL}
{$R *.DFM}
{$ENDIF}
{$ELSE}
{$R *.xfm}
{$ENDIF}
Uses {$IFDEF CLX}
QClipbrd,
{$ELSE}
Clipbrd, ExtDlgs, TeePenDlg, TeeEMFOptions,
{$ENDIF}
{$IFNDEF LINUX}
{$IFNDEF LCL}
MAPI,
{$ENDIF}
Registry,
{$ENDIF}
{$IFDEF CLR}
System.Text,
{$ENDIF}
TeeHtml, TeeBmpOptions;
Const
LastTextFilter=5;
function WithFileExtension(const FileExtension:String):TGraphic;
var t : Integer;
tmp : TTeeExportFormat;
tmpExt : String;
begin
result:=nil;
if not Assigned(TeeExportFormats) then Exit;
tmpExt:=UpperCase(FileExtension);
for t:=0 to TeeExportFormats.Count-1 do
begin
tmp:=TeeExportFormats[t].Create;
try
if '.'+UpperCase(tmp.FileExtension)=tmpExt then
begin
if tmp.GraphicClass<>nil then
result:=tmp.GraphicClass.Create;
exit;
end;
finally
tmp.Free;
end;
end;
end;
Procedure SaveTeeToStream(APanel:TCustomTeePanel; AStream:TStream);
begin
AStream.WriteComponent(APanel);
end;
Procedure SaveTeeToFile(APanel:TCustomTeePanel; Const AName:String);
Var tmp : TFileStream;
OldVisible : Boolean;
begin
tmp:=TFileStream.Create(AName,fmCreate);
try
OldVisible:=APanel.Visible;
APanel.Visible:=True;
try
SaveTeeToStream(APanel,tmp);
finally
APanel.Visible:=OldVisible;
end;
finally
tmp.Free;
end;
end;
Procedure LoadTeeFromStream(Var APanel:TCustomTeePanel; AStream:TStream);
begin
AStream.ReadComponent(APanel);
end;
Procedure LoadTeeFromFile(Var APanel:TCustomTeePanel; Const AName:String);
Var tmp : TFileStream;
begin
tmp:=TFileStream.Create(AName,fmOpenRead);
try
LoadTeeFromStream(APanel,tmp);
finally
tmp.Free;
end;
end;
{ Export Dialog }
procedure TTeeExportFormBase.BCopyClick(Sender: TObject);
var s : TStringStream;
tmp : TStream;
begin
if PageControl1.ActivePage=TabPicture then
with PictureFormat do
begin
Width:=UDWidth.Position;
Height:=UDHeight.Position;
CopyToClipboard;
end
else
if PageControl1.ActivePage=TabData then
begin
Screen.Cursor:=crHourGlass;
try
With CreateData do
try
CopyToClipboard;
finally
Free;
end;
finally
Screen.Cursor:=crDefault;
end;
end
else
if (PageControl1.ActivePage=TabNative) and NativeAsText then
begin
s:=TStringStream.Create('');
try
tmp:=CreateNativeStream;
try
tmp.Position:=0;
s.CopyFrom(tmp,tmp.Size);
Clipboard.AsText:=s.DataString;
finally
tmp.Free;
end;
finally
s.Free;
end;
end;
end;
Procedure TTeeExportFormBase.SaveDataToFile(Const FileName:String);
begin
Screen.Cursor:=crHourGlass;
try
With CreateData do
try
SaveToFile(FileName);
finally
Free;
end;
finally
Screen.Cursor:=crDefault;
end;
end;
Function TTeeExportFormBase.CreateData:TTeeExportData;
begin
result:=nil;
end;
Function TTeeExportFormBase.GetSeparator:TeeSeparatorChar;
begin
Case CBDelim.ItemIndex of
0: result:=' ';
1: result:=TeeTabDelimiter;
2: result:=',';
3: result:=';';
else if ECustom.Text='' then result:=' ' else result:=ECustom.Text[1];
end;
end;
Function TTeeExportFormBase.GetDataFilterIndex:Integer;
begin
if RGText.ItemIndex=0 then result:=CBDelim.ItemIndex+1
else result:=LastTextFilter+RGText.ItemIndex;
end;
Procedure TTeeExportFormBase.DoSaveNativeToFile( Const FileName:String;
IncludeData:Boolean);
begin
SaveTeeToFile(ExportPanel,FileName);
end;
Procedure TTeeExportFormBase.SaveNativeToFile(Const FileName:String);
var tmp : String;
begin
Screen.Cursor:=crHourGlass;
try
tmp:=ChangeFileExt(FileName,'.'+NativeExtension);
DoSaveNativeToFile(tmp,CBNativeData.Checked);
finally
Screen.Cursor:=crDefault;
end;
end;
Procedure TTeeExportFormBase.SavePictureToFile(Const FileName:String);
begin
Screen.Cursor:=crHourGlass;
try
With GuessPictureFormat(FileName) do
begin
Width:=UDWidth.Position;
Height:=UDHeight.Position;
SaveToFile(FileName);
end;
finally
Screen.Cursor:=crDefault;
end;
end;
procedure TTeeExportFormBase.BSaveClick(Sender: TObject);
begin
if PageControl1.ActivePage=TabPicture then { as picture... }
With SaveDialogPicture do
begin
With PictureFormat do
begin
DefaultExt:=FileExtension;
FilterIndex:=FileFilterIndex;
end;
FileName:='';
if Execute then
SavePictureToFile(FileName);
end
else
if PageControl1.ActivePage=TabNative then { as native *.tee file... }
With SaveDialogNative do
begin
FileName:='';
DefaultExt:=NativeExtension;
Filter:=NativeFilter;
if Execute then SaveNativeToFile(FileName);
end
else
if PageControl1.ActivePage=TabData then { series data... }
With SaveDialogData do
begin
FileName:='';
Filter:=DataFilter;
FilterIndex:=GetDataFilterIndex;
if Execute then
begin
if FilterIndex<=LastTextFilter then
RGText.ItemIndex:=0
else
RGText.ItemIndex:=FilterIndex-LastTextFilter;
SaveDataToFile(FileName);
end;
end;
end;
procedure TTeeExportFormBase.FormCreate(Sender: TObject);
Const DialogOptions : TOpenOptions =
[ ofOverwritePrompt
{$IFNDEF CLX}
, ofHideReadOnly
{$ENDIF}
]; // K3?
begin
BorderStyle:=TeeBorderStyle;
ChangingSize:=False;
NativeExtension:=TeeMsg_TeeExtension; { default extension is *.tee }
NativeFilter:=TeeMsg_NativeFilter; { default "TeeChart files (*.tee)|*.tee" }
DataFilter:=TeeMsg_TextFilter1+'|'+TeeMsg_TextFilter2+'|'+TeeMsg_TextFilter3+
'|'+TeeMsg_TextFilter4+'|'+TeeMsg_TextFilter5+'|'+TeeMsg_XMLFilter+
'|'+TeeMsg_HTMLFilter+'|'+TeeMsg_ExcelFilter;
EmailName:=TeeMsg_TeeChartPalette;
PageControl1.ActivePage:=TabPicture;
CBNativeFormat.ItemIndex:=0;
// For Kylix compatibility: ("Options" cannot reside in DFM/XFM)
SaveDialogPicture.Options:=DialogOptions;
SaveDialogData.Options:=DialogOptions;
SaveDialogNative.Options:=DialogOptions;
end;
procedure TTeeExportFormBase.RGFormatClick(Sender: TObject);
var tmp : TForm;
t : Integer;
begin
With TabOptions do
for t:=0 to ControlCount-1 do
{$IFDEF LCL}
Controls[t].Visible:=False;
{$ELSE}
Controls[t].Hide;
{$ENDIF}
With PictureFormat do
begin
tmp:=Options;
TabOptions.TabVisible:=Assigned(tmp) and (tmp.ControlCount>0);
if TabOptions.TabVisible then
begin
PageOptions.ActivePage:=TabOptions;
AddFormTo(tmp,TabOptions);
TeeTranslateControl(tmp);
end
else PageOptions.ActivePage:=TabSize;
end;
end;
procedure TeeFillPictureDialog(ADialog:TSaveDialog; APanel:TCustomTeePanel; AItems:TStrings);
var t : Integer;
tmp : TTeeExportFormat;
tmpFilter : Integer;
{$IFDEF CLX}
i : Integer;
{$ENDIF}
begin
if TeeExportFormats<>nil then
begin
if ADialog.Filter='' then tmpFilter:=0
else tmpFilter:=1;
for t:=0 to TeeExportFormats.Count-1 do
begin
tmp:=TeeExportFormats[t].Create;
tmp.Panel:=APanel;
tmp.IncFileFilterIndex(tmpFilter);
With ADialog do
begin
if Filter<>'' then Filter:=Filter+'|';
{$IFDEF CLX}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -