Componentes.Terceros.DevExp.../official/x.35/ExpressPrinting System/Sources/dxPSTextLnk.pas
2008-05-12 15:08:14 +00:00

862 lines
26 KiB
ObjectPascal

{*******************************************************************}
{ }
{ Developer Express Visual Component Library }
{ ExpressPrinting System(tm) COMPONENT SUITE }
{ }
{ Copyright (C) 1998-2008 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 dxPSTextLnk;
interface
{$I cxVer.inc}
uses
Windows, Classes, Graphics, Controls, StdCtrls, ExtCtrls, ComCtrls, dxPSCore,
dxPrnPg, dxPSTextOut, dxPSGlbl, dxExtCtrls, ImgList;
type
TdxCustomTextReportLink = class;
TdxfmTextReportLinkDesignWindow = class;
TdxTextReportLinkCustomDrawRowEvent = procedure(Sender: TdxCustomTextReportLink;
ACanvas: TCanvas; AnItem: TdxReportCellString; var ADone: Boolean) of object;
TdxTextReportLinkInitializeRowEvent = procedure(Sender: TdxCustomTextReportLink;
AnItem: TdxReportCellString) of object;
TdxCustomTextReportLink = class(TBasedxReportLink)
private
FAlignment: TdxTextAlignX;
FDelimiters: TList;
FFontIndex: Integer;
FScreenDC: HDC;
FSupportedCustomDraw: Boolean;
FTextRowHeight: Integer;
FTextRowItemHeight: Integer;
FTextRowSpacing: Double;
FOnCustomDrawRow: TdxTextReportLinkCustomDrawRowEvent;
FOnInitializeRow: TdxTextReportLinkInitializeRowEvent;
function GetDelimiter(Index: Integer): Integer;
function GetDelimiterCount: Integer;
function GetDesignWindow: TdxfmTextReportLinkDesignWindow;
function GetTextBounds: TRect;
function IsTextRowSpacingStored: Boolean;
procedure SetAlignment(Value: TdxTextAlignX);
procedure SetOnCustomDrawRow(Value: TdxTextReportLinkCustomDrawRowEvent);
procedure SetSupportedCustomDraw(Value: Boolean);
procedure SetTextRowSpacing(Value: Double);
protected
procedure ConstructReport(AReportCells: TdxReportCells); override;
procedure ConvertCoords; override;
procedure CustomDraw(AItem: TAbstractdxReportCellData; ACanvas: TCanvas;
ABoundsRect, AClientRect: TRect; var ADone: Boolean); override;
function GetRebuildOnPageParamsChange(AUpdateCodes: TdxPrinterPageUpdateCodes): Boolean; override;
procedure InternalRestoreDefaults; override;
function IsSupportedCustomDraw(Item: TAbstractdxReportCellData): Boolean; override;
procedure MakeDelimiters(AReportCells: TdxReportCells; AHorzDelimiters, AVertDelimiters: TList); override;
procedure AddDelimiter(Value: Integer); overload;
procedure AddDelimiter(AItem: TdxReportVisualItem); overload;
procedure AdjustHostBounds(AHost: TdxReportCell);
procedure CalculateTextRowHeight; virtual;
function CreateHost(AReportCells: TdxReportCells): TdxReportCell; virtual;
function CreateItem(AParent: TdxReportCell; const ATextRow: TdxTextRow): TdxReportCellString; virtual;
procedure CreateItems(AHost: TdxReportCell);
function GetTextRowBoundsWidth: Integer; virtual;
procedure InitializeHost(AHost: TdxReportCell); virtual;
procedure InitializeItem(AItem: TdxReportCellString; const AText: string); virtual;
procedure DoConstructReport(AReportCells: TdxReportCells); virtual;
procedure PrepareConstruct(AReportCells: TdxReportCells); virtual;
procedure UnprepareConstruct(AReportCells: TdxReportCells); virtual;
function GetText: string; virtual;
function GetTextFormat: DWORD; virtual;
function GetTextItemClass: TdxReportCellStringClass; virtual;
procedure DoCustomDrawRow(ACanvas: TCanvas; AnItem: TdxReportCellString; var ADone: Boolean); dynamic;
procedure DoInitializeRow(AnItem: TdxReportCellString); dynamic;
property DelimiterCount: Integer read GetDelimiterCount;
property DelimiterList: TList read FDelimiters;
property Delimiters[Index: Integer]: Integer read GetDelimiter;
property FontIndex: Integer read FFontIndex;
property ScreenDC: HDC read FScreenDC;
property TextBounds: TRect read GetTextBounds;
property TextFormat: DWORD read GetTextFormat;
property TextRowBoundsWidth: Integer read GetTextRowBoundsWidth;
property TextRowHeight: Integer read FTextRowHeight write FTextRowHeight;
property TextRowItemHeight: Integer read FTextRowItemHeight write FTextRowItemHeight;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Assign(Source: TPersistent); override;
class function Aggregable: Boolean; override;
function DataProviderPresent: Boolean; override;
property Alignment: TdxTextAlignX read FAlignment write SetAlignment default taLeft;
property Color;
property DesignWindow: TdxfmTextReportLinkDesignWindow read GetDesignWindow;
property Font;
property ScaleFonts;
property SupportedCustomDraw: Boolean read FSupportedCustomDraw write SetSupportedCustomDraw default False;
property Text: string read GetText;
property TextRowSpacing: Double read FTextRowSpacing write SetTextRowSpacing stored IsTextRowSpacingStored;
property Transparent;
property UseHorzDelimiters;
property OnCustomDrawRow: TdxTextReportLinkCustomDrawRowEvent read FOnCustomDrawRow write SetOnCustomDrawRow;
property OnInitializeRow: TdxTextReportLinkInitializeRowEvent read FOnInitializeRow write FOnInitializeRow;
end;
TdxCustomStringsReportLink = class(TdxCustomTextReportLink)
protected
function GetStrings: TStrings; virtual; abstract;
function GetText: string; override;
function GetTextFormat: DWORD; override;
public
property Strings: TStrings read GetStrings;
end;
TdxTextReportLink = class(TdxCustomStringsReportLink)
private
FStrings: TStrings;
procedure StringsChanged(Sender: TObject);
protected
function GetStrings: TStrings; override;
procedure SetStrings(Value: TStrings); virtual;
procedure SetText(const Value: string);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Assign(Source: TPersistent); override;
property Text write SetText;
published
property Alignment;
property Color;
property Font;
property ScaleFonts;
property Strings write SetStrings;
property TextRowSpacing;
property SupportedCustomDraw;
property UseHorzDelimiters;
property Transparent;
property OnCustomDrawRow;
property OnInitializeRow;
end;
TdxCustomMemoReportLink = class(TdxCustomStringsReportLink)
protected
function GetTextRowBoundsWidth: Integer; override;
procedure InternalRestoreFromOriginal; override;
function GetCustomMemo: TCustomMemo; virtual;
function GetStrings: TStrings; override;
property CustomMemo: TCustomMemo read GetCustomMemo;
published
property Alignment;
property Color;
property Font;
property ScaleFonts;
property SupportedCustomDraw;
property TextRowSpacing;
property UseHorzDelimiters;
property Transparent;
property OnCustomDrawRow;
property OnInitializeRow;
end;
TdxMemoReportLink = class(TdxCustomMemoReportLink)
private
function GetMemo: TMemo;
public
property Memo: TMemo read GetMemo;
end;
TdxfmTextReportLinkDesignWindow = class(TStandarddxReportLinkDesignWindow)
PageControl1: TPageControl;
tshOptions: TTabSheet;
pnlPreview: TPanel;
pbxPreview: TPaintBox;
btnFont: TButton;
edFont: TEdit;
lblLineSpacing: TLabel;
lblAlignment: TLabel;
cbxAlignment: TComboBox;
bvlLineSpacingSite: TBevel;
Bevel2: TBevel;
lblPreview: TLabel;
Bevel1: TBevel;
ilAlignments: TImageList;
procedure cbxAlignmentClick(Sender: TObject);
procedure btnFontClick(Sender: TObject);
procedure pbxPreviewPaint(Sender: TObject);
procedure cbxAlignmentDrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
private
seLineSpacing: TdxPSSpinEdit;
function GetReportLink: TdxCustomTextReportLink;
procedure LineSpacingChanged(Sender: TObject);
protected
procedure DoInitialize; override;
procedure LoadStrings; override;
procedure UpdatePreview; override;
procedure CreateControls;
public
constructor Create(AOwner: TComponent); override;
property ReportLink: TdxCustomTextReportLink read GetReportLink;
end;
implementation
{$R *.dfm}
uses
SysUtils, cxClasses, dxPSUtl, dxPSRes;
type
TCustomMemoAccess = class(TCustomMemo);
{ TdxCustomTextReportLink }
constructor TdxCustomTextReportLink.Create(AOwner: TComponent);
begin
inherited;
FDelimiters := TList.Create;
InternalRestoreDefaults;
LinkModified(False);
end;
destructor TdxCustomTextReportLink.Destroy;
begin
FreeAndNil(FDelimiters);
inherited;
end;
procedure TdxCustomTextReportLink.Assign(Source: TPersistent);
begin
if Source is TdxCustomTextReportLink then
with TdxCustomTextReportLink(Source) do
begin
Self.Alignment := Alignment;
Self.SupportedCustomDraw := SupportedCustomDraw;
Self.TextRowSpacing := TextRowSpacing;
end;
inherited;
end;
class function TdxCustomTextReportLink.Aggregable: Boolean;
begin
Result := False;
end;
function TdxCustomTextReportLink.DataProviderPresent: Boolean;
begin
if DataSource = rldsComponent then
Result := Text <> ''
else
Result := inherited DataProviderPresent;
end;
procedure TdxCustomTextReportLink.ConstructReport(AReportCells: TdxReportCells);
begin
PrepareConstruct(AReportCells);
try
DoConstructReport(AReportCells);
finally
UnprepareConstruct(AReportCells)
end;
end;
procedure TdxCustomTextReportLink.ConvertCoords;
procedure ConvertDelimiters(ADelimiters: TList);
var
I, Value: Integer;
begin
for I := 0 to ADelimiters.Count - 1 do
begin
Value := Integer(ADelimiters[I]);
Value := MulDiv(Value, PixelsNumerator, PixelsDenominator);
ADelimiters[I] := Pointer(Value);
end;
end;
begin
inherited;
ConvertDelimiters(DelimiterList);
end;
procedure TdxCustomTextReportLink.CustomDraw(AItem: TAbstractdxReportCellData;
ACanvas: TCanvas; ABoundsRect, AClientRect: TRect; var ADone: Boolean);
begin
DoCustomDrawRow(ACanvas, TdxReportCellString(AItem), ADone);
end;
function TdxCustomTextReportLink.GetRebuildOnPageParamsChange(AUpdateCodes: TdxPrinterPageUpdateCodes): Boolean;
begin
Result := AUpdateCodes * uaMarginsVert <> [];
end;
procedure TdxCustomTextReportLink.InternalRestoreDefaults;
begin
inherited;
Alignment := taLeft;
TextRowSpacing := 1;
SupportedCustomDraw := False;
end;
function TdxCustomTextReportLink.IsSupportedCustomDraw(Item: TAbstractdxReportCellData): Boolean;
begin
Result := SupportedCustomDraw and (Item <> nil);
end;
procedure TdxCustomTextReportLink.MakeDelimiters(AReportCells: TdxReportCells;
AHorzDelimiters, AVertDelimiters: TList);
begin
inherited;
dxPSUtl.dxCopyList(DelimiterList, AVertDelimiters);
end;
procedure TdxCustomTextReportLink.AddDelimiter(Value: Integer);
begin
FDelimiters.Add(TObject(Value));
end;
procedure TdxCustomTextReportLink.AddDelimiter(AItem: TdxReportVisualItem);
begin
with AItem.AbsoluteRect do
begin
AddDelimiter(Top);
AddDelimiter(Bottom);
end;
end;
procedure TdxCustomTextReportLink.AdjustHostBounds(AHost: TdxReportCell);
begin
with AHost do
if DataItemCount <> 0 then
begin
Left := 0;
Top := 0;
Width := DataItems[0].Width;
Height := DataItems[DataItemCount - 1].BoundsRect.Bottom;
end;
end;
procedure TdxCustomTextReportLink.CalculateTextRowHeight;
var
AFontHandle: HFont;
begin
AFontHandle := SelectObject(ScreenDC, Font.Handle);
FTextRowHeight := Round(FTextRowSpacing * dxCalcTextExtents(ScreenDC, 'Wg', 2, False).cy);
SelectObject(ScreenDC, AFontHandle);
FTextRowItemHeight := Round(FTextRowSpacing * Renderer.CalcTextPatternHeight(ScreenDC, Font));
end;
function TdxCustomTextReportLink.CreateHost(AReportCells: TdxReportCells): TdxReportCell;
begin
Result := TdxReportCell.Create(AReportCells.Cells);
InitializeHost(Result);
end;
function TdxCustomTextReportLink.CreateItem(AParent: TdxReportCell;
const ATextRow: TdxTextRow): TdxReportCellString;
function ExtractString(ATextRow: TdxTextRow): string;
begin
with ATextRow do
SetString(Result, Text, CharCount);
end;
procedure PlaceItem(AItem: TdxReportCellString);
begin
with Result do
begin
Left := 0;
Top := Index * TextRowHeight;
Width := TextRowBoundsWidth;
Height := TextRowItemHeight;
end;
end;
begin
Result := GetTextItemClass.Create(AParent);
PlaceItem(Result);
InitializeItem(Result, ExtractString(ATextRow));
DoInitializeRow(Result);
end;
procedure TdxCustomTextReportLink.CreateItems(AHost: TdxReportCell);
var
F: HFONT;
TextParams: TdxTextParams;
TextRows: TdxTextRows;
I: Integer;
Item: TdxReportCellString;
PercentsDone: Double;
begin
F := SelectObject(ScreenDC, Font.Handle);
try
TextParams := dxPSTextOut.dxCalcTextParams(ScreenDC, TextFormat);
TextRows := dxMakeTextRows(ScreenDC, Text, TextBounds, TextParams);
if TextRows <> nil then
try
for I := 0 to TextRows.Count - 1 do
begin
Item := CreateItem(AHost, TextRows[I]);
AddDelimiter(Item);
PercentsDone := (I + 1) * 100 / TextRows.Count;
DoProgress(PercentsDone);
if AbortBuilding then Break;
end;
finally
TextRows.Free;
end;
finally
SelectObject(ScreenDC, F);
end;
end;
function TdxCustomTextReportLink.GetTextRowBoundsWidth: Integer;
begin
with RealPrinterPage.PaintRectPixels do
Result := Right - Left - 1;
end;
procedure TdxCustomTextReportLink.InitializeHost(AHost: TdxReportCell);
begin
AHost.CellSides := [];
AHost.Transparent := True;
end;
procedure TdxCustomTextReportLink.InitializeItem(AItem: TdxReportCellString;
const AText: string);
begin
AItem.CellSides := [];
AItem.FontIndex := FontIndex;
AItem.Text := AText;
AItem.TextAlignX := Alignment;
AItem.Transparent := Transparent;
end;
procedure TdxCustomTextReportLink.DoConstructReport(AReportCells: TdxReportCells);
var
Host: TdxReportCell;
R: TRect;
begin
Host := CreateHost(AReportCells);
CreateItems(Host);
if not AbortBuilding then
begin
AdjustHostBounds(Host);
R := Host.BoundsRect;
OffsetRect(R, -R.Left, -R.Top);
AReportCells.Cells.BoundsRect := R;
end;
end;
procedure TdxCustomTextReportLink.PrepareConstruct(AReportCells: TdxReportCells);
begin
FScreenDC := GetDC(0);
FDelimiters.Clear;
FFontIndex := AddFontToPool(Font);
CalculateTextRowHeight;
end;
procedure TdxCustomTextReportLink.UnprepareConstruct(AReportCells: TdxReportCells);
begin
ReleaseDC(0, FScreenDC);
end;
function TdxCustomTextReportLink.GetText: string;
begin
Result := '';
end;
function TdxCustomTextReportLink.GetTextFormat: DWORD;
begin
Result := DXTO_WORDBREAK or DXTO_EXPANDTABS or dxPSTextOut.dxMakeFormat(Alignment, taTop);
end;
function TdxCustomTextReportLink.GetTextItemClass: TdxReportCellStringClass;
begin
Result := TdxReportCellString;
end;
procedure TdxCustomTextReportLink.DoCustomDrawRow(ACanvas: TCanvas;
AnItem: TdxReportCellString; var ADone: Boolean);
begin
if Assigned(FOnCustomDrawRow) then
FOnCustomDrawRow(Self, ACanvas, AnItem, ADone);
end;
procedure TdxCustomTextReportLink.DoInitializeRow(AnItem: TdxReportCellString);
begin
if Assigned(FOnInitializeRow) then FOnInitializeRow(Self, AnItem);
end;
function TdxCustomTextReportLink.GetDelimiter(Index: Integer): Integer;
begin
Result := Integer(FDelimiters[Index]);
end;
function TdxCustomTextReportLink.GetDelimiterCount: Integer;
begin
Result := FDelimiters.Count;
end;
function TdxCustomTextReportLink.GetDesignWindow: TdxfmTextReportLinkDesignWindow;
begin
Result := inherited DesignWindow as TdxfmTextReportLinkDesignWindow;
end;
function TdxCustomTextReportLink.GetTextBounds: TRect;
begin
Result := RealPrinterPage.PaintRectPixels;
Dec(Result.Right);
InflateRect(Result, -1, -1);
Result.Bottom := MaxInt; // no limit
end;
function TdxCustomTextReportLink.IsTextRowSpacingStored: Boolean;
begin
Result := Abs(TextRowSpacing - 1) > 0.001;
end;
procedure TdxCustomTextReportLink.SetAlignment(Value: TdxTextAlignX);
begin
if Value = taJustifyX then
Value := taDistributeX;
if FAlignment <> Value then
begin
FAlignment := Value;
LinkModified(True);
end;
end;
procedure TdxCustomTextReportLink.SetOnCustomDrawRow(Value: TdxTextReportLinkCustomDrawRowEvent);
begin
if @FOnCustomDrawRow <> @Value then
begin
FOnCustomDrawRow := Value;
if SupportedCustomDraw then LinkModified(True);
end;
end;
procedure TdxCustomTextReportLink.SetSupportedCustomDraw(Value: Boolean);
begin
if FSupportedCustomDraw <> Value then
begin
FSupportedCustomDraw := Value;
if Assigned(FOnCustomDrawRow) then LinkModified(True);
end;
end;
procedure TdxCustomTextReportLink.SetTextRowSpacing(Value: Double);
begin
if Value < 1 then Value := 1;
if FTextRowSpacing <> Value then
begin
FTextRowSpacing := Value;
LinkModified(True);
end;
end;
{ TdxCustomStringsReportLink }
function TdxCustomStringsReportLink.GetText: string;
begin
if Strings <> nil then
Result := Strings.Text
else
Result := '';
end;
function TdxCustomStringsReportLink.GetTextFormat: DWORD;
begin
Result := inherited GetTextFormat or DXTO_CHARBREAK;
end;
{ TdxTextReportLink }
constructor TdxTextReportLink.Create(AOwner: TComponent);
begin
inherited;
FStrings := TStringList.Create;
TStringList(FStrings).OnChange := StringsChanged;
end;
destructor TdxTextReportLink.Destroy;
begin
FreeAndNil(FStrings);
inherited;
end;
procedure TdxTextReportLink.Assign(Source: TPersistent);
begin
if Source is TdxTextReportLink then
Text := TdxTextReportLink(Source).Text;
inherited;
end;
function TdxTextReportLink.GetStrings: TStrings;
begin
Result := FStrings;
end;
procedure TdxTextReportLink.SetStrings(Value: TStrings);
begin
Strings.Assign(Value);
end;
procedure TdxTextReportLink.SetText(const Value: string);
begin
Strings.Text := Value;
end;
procedure TdxTextReportLink.StringsChanged(Sender: TObject);
begin
LinkModified(True);
end;
{ TdxCustomMemoReportLink }
function TdxCustomMemoReportLink.GetTextRowBoundsWidth: Integer;
var
ControllerIntf: IdxReportLinkController;
begin
if IsAggregated and SysUtils.Supports(TObject(Controller), IdxReportLinkController, ControllerIntf) then
with ControllerIntf.GetControlSiteBounds(CustomMemo) do
Result := Right - Left - 1
else
Result := inherited GetTextRowBoundsWidth;
end;
procedure TdxCustomMemoReportLink.InternalRestoreFromOriginal;
begin
inherited;
Alignment := dxPSCore.dxTextAlignX[TCustomMemoAccess(CustomMemo).Alignment];
end;
function TdxCustomMemoReportLink.GetCustomMemo: TCustomMemo;
begin
Result := inherited Component as TCustomMemo;
end;
function TdxCustomMemoReportLink.GetStrings: TStrings;
begin
if CustomMemo <> nil then
Result := CustomMemo.Lines
else
Result := nil;
end;
{ TdxMemoReportLink }
function TdxMemoReportLink.GetMemo: TMemo;
begin
Result := inherited Component as TMemo;
end;
{ TdxfmTextReportLinkDesignWindow }
constructor TdxfmTextReportLinkDesignWindow.Create(AOwner: TComponent);
begin
HelpContext := dxPSGlbl.dxhcTextReportLinkDesigner;
inherited;
CreateControls;
end;
procedure TdxfmTextReportLinkDesignWindow.DoInitialize;
begin
inherited;
cbxAlignment.ItemIndex := cbxAlignment.Items.IndexOfObject(TObject(ReportLink.Alignment));
seLineSpacing.Value := ReportLink.TextRowSpacing;
FontInfoToText(ReportLink.Font, edFont);
end;
procedure TdxfmTextReportLinkDesignWindow.LoadStrings;
begin
inherited;
tshOptions.Caption := cxGetResourceString(@sdxOptions);
lblPreview.Caption := DropAmpersand(cxGetResourceString(@sdxPreview));
lblAlignment.Caption := AddColon(cxGetResourceString(@sdxAlignment));
lblLineSpacing.Caption := cxGetResourceString(@sdxLineSpacing);
with cbxAlignment do
begin
Items.BeginUpdate;
try
Items.AddObject(cxGetResourceString(@sdxTextAlignLeft), TObject(taLeft));
Items.AddObject(cxGetResourceString(@sdxTextAlignCenter), TObject(taCenterX));
Items.AddObject(cxGetResourceString(@sdxTextAlignRight), TObject(taRight));
Items.AddObject(cxGetResourceString(@sdxTextAlignJustified), TObject(taDistributeX));
finally
Items.EndUpdate;
end;
end;
btnFont.Caption := cxGetResourceString(@sdxBtnFont);
end;
procedure TdxfmTextReportLinkDesignWindow.UpdatePreview;
begin
pbxPreview.Invalidate;
end;
procedure TdxfmTextReportLinkDesignWindow.CreateControls;
begin
seLineSpacing := TdxPSSpinEdit.Create(Self);
with seLineSpacing do
begin
BoundsRect := bvlLineSpacingSite.BoundsRect;
Decimal := 1;
Increment := 0.1;
MaxValue := 10;
MinValue := 1;
Flat := False;
Parent := tshOptions;
ValueType := svtFloat;
TabOrder := cbxAlignment.TabOrder + 1;
OnChange := LineSpacingChanged;
end;
end;
function TdxfmTextReportLinkDesignWindow.GetReportLink: TdxCustomTextReportLink;
begin
Result := inherited ReportLink as TdxCustomTextReportLink;
end;
procedure TdxfmTextReportLinkDesignWindow.LineSpacingChanged(Sender: TObject);
begin
if LockControlsUpdate then Exit;
ReportLink.TextRowSpacing := TdxPSSpinEdit(Sender).Value;
Modified := True;
UpdatePreview;
end;
procedure TdxfmTextReportLinkDesignWindow.cbxAlignmentClick(Sender: TObject);
begin
if LockControlsUpdate then Exit;
with TComboBox(Sender) do
ReportLink.Alignment := TdxTextAlignX(Items.Objects[ItemIndex]);
Modified := True;
UpdatePreview;
end;
procedure TdxfmTextReportLinkDesignWindow.btnFontClick(Sender: TObject);
begin
if LockControlsUpdate then Exit;
dxPSGlbl.FontDialog.Font := ReportLink.Font;
if dxPSGlbl.FontDialog.Execute then
begin
ReportLink.Font := dxPSGlbl.FontDialog.Font;
FontInfoToText(ReportLink.Font, edFont);
Modified := True;
UpdatePreview;
end;
end;
procedure TdxfmTextReportLinkDesignWindow.pbxPreviewPaint(Sender: TObject);
function GetText: string;
const
RowCount: Integer = 10;
var
Line: string;
I: Integer;
begin
Line := cxGetResourceString(@sdxSampleText);
Result := '';
for I := 0 to RowCount - 1 do
Result := Result + Line + #13#10;
end;
var
Format: DWORD;
R: TRect;
begin
Format := DXTO_DEFAULT_FORMAT + DXTO_WORDBREAK + DXTO_CHARBREAK +
dxMakeFormat(ReportLink.Alignment, taTop);
with TPaintBox(Sender) do
begin
Canvas.Font := ReportLink.Font;
Canvas.Font.Size := 8;
R := ClientRect;
dxTextOut(Canvas.Handle, GetText, R, Format, Canvas.Font, 0, 0, 0, clDefault, ReportLink.TextRowSpacing);
end;
end;
procedure TdxfmTextReportLinkDesignWindow.cbxAlignmentDrawItem(
Control: TWinControl; Index: Integer; Rect: TRect;
State: TOwnerDrawState);
var
X, Y: Integer;
begin
with TComboBox(Control) do
begin
Canvas.FillRect(Rect);
with Rect do
begin
X := Left + 1;
Y := Top + 1;
end;
ilAlignments.Draw(Canvas, X, Y, Index);
with Rect do
begin
X := Left + 1 + ilAlignments.Width + 1 + 2;
Y := Top + (Bottom - Top - Canvas.TextHeight('Wq')) div 2;
end;
Canvas.TextOut(X, Y, Items[Index]);
end;
end;
initialization
dxPSRegisterReportLink(TdxTextReportLink, nil, TdxfmTextReportLinkDesignWindow);
dxPSRegisterReportLink(TdxMemoReportLink, TMemo, TdxfmTextReportLinkDesignWindow);
finalization
dxPSUnregisterReportLink(TdxMemoReportLink, TMemo, TdxfmTextReportLinkDesignWindow);
dxPSUnregisterReportLink(TdxTextReportLink, nil, TdxfmTextReportLinkDesignWindow);
end.