Componentes.Terceros.DevExp.../internal/x.46/2/ExpressPrinting System/Sources/dxPScxEditorProducers.pas

1301 lines
44 KiB
ObjectPascal

{*******************************************************************}
{ }
{ Developer Express Visual Component Library }
{ ExpressPrinting System(tm) COMPONENT SUITE }
{ }
{ Copyright (C) 1998-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 EXPRESSPRINTINGSYSTEM AND }
{ ALL ACCOMPANYING VCL CONTROLS AS PART OF AN }
{ EXECUTABLE PROGRAM 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 dxPScxEditorProducers;
interface
{$I cxVer.inc}
uses
Windows, Classes, Controls, Graphics, cxLookAndFeels, cxGraphics, cxControls,
cxContainer, cxEdit, cxMemo, cxTextEdit, cxCheckBox, cxRadioGroup, cxBlobEdit,
cxHyperLinkEdit, cxCurrencyEdit, cxGroupBox, cxDropDownEdit, cxImageComboBox,
cxImage, dxThemeManager, dxPSGlbl, dxPScxCommon, dxPSContainerLnk, dxPSCore,
cxLookAndFeelPainters, cxDrawTextUtils;
type
TdxPScxControlProducer = class(TdxPSContainerCustomWinControlProducer)
protected
function CanProcessChild(AChildControl: TControl): Boolean; override;
public
function Control: TcxControl; reintroduce; overload;
class function ControlClass: TControlClass; override;
end;
TdxPScxContainerProducer = class(TdxPSContainerCustomWinControlProducer) //TdxPSContainerWinControlProducer)
private
function GetIsNativeStyle: Boolean;
function GetStyle: {$IFDEF DXVER500} TcxCustomContainerStyle {$ELSE} TcxContainerStyle {$ENDIF};
protected
function GetBorderClass: TdxPSCellBorderClass; virtual;
function GetBorderColor: TColor; virtual;
function GetContentColor: TColor; override;
function GetFont: TFont; override;
function GetFontColor: TColor; override;
function GetFontStyle: TFontStyles; override;
function GetThemedBorderColor: TColor; virtual;
function CanProcessChild(AChildControl: TControl): Boolean; override;
function CanUseNativeStyle(AThemedObjectType: TdxThemedObjectType): Boolean; virtual;
function ObjectExpandHeight: Boolean; override;
property BorderClass: TdxPSCellBorderClass read GetBorderClass;
property BorderColor: TColor read GetBorderColor;
property IsNativeStyle: Boolean read GetIsNativeStyle;
property ThemedBorderColor: TColor read GetThemedBorderColor;
public
function Control: TcxContainer; reintroduce; overload;
class function ControlClass: TControlClass; override;
class function HasNativeSupportForBorders: Boolean; override;
property Style: {$IFDEF DXVER500} TcxCustomContainerStyle {$ELSE} TcxContainerStyle {$ENDIF} read GetStyle;
end;
TdxPScxNativePrintableControlProducer = class(TdxPSNativePrintableControlProducer)
private
function GetBorderColor: TColor;
protected
function GetContentColor: TColor; override;
function GetFont: TFont; override;
procedure InitializeNativePrintableControlHost(AnItem: TdxReportVisualItem); override;
property BorderColor: TColor read GetBorderColor;
public
function Control: TcxContainer; reintroduce; overload;
class function ControlClass: TControlClass; override;
function Style: TcxContainerStyle; overload; virtual;
class function HasNativeSupportForBorders: Boolean; override;
end;
TdxPScxCustomEditProducer = class(TdxPScxContainerProducer)
protected
function GetControlBoundsRect: TRect; override;
procedure InitializeItem(AnItem: TdxReportVisualItem); override;
function ObjectShrinkHeight: Boolean; override;
public
function Control: TcxCustomEdit; reintroduce; overload;
class function ControlClass: TControlClass; override;
function Properties: TcxCustomEditProperties; virtual;
property FontColor: TColor read GetFontColor;
end;
TdxPScxCustomTextEditProducer = class(TdxPScxCustomEditProducer)
protected
function GetDisplayText: string; virtual;
procedure InitializeItem(AnItem: TdxReportVisualItem); override;
function ItemClass: TdxReportVisualItemClass; override;
public
function Control: TcxCustomTextEdit; reintroduce; overload;
class function ControlClass: TControlClass; override;
function Properties: TcxCustomTextEditProperties; reintroduce; overload;
end;
TdxPScxCustomMemoEditProducer = class(TdxPScxCustomTextEditProducer)
protected
function ObjectExpandHeight: Boolean; override;
procedure InitializeItem(AnItem: TdxReportVisualItem); override;
public
function Control: TcxCustomMemo; reintroduce; overload;
class function ControlClass: TControlClass; override;
function ProducingObjectFriendlyName: string; override;
function Properties: TcxCustomMemoProperties; reintroduce; overload;
end;
TcxPScxCustomHyperLinkEditProducer = class(TdxPScxCustomTextEditProducer)
protected
function GetFontColor: TColor; override;
function GetFontStyle: TFontStyles; override;
public
function Control: TcxCustomHyperLinkEdit; reintroduce; overload;
class function ControlClass: TControlClass; override;
function Properties: TcxCustomHyperLinkEditProperties; reintroduce; overload;
end;
TcxPScxCustomCurrencyEditProducer = class(TdxPScxCustomTextEditProducer)
protected
function GetDisplayText: string; override;
public
function Control: TcxCustomCurrencyEdit; reintroduce; overload;
class function ControlClass: TControlClass; override;
function Properties: TcxCustomCurrencyEditProperties; reintroduce; overload;
end;
TdxPScxCustomComboBoxProducer = class(TdxPScxCustomTextEditProducer)
public
function Control: TcxCustomComboBox; reintroduce; overload;
class function ControlClass: TControlClass; override;
function Properties: TcxCustomComboBoxProperties; reintroduce; overload;
end;
TdxPScxCustomImageComboBoxProducer = class(TdxPScxCustomComboBoxProducer)
protected
procedure GetImageLists(AProc: TdxPSGetImageListProc); override;
procedure InitializeItem(AnItem: TdxReportVisualItem); override;
function ItemClass: TdxReportVisualItemClass; override;
public
function Control: TcxCustomImageComboBox; reintroduce; overload;
class function ControlClass: TControlClass; override;
function Properties: TcxCustomImageComboBoxProperties; reintroduce; overload;
end;
TdxPScxCustomCheckBoxProducer = class(TdxPScxCustomEditProducer)
protected
procedure InitializeItem(AnItem: TdxReportVisualItem); override;
function ItemClass: TdxReportVisualItemClass; override;
public
function Control: TcxCustomCheckBox; reintroduce; overload;
class function ControlClass: TControlClass; override;
function Properties: TcxCustomCheckBoxProperties; reintroduce; overload;
end;
TdxPScxRadioButtonProducer = class(TdxPSRadioButtonProducer)
protected
procedure InitializeItem(AnItem: TdxReportVisualItem); override;
function ItemClass: TdxReportVisualItemClass; override;
public
function Control: TcxRadioButton; reintroduce; overload;
class function ControlClass: TControlClass; override;
end;
TdxPScxCustomBlobEditProducer = class(TdxPSCustomDelegateProducer)
protected
function CanProcessChild(AChildControl: TControl): Boolean; override;
function Producer: TdxPSCustomContainerItemProducer; override;
public
function Control: TcxCustomBlobEdit; reintroduce; overload;
class function ControlClass: TControlClass; override;
end;
TdxPScxDefaultBlobEditProducer = class(TdxPScxCustomTextEditProducer)
protected
procedure InitializeItem(AnItem: TdxReportVisualItem); override;
public
function Control: TcxCustomBlobEdit; reintroduce; overload;
end;
TdxPScxPictureBlobProducer = class(TdxPScxCustomEditProducer)
protected
procedure GetImageLists(AProc: TdxPSGetImageListProc); override;
procedure InitializeItem(AnItem: TdxReportVisualItem); override;
function ItemClass: TdxReportVisualItemClass; override;
public
function Control: TcxCustomBlobEdit; reintroduce; overload;
end;
TdxPScxTextBlobEditProducer = class(TdxPScxCustomTextEditProducer)
protected
procedure InitializeItem(AnItem: TdxReportVisualItem); override;
public
function Control: TcxCustomBlobEdit; reintroduce; overload;
end;
TdxPScxCustomImageEditProducer = class(TdxPScxCustomEditProducer)
protected
function GetHasImage: Boolean; virtual;
procedure InitializeItem(AnItem: TdxReportVisualItem); override;
procedure InitializeItemAsImage(AnItem: TdxReportCellGraphic); virtual;
procedure InitializeItemAsText(AnItem: TdxReportCellString); virtual;
function ItemClass: TdxReportVisualItemClass; override;
function ObjectShrinkHeight: Boolean; override;
function ObjectExpandHeight: Boolean; override;
public
function Control: TcxCustomImage; reintroduce; overload;
class function ControlClass: TControlClass; override;
function Properties: TcxCustomImageProperties; reintroduce; overload;
property HasImage: Boolean read GetHasImage;
end;
TdxPScxCustomGroupBoxProducer = class(TdxPScxCustomEditProducer)
protected
function CanProcessChild(AChildControl: TControl): Boolean; override;
procedure InitializeItem(AnItem: TdxReportVisualItem); override;
procedure InitializeItemLookAndFeel(AnItem: TdxReportVisualItem; ALookAndFeel: TdxPSReportGroupLookAndFeel); virtual;
function ItemClass: TdxReportVisualItemClass; override;
function LookAndFeelClass: TdxPSReportGroupLookAndFeelClass; virtual;
public
class function CanHasAvailableChildren: Boolean; override;
function Control: TcxCustomGroupBox; reintroduce; overload;
class function ControlClass: TControlClass; override;
function Properties: TcxCustomGroupBoxProperties; reintroduce; overload;
end;
TdxPScxCustomButtonGroupProducer = class(TdxPScxCustomGroupBoxProducer)
protected
procedure CreateItems(AButtonGroup: TdxCustomReportButtonGroup); virtual;
procedure InitializeButton(AGroup: TdxCustomReportButtonGroup;
AButton: TdxCustomReportCellCheck; AnIndex: Integer); virtual;
procedure InitializeItem(AnItem: TdxReportVisualItem); override;
procedure InitializeItemLookAndFeel(AnItem: TdxReportVisualItem; ALookAndFeel: TdxPSReportGroupLookAndFeel); override;
function ItemClass: TdxReportVisualItemClass; override;
public
function Control: TcxCustomButtonGroup; reintroduce; overload;
class function ControlClass: TControlClass; override;
function Properties: TcxCustomButtonGroupProperties; reintroduce; overload;
end;
TdxPScxCustomRadioGroupProducer = class(TdxPScxCustomButtonGroupProducer)
protected
function CanProcessChild(AChildControl: TControl): Boolean; override;
procedure InitializeButton(AGroup: TdxCustomReportButtonGroup;
AButton: TdxCustomReportCellCheck; AnIndex: Integer); override;
procedure InitializeItem(AnItem: TdxReportVisualItem); override;
function ItemClass: TdxReportVisualItemClass; override;
public
function Control: TcxCustomRadioGroup; reintroduce; overload;
class function ControlClass: TControlClass; override;
function Properties: TcxRadioGroupProperties; reintroduce; overload;
end;
{ Utilities }
function cxBordersMap(ABorders: TcxBorders): TdxCellSides;
const
CheckBorderStyleMap: array[TcxContainerBorderStyle] of TdxCheckButtonEdgeStyle =
(cbesNone, {cbesUltraFlat}cbesSingle, cbesBoldFlat, cbesSoft3D, cbes3D, cbesUltraFlat
{$IFDEF DXVER500}, cbesUltraFlat {$ENDIF});
CheckPosMap: array[TAlignment] of TdxCellCheckPos = (ccpLeft, ccpRight, ccpCenter);
ContainerBorderStyleMap: array[TcxContainerBorderStyle] of TdxPSCellBorderClass =
(TdxPSCellNullBorder, TdxPSCellUltraFlatBorder, TdxPSCellBoldFlatBorder,
TdxPSCellSunkenSoftBorder, TdxPSCellSunkenBorder, TdxPSCellUltraFlatBorder
{$IFDEF DXVER500}, TdxPSCellUltraFlatBorder {$ENDIF});
EditBorderStyleMap: array[TcxEditBorderStyle] of TdxPSCellBorderClass =
(TdxPSCellNullBorder, TdxPSCellUltraFlatBorder, TdxPSCellBoldFlatBorder,
TdxPSCellSunkenSoftBorder, TdxPSCellSunkenBorder, TdxPSCellUltraFlatBorder
{$IFDEF DXVER500}, TdxPSCellSunkenSoftBorder{$ENDIF});
RadioLookAndFeelKindMap: array[TcxLookAndFeelKind] of TdxCheckButtonEdgeStyle =
(cbesSoft3D, cbes3D, cbesUltraFlat{$IFDEF DXVER500}, cbesUltraFlat {$ENDIF});
RadioBorderStyleMap: array[TcxContainerBorderStyle] of TdxCheckButtonEdgeStyle =
(cbesNone, cbesUltraFlat, cbesBoldFlat, cbesSoft3D, cbes3D, cbesUltraFlat
{$IFDEF DXVER500}, cbesUltraFlat {$ENDIF});
GroupBoxCaptionAlignmentMap: array[TcxCaptionAlignment] of TcxTextAlignX =
(taLeft, taCenterX, taRight, taLeft, taLeft, taLeft, taLeft, taLeft, taLeft, taLeft, taLeft, taLeft, taLeft);
implementation
uses
{$IFDEF DELPHI6}
Variants,
{$ELSE}
cxClasses,
{$ENDIF}
SysUtils, dxThemeConsts, dxUxTheme, cxVariants, dxPSUtl, dxPScxEditorLnks,
dxPScxListBoxLnk;
{$IFNDEF DXVER500}
type
TcxContainerAccess = class(TcxContainer);
TcxCustomCheckBoxAccess = class(TcxCustomCheckBox);
TcxCustomCurrencyEditAccess = class(TcxCustomCurrencyEdit);
TcxCustomGroupBoxAccess = class(TcxCustomGroupBox);
TcxCustomImageComboBoxAccess = class(TcxCustomImageComboBox);
{$ENDIF}
var
FPicture: TPicture;
function Picture: TPicture;
begin
if FPicture = nil then FPicture := TPicture.Create;
Result := FPicture;
end;
{ Helpers }
function cxCheckBox_GetState(AControl: TcxCustomEdit): TcxCheckBoxState;
begin
{$IFDEF DXVER500}
Result := TcxCustomCheckBox(AControl).State;
{$ELSE}
Result := TcxCustomCheckBoxAccess(AControl).State;
{$ENDIF}
end;
function cxCurrencyEdit_GetValue(AControl: TcxCustomEdit): Double;
begin
{$IFDEF DXVER500}
Result := TcxCustomCurrencyEdit(AControl).Value;
{$ELSE}
Result := TcxCustomCurrencyEditAccess(AControl).Value;
{$ENDIF}
end;
function cxGroupBox_GetAlignment(AControl: TcxCustomEdit): TcxCaptionAlignment;
begin
{$IFDEF DXVER500}
Result := TcxCustomGroupBox(AControl).Alignment;
{$ELSE}
Result := TcxCustomGroupBoxAccess(AControl).Alignment;
{$ENDIF}
end;
function cxImageComboBox_GetItemIndex(AControl: TcxCustomEdit): Integer;
begin
{$IFDEF DXVER500}
Result := TcxCustomImageComboBox(AControl).ItemIndex;
{$ELSE}
Result := TcxCustomImageComboBoxAccess(AControl).ItemIndex;
{$ENDIF}
end;
{ Utilities}
function cxBordersMap(ABorders: TcxBorders): TdxCellSides;
begin
Result := [];
if bLeft in ABorders then Include(Result, csLeft);
if bTop in ABorders then Include(Result, csTop);
if bRight in ABorders then Include(Result, csRight);
if bBottom in ABorders then Include(Result, csBottom);
end;
{ TdxPScxControlProducer }
function TdxPScxControlProducer.Control: TcxControl;
begin
Result := inherited Control as TcxControl;
end;
class function TdxPScxControlProducer.ControlClass: TControlClass;
begin
Result := TcxControl;
end;
function TdxPScxControlProducer.CanProcessChild(AChildControl: TControl): Boolean;
begin
Result := inherited CanProcessChild(AChildControl) and
(AChildControl <> cxControl_GetHScrollBar(Control)) and
(AChildControl <> cxControl_GetVScrollBar(Control)) and
(AChildControl <> cxControl_GetSizeGrip(Control));
end;
{ TdxPScxContainerProducer }
function TdxPScxContainerProducer.Control: TcxContainer;
begin
Result := inherited Control as TcxContainer;
end;
class function TdxPScxContainerProducer.ControlClass: TControlClass;
begin
Result := TcxContainer;
end;
class function TdxPScxContainerProducer.HasNativeSupportForBorders: Boolean;
begin
Result := True;
end;
function TdxPScxContainerProducer.GetBorderClass: TdxPSCellBorderClass;
begin
if CanUseNativeStyle(totEdit) then
Result := TdxPSCellUltraFlatBorder
else
Result := ContainerBorderStyleMap[Style.BorderStyle];
end;
function TdxPScxContainerProducer.GetBorderColor: TColor;
begin
if CanUseNativeStyle(totEdit) then
Result := ThemedBorderColor
else
if Style.BorderStyle in [cbsSingle, cbsThick] then
Result := Style.BorderColor
else
Result := dxPSCore.dxDefaultGridLineColor;
end;
function TdxPScxContainerProducer.GetContentColor: TColor;
begin
{$IFDEF DXVER500}
Result := Style.Color;
{$ELSE}
if Control.Enabled then
Result := Style.Color
else
Result := inherited GetContentColor;
{$ENDIF}
end;
function TdxPScxContainerProducer.GetFont: TFont;
begin
Result := Style.Font;
end;
function TdxPScxContainerProducer.GetFontColor: TColor;
begin
{$IFDEF DXVER500}
Result := Style.TextColor;
{$ELSE}
Result := inherited GetFontColor;
{$ENDIF}
end;
function TdxPScxContainerProducer.GetFontStyle: TFontStyles;
begin
{$IFDEF DXVER500}
Result := Style.TextStyle;
{$ELSE}
Result := inherited GetFontStyle;
{$ENDIF}
end;
function TdxPScxContainerProducer.GetThemedBorderColor: TColor;
var
Theme: TdxTheme;
C: COLORREF;
begin
Theme := dxThemeManager.OpenTheme(totEdit);
if Succeeded(dxUxTheme.GetThemeColor(Theme, 0, 0, TMT_BORDERCOLOR, C)) then
Result := C
else
Result := dxPSCore.dxDefaultGridLineColor;
end;
function TdxPScxContainerProducer.CanProcessChild(AChildControl: TControl): Boolean;
begin
Result := inherited CanProcessChild(AChildControl) and
not {$IFNDEF DELPHI6}cxClasses.{$ENDIF}Supports(AChildControl, IcxContainerInnerControl);
end;
function TdxPScxContainerProducer.CanUseNativeStyle(AThemedObjectType: TdxThemedObjectType): Boolean;
begin
Result := IsNativeStyle and
{$IFDEF DXVER500}
dxThemeManager.AreVisualStylesAvailable(AThemedObjectType);
{$ELSE}
dxThemeManager.AreVisualStylesAvailable([AThemedObjectType]);
{$ENDIF}
end;
function TdxPScxContainerProducer.ObjectExpandHeight: Boolean;
begin
Result := True;
end;
function TdxPScxContainerProducer.GetIsNativeStyle: Boolean;
begin
Result := Style.LookAndFeel.NativeStyle;
end;
function TdxPScxContainerProducer.GetStyle: {$IFDEF DXVER500} TcxCustomContainerStyle {$ELSE} TcxContainerStyle {$ENDIF};
begin
{$IFDEF DXVER500}
if Control.Enabled then
Result := Control.Styles[csNormal]
else
Result := Control.Styles[csDisabled]
{$ELSE}
Result := TcxContainerAccess(Control).Style;
{$ENDIF}
end;
{ TdxPScxNativePrintableControlProducer }
function TdxPScxNativePrintableControlProducer.Control: TcxContainer;
begin
Result := inherited Control as TcxContainer;
end;
class function TdxPScxNativePrintableControlProducer.ControlClass: TControlClass;
begin
Result := TcxContainer;
end;
function TdxPScxNativePrintableControlProducer.Style: TcxContainerStyle;
begin
{$IFDEF DXVER500}
Result := Control.Styles[csNormal];
{$ELSE}
Result := TcxContainerAccess(Control).Style;
{$ENDIF}
end;
class function TdxPScxNativePrintableControlProducer.HasNativeSupportForBorders: Boolean;
begin
Result := True;
end;
function TdxPScxNativePrintableControlProducer.GetContentColor: TColor;
begin
Result := Style.Color;
end;
function TdxPScxNativePrintableControlProducer.GetFont: TFont;
begin
Result := Style.Font;
end;
procedure TdxPScxNativePrintableControlProducer.InitializeNativePrintableControlHost(AnItem: TdxReportVisualItem);
begin
with AnItem do
begin
BorderClass := ContainerBorderStyleMap[Style.BorderStyle];
BorderColor := Style.BorderColor;
CellSides := cxBordersMap(Style.Edges);
ShowShadow := Style.Shadow;
end;
inherited;
end;
function TdxPScxNativePrintableControlProducer.GetBorderColor: TColor;
begin
if Style.BorderStyle in [cbsSingle, cbsThick] then
Result := Style.BorderColor
else
Result := clWindowText;
end;
{ TdxPScxCustomEditProducer }
function TdxPScxCustomEditProducer.Control: TcxCustomEdit;
begin
Result := inherited Control as TcxCustomEdit;
end;
class function TdxPScxCustomEditProducer.ControlClass: TControlClass;
begin
Result := TcxCustomEdit;
end;
function TdxPScxCustomEditProducer.Properties: TcxCustomEditProperties;
begin
Result := cxEdit_GetProperties(Control);
end;
function TdxPScxCustomEditProducer.GetControlBoundsRect: TRect;
const
ShadowDepth: Integer = 3; // Actually should be borrowed from AnItem.ShadowDepth
begin
Result := inherited GetControlBoundsRect;
if Style.Shadow then
with Result do
begin
Dec(Right, ShadowDepth);
Dec(Bottom, ShadowDepth);
end;
end;
procedure TdxPScxCustomEditProducer.InitializeItem(AnItem: TdxReportVisualItem);
begin
inherited;
AnItem.BorderClass := BorderClass;
AnItem.BorderColor := BorderColor;
AnItem.CellSides := cxBordersMap(Style.Edges);
AnItem.ShowShadow := Style.Shadow;
end;
function TdxPScxCustomEditProducer.ObjectShrinkHeight: Boolean;
begin
Result := False;//True;
end;
{ TdxPScxCustomTextEditProducer }
function TdxPScxCustomTextEditProducer.Control: TcxCustomTextEdit;
begin
Result := inherited Control as TcxCustomTextEdit;
end;
class function TdxPScxCustomTextEditProducer.ControlClass: TControlClass;
begin
Result := TcxCustomTextEdit;
end;
function TdxPScxCustomTextEditProducer.Properties: TcxCustomTextEditProperties;
begin
Result := inherited Properties as TcxCustomTextEditProperties;
end;
function TdxPScxCustomTextEditProducer.GetDisplayText: string;
begin
Result := Properties.GetDisplayText(Control.EditValue, False, False);
end;
procedure TdxPScxCustomTextEditProducer.InitializeItem(AnItem: TdxReportVisualItem);
var
EditAlignment: TcxEditAlignment;
begin
inherited;
TdxReportCellString(AnItem).Text := GetDisplayText;
EditAlignment := cxEditProperties_GetAlignment(Properties);
TdxReportCellString(AnItem).TextAlignX := EditTextAlignXMap[EditAlignment.Horz];
TdxReportCellString(AnItem).TextAlignY := EditTextAlignYMap[EditAlignment.Vert];
end;
function TdxPScxCustomTextEditProducer.ItemClass: TdxReportVisualItemClass;
begin
Result := TdxReportCellString;
end;
{ TdxPScxCustomMemoEditProducer }
function TdxPScxCustomMemoEditProducer.Control: TcxCustomMemo;
begin
Result := inherited Control as TcxCustomMemo;
end;
class function TdxPScxCustomMemoEditProducer.ControlClass: TControlClass;
begin
Result := TcxCustomMemo;
end;
function TdxPScxCustomMemoEditProducer.ProducingObjectFriendlyName: string;
begin
Result := '';
if not IsDesigning and (Control.Lines.Count <> 0) then
begin
Result := Control.Lines[0];
if Length(Result) > MaxCaptionLength then
begin
Delete(Result, MaxCaptionLength, Length(Result) - MaxCaptionLength);
Result := Result + '...';
end;
end;
if Result = '' then
Result := inherited ProducingObjectFriendlyName;
end;
function TdxPScxCustomMemoEditProducer.Properties: TcxCustomMemoProperties;
begin
Result := inherited Properties as TcxCustomMemoProperties;
end;
function TdxPScxCustomMemoEditProducer.ObjectExpandHeight: Boolean;
begin
Result := False;
end;
procedure TdxPScxCustomMemoEditProducer.InitializeItem(AnItem: TdxReportVisualItem);
begin
inherited;
TdxReportCellString(AnItem).MultiLine := True;
TdxReportCellString(AnItem).Text := Control.Text;
TdxReportCellString(AnItem).TextAlignX := TextAlignXMap[cxMemoProperties_GetAlignment(Properties)];
TdxReportCellString(AnItem).TextAlignY := taTop;
end;
{ TcxPScxCustomHyperLinkEditProducer }
function TcxPScxCustomHyperLinkEditProducer.Control: TcxCustomHyperLinkEdit;
begin
Result := inherited Control as TcxCustomHyperLinkEdit;
end;
class function TcxPScxCustomHyperLinkEditProducer.ControlClass: TControlClass;
begin
Result := TcxCustomHyperLinkEdit;
end;
function TcxPScxCustomHyperLinkEditProducer.Properties: TcxCustomHyperLinkEditProperties;
begin
Result := inherited Properties as TcxCustomHyperLinkEditProperties;
end;
function TcxPScxCustomHyperLinkEditProducer.GetFontColor: TColor;
begin
Result := cxHyperLinkEditProperties_GetLinkColor(Properties);
end;
function TcxPScxCustomHyperLinkEditProducer.GetFontStyle: TFontStyles;
begin
Result := inherited GetFontStyle + [fsUnderline];
end;
{ TcxPScxCustomCurrencyEditProducer }
function TcxPScxCustomCurrencyEditProducer.Control: TcxCustomCurrencyEdit;
begin
Result := inherited Control as TcxCustomCurrencyEdit;
end;
class function TcxPScxCustomCurrencyEditProducer.ControlClass: TControlClass;
begin
Result := TcxCustomCurrencyEdit;
end;
function TcxPScxCustomCurrencyEditProducer.Properties: TcxCustomCurrencyEditProperties;
begin
Result := inherited Properties as TcxCustomCurrencyEditProperties;
end;
function TcxPScxCustomCurrencyEditProducer.GetDisplayText: string;
begin
try
Result := inherited GetDisplayText;
except
if cxCurrencyEdit_GetValue(Control) = 0 then
Result := cxCurrencyProperties_GetNullString(Properties)
else
Result := '';
end;
end;
{ TdxPScxCustomComboBoxProducer }
function TdxPScxCustomComboBoxProducer.Control: TcxCustomComboBox;
begin
Result := inherited Control as TcxCustomComboBox;
end;
class function TdxPScxCustomComboBoxProducer.ControlClass: TControlClass;
begin
Result := TcxCustomComboBox;
end;
function TdxPScxCustomComboBoxProducer.Properties: TcxCustomComboBoxProperties;
begin
Result := inherited Properties as TcxCustomComboBoxProperties;
end;
{ TdxPScxCustomImageComboBoxProducer }
function TdxPScxCustomImageComboBoxProducer.Control: TcxCustomImageComboBox;
begin
Result := inherited Control as TcxCustomImageComboBox;
end;
class function TdxPScxCustomImageComboBoxProducer.ControlClass: TControlClass;
begin
Result := TcxCustomImageComboBox;
end;
function TdxPScxCustomImageComboBoxProducer.Properties: TcxCustomImageComboBoxProperties;
begin
Result := inherited Properties as TcxCustomImageComboBoxProperties;
end;
procedure TdxPScxCustomImageComboBoxProducer.GetImageLists(AProc: TdxPSGetImageListProc);
begin
inherited;
AProc(cxImageComboBoxProperties_GetImages(Properties));
end;
procedure TdxPScxCustomImageComboBoxProducer.InitializeItem(AnItem: TdxReportVisualItem);
var
ItemIndex: Integer;
ComboItems: TcxImageComboBoxItems;
begin
inherited;
ItemIndex := cxImageComboBox_GetItemIndex(Control);
if ItemIndex <> -1 then
begin
ComboItems := cxImageComboBoxProperties_GetItems(Properties);
TdxReportCellImage(AnItem).ImageIndex := ComboItems[ItemIndex].ImageIndex;
TdxReportCellImage(AnItem).Text := ComboItems[ItemIndex].Description;
end
else
begin
TdxReportCellImage(AnItem).ImageIndex := cxImageComboBoxProperties_GetDefaultImageIndex(Properties);
TdxReportCellImage(AnItem).Text := cxImageComboBoxProperties_GetDefaultDescription(Properties);
end;
TdxReportCellImage(AnItem).ImageLayout := ImageLayoutMap[cxImageComboBoxProperties_GetImageAlignment(Properties)];
TdxReportCellImage(AnItem).ImageList := cxImageComboBoxProperties_GetImages(Properties);
TdxReportCellImage(AnItem).MakeSpaceForEmptyImage := True;
TdxReportCellImage(AnItem).Multiline := cxImageComboBoxProperties_GetIsMultilined(Properties);
if not cxImageComboBoxProperties_GetShowDescription(Properties) then
begin
TdxReportCellImage(AnItem).ImageLayout := ilImageCenterCenter;
TdxReportCellImage(AnItem).Text := '';
end;
end;
function TdxPScxCustomImageComboBoxProducer.ItemClass: TdxReportVisualItemClass;
begin
Result := TdxReportCellImage;
end;
{ TdxPScxCustomCheckBoxProducer }
function TdxPScxCustomCheckBoxProducer.Control: TcxCustomCheckBox;
begin
Result := inherited Control as TcxCustomCheckBox;
end;
class function TdxPScxCustomCheckBoxProducer.ControlClass: TControlClass;
begin
Result := TcxCustomCheckBox;
end;
function TdxPScxCustomCheckBoxProducer.Properties: TcxCustomCheckBoxProperties;
begin
Result := inherited Properties as TcxCustomCheckBoxProperties;
end;
procedure TdxPScxCustomCheckBoxProducer.InitializeItem(AnItem: TdxReportVisualItem);
var
CheckNullStyle: TcxCheckBoxNullValueShowingStyle;
CheckState: TcxCheckBoxState;
CheckGlyph: TBitmap;
begin
inherited;
CheckNullStyle := cxCheckBoxProperties_GetNullStyle(Properties);
CheckState := cxCheckBox_GetState(Control);
TdxReportCellCheckImage(AnItem).CellSides := [];
TdxReportCellCheckImage(AnItem).Checked := (CheckState = cbsChecked) or ((CheckState = cbsGrayed) and (CheckNullStyle = nssGrayedChecked));
TdxReportCellCheckImage(AnItem).ButtonEdgeStyle := CheckBorderStyleMap[Style.BorderStyle];
TdxReportCellCheckImage(AnItem).CheckPos := CheckPosMap[cxCheckBoxProperties_GetAlignment(Properties)];
TdxReportCellCheckImage(AnItem).Enabled := Control.Enabled and not ((CheckState = cbsGrayed) and (CheckNullStyle in [nssInactive, nssGrayedChecked]));
CheckGlyph := cxCheckBoxProperties_GetGlyph(Properties);
if not CheckGlyph.Empty then
begin
TdxReportCellCheckImage(AnItem).Glyph := CheckGlyph;
TdxReportCellCheckImage(AnItem).GlyphCount := cxCheckBoxProperties_GetGlyphCount(Properties);
end;
TdxReportCellCheckImage(AnItem).Multiline := cxCheckBoxProperties_GetIsMultilined(Properties);
TdxReportCellCheckImage(AnItem).Text := Control_GetText(Control);
TdxReportCellCheckImage(AnItem).TextAlignY := taCenterY;
TdxReportCellCheckImage(AnItem).TextAlignX := taLeft;
end;
function TdxPScxCustomCheckBoxProducer.ItemClass: TdxReportVisualItemClass;
begin
Result := TdxReportCellCheckImage;
end;
{ TdxPScxRadioButtonProducer }
function TdxPScxRadioButtonProducer.Control: TcxRadioButton;
begin
Result := inherited Control as TcxRadioButton;
end;
class function TdxPScxRadioButtonProducer.ControlClass: TControlClass;
begin
Result := TcxRadioButton;
end;
procedure TdxPScxRadioButtonProducer.InitializeItem(AnItem: TdxReportVisualItem);
begin
inherited;
TdxReportCellRadio(AnItem).ButtonEdgeStyle := RadioLookAndFeelKindMap[Control.LookAndFeel.Kind];
TdxReportCellRadio(AnItem).Multiline := Control.WordWrap;
end;
function TdxPScxRadioButtonProducer.ItemClass: TdxReportVisualItemClass;
begin
Result := TdxReportCellRadio;
end;
{ TdxPScxCustomBlobEditProducer }
function TdxPScxCustomBlobEditProducer.Control: TcxCustomBlobEdit;
begin
Result := inherited Control as TcxCustomBlobEdit;
end;
class function TdxPScxCustomBlobEditProducer.ControlClass: TControlClass;
begin
Result := TcxCustomBlobEdit;
end;
function TdxPScxCustomBlobEditProducer.CanProcessChild(AChildControl: TControl): Boolean;
begin
Result := False;
end;
function TdxPScxCustomBlobEditProducer.Producer: TdxPSCustomContainerItemProducer;
const
ProducerClasses: array[TcxBlobPaintStyle] of TdxPSCustomContainerItemProducerClass =
(TdxPScxDefaultBlobEditProducer, TdxPScxPictureBlobProducer, TdxPScxTextBlobEditProducer);
var
ProducerClass: TdxPSCustomContainerItemProducerClass;
begin
ProducerClass := ProducerClasses[cxBlobEditProperties_GetPaintStyle(cxEdit_GetProperties(Control))];
Result := TdxPSCustomContainerItemProducer(ReportLink.ProducersByClass[ProducerClass, Control]);
end;
{ TdxPScxDefaultBlobEditProducer }
function TdxPScxDefaultBlobEditProducer.Control: TcxCustomBlobEdit;
begin
Result := inherited Control as TcxCustomBlobEdit;
end;
procedure TdxPScxDefaultBlobEditProducer.InitializeItem(AnItem: TdxReportVisualItem);
begin
inherited;
TdxReportCellString(AnItem).Text :=
cxBlobEdit.GetBlobText(Control.EditValue, TcxCustomBlobEditProperties(cxEdit_GetProperties(Control)), False);
end;
{ TdxPScxPictureBlobProducer }
function TdxPScxPictureBlobProducer.Control: TcxCustomBlobEdit;
begin
Result := inherited Control as TcxCustomBlobEdit;
end;
procedure TdxPScxPictureBlobProducer.GetImageLists(AProc: TdxPSGetImageListProc);
begin
inherited;
AProc(imgBlobImages);
end;
procedure TdxPScxPictureBlobProducer.InitializeItem(AnItem: TdxReportVisualItem);
function HasEditValue: Boolean;
begin
Result := not VarIsNull(Control.EditValue) and not VarIsEmpty(Control.EditValue);
end;
const
ImageIndexes: array[TcxBlobEditKind] of Integer = (0, 2, 4, 6, 0);
begin
inherited;
TdxReportCellGraphic(AnItem).Center := True;
TdxReportCellGraphic(AnItem).ImageList := imgBlobImages;
TdxReportCellGraphic(AnItem).ImageIndex := Ord(HasEditValue) + ImageIndexes[cxBlobEditProperties_GetEditKind(cxEdit_GetProperties(Control))];
end;
function TdxPScxPictureBlobProducer.ItemClass: TdxReportVisualItemClass;
begin
Result := TdxReportCellGraphic;
end;
{ TdxPScxTextBlobEditProducer }
function TdxPScxTextBlobEditProducer.Control: TcxCustomBlobEdit;
begin
Result := inherited Control as TcxCustomBlobEdit;
end;
procedure TdxPScxTextBlobEditProducer.InitializeItem(AnItem: TdxReportVisualItem);
begin
inherited;
TdxReportCellString(AnItem).EndEllipsis := True;
TdxReportCellString(AnItem).Multiline := False;
TdxReportCellString(AnItem).Text := cxBlobEdit.GetBlobText(Control.EditValue, TcxCustomBlobEditProperties(cxEdit_GetProperties(Control)), False);
end;
{ TdxPScxCustomImageEditProducer }
function TdxPScxCustomImageEditProducer.Control: TcxCustomImage;
begin
Result := inherited Control as TcxCustomImage;
end;
class function TdxPScxCustomImageEditProducer.ControlClass: TControlClass;
begin
Result := TcxCustomImage;
end;
function TdxPScxCustomImageEditProducer.Properties: TcxCustomImageProperties;
begin
Result := inherited Properties as TcxCustomImageProperties;
end;
function TdxPScxCustomImageEditProducer.GetHasImage: Boolean;
var
ImagePicture: TPicture;
begin
ImagePicture := cxImage_GetPicture(Control);
Result := (ImagePicture.Graphic <> nil) and not ImagePicture.Graphic.Empty;
end;
procedure TdxPScxCustomImageEditProducer.InitializeItem(AnItem: TdxReportVisualItem);
begin
inherited;
if HasImage then
InitializeItemAsImage(TdxReportCellGraphic(AnItem))
else
InitializeItemAsText(TdxReportCellString(AnItem));
end;
procedure TdxPScxCustomImageEditProducer.InitializeItemAsImage(AnItem: TdxReportCellGraphic);
var
GraphicClass: TClass;
begin
Picture.Assign(cxImage_GetPicture(Control));
if Picture.Graphic <> nil then
GraphicClass := Picture.Graphic.ClassType
else
GraphicClass := nil;
AnItem.Center := cxImageProperties_GetCenter(Properties);
AnItem.Image := Picture.Graphic;
AnItem.ImageTransparent := ((GraphicClass <> nil) and GraphicClass.InheritsFrom(TIcon)) or
ReportLink.OptionsTransparent.Graphics;
AnItem.Stretch := (GraphicClass <> nil) and not GraphicClass.InheritsFrom(TIcon) and
cxImageProperties_GetStretch(Properties);
end;
procedure TdxPScxCustomImageEditProducer.InitializeItemAsText(AnItem: TdxReportCellString);
begin
AnItem.Text := cxImageProperties_GetCaption(Properties);
AnItem.TextAlignX := taCenterX;
AnItem.TextAlignY := taCenterY;
end;
function TdxPScxCustomImageEditProducer.ItemClass: TdxReportVisualItemClass;
const
ItemClasses: array[Boolean] of TdxReportCellDataClass = (TdxReportCellString, TdxReportCellGraphic);
begin
Result := ItemClasses[HasImage];
end;
function TdxPScxCustomImageEditProducer.ObjectShrinkHeight: Boolean;
begin
Result := False;
end;
function TdxPScxCustomImageEditProducer.ObjectExpandHeight: Boolean;
begin
Result := False;
end;
{ TdxPScxCustomGroupBoxProducer }
class function TdxPScxCustomGroupBoxProducer.CanHasAvailableChildren: Boolean;
begin
Result := True;
end;
function TdxPScxCustomGroupBoxProducer.Control: TcxCustomGroupBox;
begin
Result := inherited Control as TcxCustomGroupBox;
end;
class function TdxPScxCustomGroupBoxProducer.ControlClass: TControlClass;
begin
Result := TcxCustomGroupBox;
end;
function TdxPScxCustomGroupBoxProducer.Properties: TcxCustomGroupBoxProperties;
begin
Result := inherited Properties as TcxCustomGroupBoxProperties;
end;
function TdxPScxCustomGroupBoxProducer.CanProcessChild(AChildControl: TControl): Boolean;
begin
Result := True;
end;
procedure TdxPScxCustomGroupBoxProducer.InitializeItem(AnItem: TdxReportVisualItem);
begin
inherited;
TdxReportGroup(AnItem).BorderClass := ContainerBorderStyleMap[Self.Style.BorderStyle];
TdxReportGroup(AnItem).CaptionAlignment := GroupBoxCaptionAlignmentMap[cxGroupBox_GetAlignment(Control)];
TdxReportGroup(AnItem).CaptionText := Control_GetText(Control);
TdxReportGroup(AnItem).CaptionTransparent := TdxReportGroup(AnItem).Transparent;
TdxReportGroup(AnItem).UseOwnBorderClass := True;
TdxReportGroup(AnItem).LookAndFeel := ReportLink.CreateGroupLookAndFeel(LookAndFeelClass, False);
InitializeItemLookAndFeel(AnItem, TdxReportGroup(AnItem).LookAndFeel);
TdxReportGroup(AnItem).LookAndFeel.Prepare(DC);
TdxReportGroup(AnItem).CalculateCaptionTextWidth(DC);
end;
procedure TdxPScxCustomGroupBoxProducer.InitializeItemLookAndFeel(AnItem: TdxReportVisualItem;
ALookAndFeel: TdxPSReportGroupLookAndFeel);
begin
ALookAndFeel.CaptionFontIndex := AnItem.FontIndex;
ALookAndFeel.Color := ContentColor;
ALookAndFeel.FontIndex := AnItem.FontIndex;
end;
function TdxPScxCustomGroupBoxProducer.ItemClass: TdxReportVisualItemClass;
begin
Result := TdxReportGroup;
end;
function TdxPScxCustomGroupBoxProducer.LookAndFeelClass: TdxPSReportGroupLookAndFeelClass;
begin
Result := TdxPSReportGroupStandardLookAndFeel;
end;
{ TdxPScxCustomButtonGroupProducer }
function TdxPScxCustomButtonGroupProducer.Control: TcxCustomButtonGroup;
begin
Result := inherited Control as TcxCustomButtonGroup;
end;
class function TdxPScxCustomButtonGroupProducer.ControlClass: TControlClass;
begin
Result := TcxCustomButtonGroup;
end;
function TdxPScxCustomButtonGroupProducer.Properties: TcxCustomButtonGroupProperties;
begin
Result := inherited Properties as TcxCustomButtonGroupProperties;
end;
procedure TdxPScxCustomButtonGroupProducer.CreateItems(AButtonGroup: TdxCustomReportButtonGroup);
var
Items: TcxButtonGroupItems;
I: Integer;
Button: TdxCustomReportCellCheck;
begin
Items := cxButtonGroupProperties_GetItems(Properties);
for I := 0 to Items.Count - 1 do
begin
Button := AButtonGroup.Add(cxButtonGroupItem_GetCaption(Items[I]));
InitializeButton(AButtonGroup, Button, I);
end;
end;
procedure TdxPScxCustomButtonGroupProducer.InitializeButton(AGroup: TdxCustomReportButtonGroup;
AButton: TdxCustomReportCellCheck; AnIndex: Integer);
begin
AButton.BorderColor := Style.BorderColor;
AButton.ButtonEdgeStyle := AGroup.ButtonEdgeStyle;
end;
procedure TdxPScxCustomButtonGroupProducer.InitializeItem(AnItem: TdxReportVisualItem);
begin
inherited;
TdxCustomReportButtonGroup(AnItem).ButtonEdgeStyle := RadioBorderStyleMap[Style.BorderStyle];
TdxCustomReportButtonGroup(AnItem).ColumnCount := cxButtonGroupProperties_GetColumnCount(Properties);
CreateItems(TdxCustomReportButtonGroup(AnItem));
TdxCustomReportButtonGroup(AnItem).ShowCaption := (TdxCustomReportButtonGroup(AnItem).CaptionText <> '') and
(cxGroupBox_GetAlignment(Control) <> alCenterCenter);
TdxCustomReportButtonGroup(AnItem).AdjustContent(DC);
end;
procedure TdxPScxCustomButtonGroupProducer.InitializeItemLookAndFeel(AnItem: TdxReportVisualItem;
ALookAndFeel: TdxPSReportGroupLookAndFeel);
begin
inherited;
end;
function TdxPScxCustomButtonGroupProducer.ItemClass: TdxReportVisualItemClass;
begin
Result := TdxCustomReportButtonGroup;
end;
{ TdxPScxRadioGroupProducer }
function TdxPScxCustomRadioGroupProducer.Control: TcxCustomRadioGroup;
begin
Result := inherited Control as TcxCustomRadioGroup;
end;
class function TdxPScxCustomRadioGroupProducer.ControlClass: TControlClass;
begin
Result := TcxCustomRadioGroup;
end;
function TdxPScxCustomRadioGroupProducer.Properties: TcxRadioGroupProperties;
begin
Result := inherited Properties as TcxRadioGroupProperties;
end;
function TdxPScxCustomRadioGroupProducer.CanProcessChild(AChildControl: TControl): Boolean;
begin
Result := inherited CanProcessChild(AChildControl) and
not (AChildControl is TcxCustomRadioGroupButton); // RadioGroup buttons are processed inside
end;
procedure TdxPScxCustomRadioGroupProducer.InitializeItem(AnItem: TdxReportVisualItem);
begin
inherited;
TdxReportRadioGroup(AnItem).ItemIndex := Control.ItemIndex;
TdxReportRadioGroup(AnItem).CheckPos := ccpLeft;
end;
procedure TdxPScxCustomRadioGroupProducer.InitializeButton(AGroup: TdxCustomReportButtonGroup;
AButton: TdxCustomReportCellCheck; AnIndex: Integer);
begin
inherited;
//TdxReportCellRadio(AButton).ButtonEdgeStyle := AGroup.ButtonEdgeStyle;
TdxReportCellRadio(AButton).Enabled := Control.Enabled;
end;
function TdxPScxCustomRadioGroupProducer.ItemClass: TdxReportVisualItemClass;
begin
Result := TdxReportRadioGroup;
end;
procedure RegisterAssistants;
begin
TdxPScxNativePrintableControlProducer.Register;
//TdxPScxControlProducer.Register;
//TdxPScxContainerProducer.Register;
//TdxPScxCustomEditProducer.Register;
TdxPScxCustomTextEditProducer.Register;
TdxPScxCustomMemoEditProducer.Register;
TcxPScxCustomHyperLinkEditProducer.Register;
TcxPScxCustomCurrencyEditProducer.Register;
TdxPScxCustomComboBoxProducer.Register;
TdxPScxCustomImageComboBoxProducer.Register;
TdxPScxCustomCheckBoxProducer.Register;
TdxPScxRadioButtonProducer.Register;
TdxPScxCustomBlobEditProducer.Register;
TdxPScxCustomImageEditProducer.Register;
TdxPScxCustomGroupBoxProducer.Register;
TdxPScxCustomRadioGroupProducer.Register;
end;
procedure UnregisterAssistants;
begin
TdxPScxCustomRadioGroupProducer.Unregister;
TdxPScxCustomGroupBoxProducer.Unregister;
TdxPScxCustomImageEditProducer.Unregister;
TdxPScxCustomBlobEditProducer.Unregister;
TdxPScxRadioButtonProducer.Unregister;
TdxPScxCustomCheckBoxProducer.Unregister;
TdxPScxCustomImageComboBoxProducer.Unregister;
TdxPScxCustomComboBoxProducer.Unregister;
TcxPScxCustomCurrencyEditProducer.Unregister;
TcxPScxCustomHyperLinkEditProducer.Unregister;
TdxPScxCustomMemoEditProducer.Unregister;
TdxPScxCustomTextEditProducer.Unregister;
//TdxPScxCustomEditProducer.Unregister;
//TdxPScxContainerProducer.Unregister;
//TdxPScxControlProducer.Unregister;
TdxPScxNativePrintableControlProducer.Unregister;
end;
initialization
RegisterAssistants;
finalization
UnregisterAssistants;
FreeAndNil(FPicture);
end.