git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.DevExpressVCL@38 05c56307-c608-d34a-929d-697000501d7a
247 lines
7.6 KiB
ObjectPascal
247 lines
7.6 KiB
ObjectPascal
{*******************************************************************}
|
|
{ }
|
|
{ ExpressWeb Framework by Developer Express }
|
|
{ Data common functions }
|
|
{ }
|
|
{ Copyright (c) 2000-2009 Developer Express Inc. }
|
|
{ ALL RIGHTS RESERVED }
|
|
{ }
|
|
{ The entire contents of this file is protected by U.S. and }
|
|
{ International Copyright Laws. Unauthorized reproduction, }
|
|
{ reverse-engineering, and distribution of all or any portion of }
|
|
{ the code contained in this file is strictly prohibited and may }
|
|
{ result in severe civil and criminal penalties and will be }
|
|
{ prosecuted to the maximum extent possible under the law. }
|
|
{ }
|
|
{ RESTRICTIONS }
|
|
{ }
|
|
{ THIS SOURCE CODE AND ALL RESULTING INTERMEDIATE FILES }
|
|
{ (DCU, OBJ, DLL, ETC.) ARE CONFIDENTIAL AND PROPRIETARY TRADE }
|
|
{ SECRETS OF DEVELOPER EXPRESS INC. THE REGISTERED DEVELOPER IS }
|
|
{ LICENSED TO DISTRIBUTE THE EXPRESSWEB FRAMEWORK AND ALL }
|
|
{ ACCOMPANYING VCL CLASSES AS PART OF AN EXECUTABLE WEB }
|
|
{ APPLICATION ONLY. }
|
|
{ }
|
|
{ THE SOURCE CODE CONTAINED WITHIN THIS FILE AND ALL RELATED }
|
|
{ FILES OR ANY PORTION OF ITS CONTENTS SHALL AT NO TIME BE }
|
|
{ COPIED, TRANSFERRED, SOLD, DISTRIBUTED, OR OTHERWISE MADE }
|
|
{ AVAILABLE TO OTHER INDIVIDUALS WITHOUT EXPRESS WRITTEN CONSENT }
|
|
{ AND PERMISSION FROM DEVELOPER EXPRESS INC. }
|
|
{ }
|
|
{ CONSULT THE END USER LICENSE AGREEMENT FOR INFORMATION ON }
|
|
{ ADDITIONAL RESTRICTIONS. }
|
|
{ }
|
|
{*******************************************************************}
|
|
unit cxWebDataUtils;
|
|
|
|
{$I cxVer.inc}
|
|
|
|
interface
|
|
|
|
uses Classes, Variants,
|
|
{$IFDEF VCL}
|
|
Graphics, Jpeg,
|
|
{$ENDIF}
|
|
SysUtils;
|
|
|
|
procedure LoadPicture(AStream: TStream; {$IFDEF VCL}GraphicClass: TGraphicClass;{$ENDIF}
|
|
const Value: Variant; var AHeight, AWidth: Integer);
|
|
procedure LoadImage(Value: Variant; {$IFDEF VCL}GraphicClass: TGraphicClass;{$ENDIF}
|
|
var URL: string; var AHeight, AWidth: Integer);
|
|
function HTMLString(S: string): string;
|
|
function HTMLValue(Value: Variant): string;
|
|
function ScriptString(S: string): string;
|
|
function ScriptValue(Value: Variant): string;
|
|
|
|
implementation
|
|
|
|
uses
|
|
cxWebFileCacheManager;
|
|
|
|
|
|
type
|
|
TMemoryStreamReadOnly = class(TCustomMemoryStream)
|
|
public
|
|
procedure SetBuffer(const Buffer; Count: Longint);
|
|
function Write(const Buffer; Count: Longint): Longint; override;
|
|
end;
|
|
|
|
procedure TMemoryStreamReadOnly.SetBuffer(const Buffer; Count: Longint);
|
|
begin
|
|
SetPointer(@Buffer, Count);
|
|
end;
|
|
|
|
function TMemoryStreamReadOnly.Write(const Buffer; Count: Longint): Longint;
|
|
begin
|
|
Result := 0;
|
|
end;
|
|
|
|
|
|
{$IFDEF VCL}
|
|
type
|
|
TDummyGraphic = class(TGraphic);
|
|
TDummyGraphicClass = class of TDummyGraphic;
|
|
|
|
function IsPictureEmpty(APicture: TPicture): Boolean;
|
|
begin
|
|
Result := not Assigned(APicture.Graphic) or APicture.Graphic.Empty;
|
|
end;
|
|
{$ENDIF}
|
|
|
|
procedure LoadPicture(AStream: TStream; {$IFDEF VCL}GraphicClass: TGraphicClass;{$ENDIF} const Value: Variant;
|
|
var AHeight, AWidth: Integer);
|
|
{ Paradox graphic BLOB header - see DB.pas}
|
|
type
|
|
TGraphicHeader = record
|
|
Count: Word; { Fixed at 1 }
|
|
HType: Word; { Fixed at $0100 }
|
|
Size: Longint; { Size not including header }
|
|
end;
|
|
var
|
|
Stream: TMemoryStreamReadOnly;
|
|
Size: Longint;
|
|
Header: TGraphicHeader;
|
|
{$IFDEF VCL}
|
|
Graphic: TGraphic;
|
|
Jpeg: TJPEGImage;
|
|
{$ENDIF}
|
|
begin
|
|
if VarType(Value) = varString then // Field.Value -> stored as string
|
|
begin
|
|
Stream := TMemoryStreamReadOnly.Create;
|
|
try
|
|
Size := Length(Value);
|
|
if Size >= SizeOf(TGraphicHeader) then
|
|
begin
|
|
Stream.SetBuffer(string(Value)[1], Size);
|
|
Stream.Position := 0;
|
|
Stream.Read(Header, SizeOf(Header));
|
|
if (Header.Count <> 1) or (Header.HType <> $0100) or
|
|
(Header.Size <> Size - SizeOf(Header)) then
|
|
Stream.Position := 0;
|
|
end;
|
|
if Stream.Size > 0 then
|
|
begin
|
|
{$IFDEF VCL}
|
|
if GraphicClass = nil then
|
|
Graphic := TBitmap.Create
|
|
else Graphic := TDummyGraphicClass(GraphicClass).Create;
|
|
try
|
|
Graphic.LoadFromStream(Stream);
|
|
Jpeg := TJPEGImage.Create;
|
|
try
|
|
with Jpeg do
|
|
begin
|
|
Assign(Graphic);
|
|
SaveToStream(AStream);
|
|
AHeight := Height;
|
|
AWidth := Width;
|
|
end;
|
|
finally
|
|
Jpeg.Free;
|
|
end;
|
|
finally
|
|
Graphic.Free;
|
|
end;
|
|
{$ELSE}
|
|
Stream.SaveToStream(AStream);
|
|
{$ENDIF}
|
|
end;
|
|
finally
|
|
Stream.Free;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
{
|
|
procedure SavePicture(APicture: TPicture; var AValue: string);
|
|
var
|
|
AStream: TMemoryStream;
|
|
begin
|
|
if not Assigned(APicture) or IsPictureEmpty(APicture) then
|
|
AValue := ''
|
|
else
|
|
begin
|
|
AStream := TMemoryStream.Create;
|
|
try
|
|
APicture.Graphic.SaveToStream(AStream);
|
|
AStream.Position := 0;
|
|
SetLength(AValue, AStream.Size);
|
|
AStream.ReadBuffer(AValue[1], AStream.Size);
|
|
finally
|
|
AStream.Free;
|
|
end;
|
|
end;
|
|
end;
|
|
}
|
|
procedure LoadImage(Value: Variant; {$IFDEF VCL}GraphicClass: TGraphicClass;{$ENDIF}
|
|
var URL: string; var AHeight, AWidth: Integer);
|
|
var
|
|
AStream: TStream;
|
|
begin
|
|
AStream := TMemoryStream.Create;
|
|
try
|
|
if not VarIsType(Value, [varEmpty, VarNull]) then
|
|
begin
|
|
try
|
|
LoadPicture(AStream, {$IFDEF VCL}GraphicClass,{$ENDIF} Value, AHeight, AWidth);
|
|
URL := TcxWebFileCacheManager.Instance.Add('', AStream);
|
|
except
|
|
URL := '';
|
|
raise;
|
|
end;
|
|
end;
|
|
finally
|
|
AStream.Free;
|
|
end;
|
|
end;
|
|
|
|
function HTMLString(S: string): string;
|
|
begin
|
|
Result := S;
|
|
end;
|
|
|
|
function HTMLValue(Value: Variant): string;
|
|
begin
|
|
if not VarIsType(Value, [varNull, varEmpty, varUnknown, varDispatch, varAny]) then
|
|
begin
|
|
try
|
|
Result := VarToStr(Value);
|
|
Result := HTMLString(Result);
|
|
except
|
|
Result := '';
|
|
end;
|
|
end
|
|
else Result := '';
|
|
end;
|
|
|
|
function ScriptString(S: string): string;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := S;
|
|
Result := StringReplace(Result, '\', '\\', [rfReplaceAll, rfIgnoreCase]);
|
|
Result := StringReplace(Result, '"', '\"', [rfReplaceAll, rfIgnoreCase]);
|
|
Result := StringReplace(Result, '''', '\''', [rfReplaceAll, rfIgnoreCase]);
|
|
for I := 0 to 31 do
|
|
Result := StringReplace(Result, Char(I), '\x' + IntToHex(I, 2), [rfReplaceAll, rfIgnoreCase]);
|
|
end;
|
|
|
|
function ScriptValue(Value: Variant): string;
|
|
begin
|
|
if not VarIsType(Value, [varNull, varEmpty, varUnknown, varDispatch, varAny]) then
|
|
begin
|
|
try
|
|
Result := VarToStr(Value);
|
|
Result := ScriptString(Result);
|
|
except
|
|
Result := '';
|
|
end;
|
|
end
|
|
else Result := '';
|
|
end;
|
|
|
|
end.
|
|
|
|
|