cxexport.pas
来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 1,045 行 · 第 1/3 页
PAS
1,045 行
function cxExtractFileNameExW(const AFileName: WideString): WideString;
begin
Result := CopyEx(AFileName, GetLastDelimiterPos(AFileName, '\'));
end;
function cxExtractFilePathExW(const AFileName: WideString): WideString;
begin
Result := CopyEx(AFileName, 1, GetLastDelimiterPos(AFileName, '\') - 1);
end;
function cxValidateFileName(const AFileName: string): WideString;
begin
Result := cxValidateFileNameW(cxStrToUnicode(AFileName));
end;
function cxValidateFileNameW(const AFileName: WideString): WideString;
begin
Result := AFileName;
while Pos('/', Result) <> 0 do
Result[Pos('/', Result)] := '\';
end;
procedure UseGraphicImages(AUse: Boolean);
begin
if AUse then
Inc(GraphicRef)
else
Dec(GraphicRef);
if GraphicRef = 0 then
GraphicCount := 0;
end;
function CreateDefaultCellStyle: TcxCacheCellStyle;
var
I: Integer;
begin
with Result do
begin
AlignText := catCenter;
FillChar(FontName, SizeOf(FontName), 0);
FontName := 'Tahoma';
FontStyle := [];
FontColor := cxBtnTextColor;
FontSize := 8;
FontCharSet := 0;
for I := 0 to 3 do
begin
Borders[I].IsDefault := False;
Borders[I].Width := 1;
Borders[I].Color := cxBtnShadowColor;
end;
BrushStyle := cbsSolid;
BrushBkColor := cxWindowColor;
BrushFgColor := cxBlackColor;
end;
end;
function cxColorToRGB(const AColor: Integer): Integer;
type
TRGB = packed record
R, G, B, A: Byte;
end;
begin
Result := cxGetRgbColor(AColor);
if IsNativeColor then Exit;
with TRGB(cxGetRgbColor(AColor)) do
begin
if AColor < 0 then
Result := R shl 16 + G shl 8 + B;
end;
end;
{$IFDEF WIN32}
function cxUnicodeToStr(const AText: WideString; ACharset: Integer = 0): string;
var
APage, ALen: Integer;
begin
case ACharset of
THAI_CHARSET:
APage := 874;
SHIFTJIS_CHARSET:
APage := 932;
GB2312_CHARSET:
APage := 936;
HANGEUL_CHARSET, JOHAB_CHARSET:
APage := 949;
CHINESEBIG5_CHARSET:
APage := 950;
EASTEUROPE_CHARSET:
APage := 1250;
RUSSIAN_CHARSET:
APage := 1251;
GREEK_CHARSET:
APage := 1253;
TURKISH_CHARSET:
APage := 1254;
HEBREW_CHARSET:
APage := 1255;
ARABIC_CHARSET:
APage := 1256;
BALTIC_CHARSET:
APage := 1257;
else
APage := 0
end;
ALen := WideCharToMultiByte(APage, 0, PWideChar(AText), Length(AText), nil, 0, nil, nil);
SetLength(Result, ALen);
WideCharToMultiByte(APage, 0, PWideChar(AText), Length(AText), PChar(Result), ALen, nil, nil);
end;
function cxStrToUnicode(const AText: string; ACharset: Integer = 0): Widestring;
var
APage, ALen: Integer;
begin
case ACharset of
THAI_CHARSET:
APage := 874;
SHIFTJIS_CHARSET:
APage := 932;
GB2312_CHARSET:
APage := 936;
HANGEUL_CHARSET, JOHAB_CHARSET:
APage := 949;
CHINESEBIG5_CHARSET:
APage := 950;
EASTEUROPE_CHARSET:
APage := 1250;
RUSSIAN_CHARSET:
APage := 1251;
GREEK_CHARSET:
APage := 1253;
TURKISH_CHARSET:
APage := 1254;
HEBREW_CHARSET:
APage := 1255;
ARABIC_CHARSET:
APage := 1256;
BALTIC_CHARSET:
APage := 1257;
else
APage := 0
end;
ALen := MultiByteToWideChar(APage, 0, PChar(AText), Length(AText), nil, 0);
SetLength(Result, ALen);
MultiByteToWideChar(APage, 0, PChar(AText), Length(AText), PWideChar(Result), ALen);
end;
{$ELSE}
function cxStrToUnicode(const AText: string; ACharset: Integer = 0): Widestring;
begin
Result := AText;
end;
{$ENDIF}
function cxStrUnicodeNeeded(const AText: string; ACheckNormal: Boolean = False): Boolean;
var
I: Integer;
const
ANormal = ['0'..'9', ':', ';', '*', '+', ',', '-', '.', '/', '!', ' ',
'A'..'Z', 'a'..'z', '_', '(', ')'];
begin
Result := False;
for I := 1 to Length(AText) do
if (Byte(AText[I]) > $7F) or (ACheckNormal and not (AText[I] in ANormal)) then
begin
Result := True;
Break;
end
end;
function GetHashCode(const Buffer; Count: Integer): Integer; assembler;
asm
MOV ECX, EDX
MOV EDX, EAX
XOR EAX, EAX
@@1: ROL EAX, 5
XOR AL, [EDX]
INC EDX
DEC ECX
JNE @@1
end;
function GetGraphicFileName(const AFileName, AExt: string): string;
begin
Result := ChangeFileExt(AFileName, '.images') + '\' + ChangeFileExt(
ExtractFileName(AFileName), '') + '_' + IntToStr(GraphicCount) + '.' + AExt;
Inc(GraphicCount);
end;
function PrepareGraphic(AGraphic: TGraphic): TGraphic;
begin
Result := AGraphic;
if not SupportGraphic(cxExportGraphicClass) then
begin
Result := cxExportGraphicClass.Create;
try
try
Result.Assign(AGraphic);
except
Result.Free;
Result := AGraphic;
end;
finally
if Result <> AGraphic then
AGraphic.Free;
end;
end;
end;
function SupportGraphic(AGraphic: TGraphic): Boolean;
begin
Result := SupportGraphic(TGraphicClass(AGraphic.ClassType));
end;
function SupportGraphic(AGraphicClass: TGraphicClass): Boolean;
begin
Result := (AGraphicClass <> nil) and
(AGraphicClass.InheritsFrom(TBitmap) or
AGraphicClass.InheritsFrom(TMetaFile));
end;
procedure GetGraphicAsText(const AFileName: string;
var AGraphic: TGraphic; var AGraphicText: string);
var
L: Integer;
AName: string;
AMemStream: TMemoryStream;
begin
AGraphic := PrepareGraphic(AGraphic);
AName := GetGraphicFileName(AFileName,
GraphicExtension(TGraphicClass(AGraphic.ClassType)));
AMemStream := TMemoryStream.Create;
try
AGraphic.SaveToStream(AMemStream);
L := Length(AName);
SetLength(AGraphicText, AMemStream.Size + L + SizeOf(L));
Move(L, AGraphicText[1], SizeOf(L));
Move(AName[1], AGraphicText[1 + SizeOf(L)], L);
Move(AMemStream.Memory^, AGraphicText[1 + SizeOf(L) + L], AMemStream.Size);
finally
AMemStream.Free;
end;
end;
procedure GetTextAsGraphicStream(const AText: string; var AFileName, AStream: string);
var
L: Integer;
begin
Move(AText[1], L, SizeOf(L));
SetLength(AFileName, L);
Move(AText[1 + SizeOf(L)], AFileName[1], L);
SetLength(AStream, Length(AText) - SizeOf(L) - L);
Move(AText[1 + SizeOf(L) + L], AStream[1], Length(AStream));
end;
{$IFNDEF DELPHI5}
procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free;
end;
function Supports(Instance: TObject; const Intf: TGUID; out Inst): Boolean;
begin
Result := (Instance <> nil) and Instance.GetInterface(Intf, Inst);
end;
{$ENDIF}
{ TcxExport }
class function TcxExport.Provider(AExportType: Integer;
const AFileName: string): TcxCustomExportProvider;
begin
Result := GetExportClassByType(AExportType).Create(AFileName);
end;
class procedure TcxExport.SupportExportTypes(
EnumSupportTypes: TcxEnumExportTypes);
var
I: Integer;
begin
for I := 0 to Length(RegisteredClasses) - 1 do
begin
with RegisteredClasses[I] do
EnumSupportTypes(ExportType, ExportName);
end;
end;
class procedure TcxExport.SupportTypes(EnumFunc: TcxEnumTypes);
var
I: Integer;
begin
for I := 0 to Length(RegisteredClasses) - 1 do
EnumFunc(RegisteredClasses[I].ExportType);
end;
class function TcxExport.RegisterProviderClass(AProviderClass: TcxExportProviderClass): Boolean;
var
I: Integer;
begin
Result := False;
if AProviderClass = nil then
Exit;
for I := 0 to Length(RegisteredClasses) - 1 do
begin
if (AProviderClass.ExportType = RegisteredClasses[I].ExportType) or
(AProviderClass = RegisteredClasses[I]) then Exit;
end;
I := Length(RegisteredClasses);
SetLength(RegisteredClasses, I + 1);
RegisteredClasses[I] := AProviderClass;
Result := True;
end;
class function TcxExport.GetExportClassByType(
AExportType: Integer): TcxExportProviderClass;
var
I: Integer;
begin
for I := 0 to Length(RegisteredClasses) - 1 do
begin
if RegisteredClasses[I].ExportType = AExportType then
begin
Result := RegisteredClasses[I];
Exit;
end;
end;
raise EcxExportData.CreateFmt(cxGetResString(@scxUnsupportedExport), [AExportType]);
end;
{ TcxCustomExportProvider }
constructor TcxCustomExportProvider.Create(const AFileName: string);
begin
FFileName := cxValidateFileName(AFileName);
end;
procedure TcxCustomExportProvider.BeforeDestruction;
begin
Clear;
end;
class function TcxCustomExportProvider.ExportType: Integer;
begin
Result := -1;
end;
class function TcxCustomExportProvider.ExportName: string;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?