git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.DevExpressVCL@31 05c56307-c608-d34a-929d-697000501d7a
729 lines
28 KiB
ObjectPascal
729 lines
28 KiB
ObjectPascal
unit SpreadSheetRLMain;
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
|
|
Dialogs, StdCtrls, ExtCtrls, ComCtrls, ToolWin, DB, DBTables, Menus, ImgList,
|
|
cxControls, cxSSheet, cxSSUtils, cxSSTypes, cxSSHeaders, cxSSStyles,
|
|
StdActns, ActnList, dxPSCore, dxPSBaseGridLnk, dxPScxSSLnk, dxPSGlbl,
|
|
dxPSUtl, dxPSEngn, dxPrnPg, dxBkgnd, dxWrap, dxPrnDev, dxPSCompsProvider,
|
|
dxPSFillPatterns, dxPSEdgePatterns;
|
|
|
|
|
|
type
|
|
TSpreadSheetRLForm = class(TForm)
|
|
edtCellEdit: TEdit;
|
|
imgStandart : TImageList;
|
|
pnCellsRect: TPanel;
|
|
Panel2 : TPanel;
|
|
Query: TQuery;
|
|
SaveDialog: TSaveDialog;
|
|
ToolBar1 : TToolBar;
|
|
ToolBar2 : TToolBar;
|
|
alMain: TActionList;
|
|
actDeleteCells: TAction;
|
|
actSaveSpeadSheet: TAction;
|
|
actInsertCells: TAction;
|
|
actExit: TAction;
|
|
actCut: TAction;
|
|
actCopy: TAction;
|
|
actPaste: TAction;
|
|
actFormatCells: TAction;
|
|
actHideCells: TAction;
|
|
actShowCells: TAction;
|
|
actHideCol: TAction;
|
|
actShowCol: TAction;
|
|
actHideRow: TAction;
|
|
actShowRow: TAction;
|
|
pmSheetPopup: TPopupMenu;
|
|
pmiCut: TMenuItem;
|
|
pmiCopy: TMenuItem;
|
|
pmiPaste: TMenuItem;
|
|
N6: TMenuItem;
|
|
pmiDelete: TMenuItem;
|
|
pmiInsert: TMenuItem;
|
|
MenuItem2: TMenuItem;
|
|
pmiCols: TMenuItem;
|
|
pmiColsHide: TMenuItem;
|
|
pmiColsShow: TMenuItem;
|
|
pmiRows: TMenuItem;
|
|
pmiRowsHide: TMenuItem;
|
|
pmiRowsShow: TMenuItem;
|
|
MenuItem3: TMenuItem;
|
|
MenuItem4: TMenuItem;
|
|
pmiFormatCells: TMenuItem;
|
|
ToolBar3: TToolBar;
|
|
ToolButton7: TToolButton;
|
|
ToolButton8: TToolButton;
|
|
ToolButton9: TToolButton;
|
|
ToolButton10: TToolButton;
|
|
ToolButton11: TToolButton;
|
|
mnuMain: TMainMenu;
|
|
mnuFile: TMenuItem;
|
|
miSaveSpreadSheet: TMenuItem;
|
|
MenuItem6: TMenuItem;
|
|
miExit: TMenuItem;
|
|
mnuEdit: TMenuItem;
|
|
miCut: TMenuItem;
|
|
miCopy: TMenuItem;
|
|
miPaste: TMenuItem;
|
|
N7: TMenuItem;
|
|
miCells: TMenuItem;
|
|
miFormat: TMenuItem;
|
|
miHide: TMenuItem;
|
|
miShow: TMenuItem;
|
|
miDeletecells: TMenuItem;
|
|
Insertcells1: TMenuItem;
|
|
miColumns: TMenuItem;
|
|
MenuItem7: TMenuItem;
|
|
MenuItem8: TMenuItem;
|
|
miRows: TMenuItem;
|
|
Hide3: TMenuItem;
|
|
Show3: TMenuItem;
|
|
mnuConfig: TMenuItem;
|
|
actApplyFormatting: TAction;
|
|
actLoadData: TAction;
|
|
ApplyFormatting1: TMenuItem;
|
|
LoadData1: TMenuItem;
|
|
cxSpreadBook: TcxSpreadSheetBook;
|
|
Panel3: TPanel;
|
|
Button1: TButton;
|
|
Button2: TButton;
|
|
Button4: TButton;
|
|
Button3: TButton;
|
|
actPreview: TAction;
|
|
actPrint: TAction;
|
|
actSetPrintArea: TAction;
|
|
actClearPrintArea: TAction;
|
|
dxComponentPrinter: TdxComponentPrinter;
|
|
ToolButton1: TToolButton;
|
|
tbPreview: TToolButton;
|
|
actPrintSetup: TAction;
|
|
Preview1: TMenuItem;
|
|
Print1: TMenuItem;
|
|
PrintSetup1: TMenuItem;
|
|
PrintArea1: TMenuItem;
|
|
SetPrintArea1: TMenuItem;
|
|
ClearPrintArea1: TMenuItem;
|
|
N1: TMenuItem;
|
|
dxComponentPrinterLink1: TdxSpreadSheetBookReportLink;
|
|
procedure FormShow(Sender: TObject);
|
|
procedure ToolButton1Click(Sender: TObject);
|
|
procedure Button4Click(Sender: TObject);
|
|
procedure cxSpreadBookSetSelection(Sender: TObject;
|
|
ASheet: TcxSSBookSheet);
|
|
procedure cxSpreadBookSheetPopupMenu(Sender: TObject; X,
|
|
Y: Integer);
|
|
procedure edtCellEditKeyPress(Sender: TObject; var Key: Char);
|
|
procedure actCellsExecute(Sender: TObject);
|
|
procedure actFormatCellsExecute(Sender: TObject);
|
|
procedure actHideCellsExecute(Sender: TObject);
|
|
procedure actShowCellsExecute(Sender: TObject);
|
|
procedure actHideColExecute(Sender: TObject);
|
|
procedure actShowColExecute(Sender: TObject);
|
|
procedure actHideRowExecute(Sender: TObject);
|
|
procedure actShowRowExecute(Sender: TObject);
|
|
procedure actCutExecute(Sender: TObject);
|
|
procedure actCopyExecute(Sender: TObject);
|
|
procedure actPasteExecute(Sender: TObject);
|
|
procedure actSaveSpeadSheetExecute(Sender: TObject);
|
|
procedure actExitExecute(Sender: TObject);
|
|
procedure actApplyFormattingUpdate(Sender: TObject);
|
|
procedure actSaveSpeadSheetUpdate(Sender: TObject);
|
|
procedure actLoadDataExecute(Sender: TObject);
|
|
procedure AlwaysEnabled(Sender: TObject);
|
|
procedure edtCellEditChange(Sender: TObject);
|
|
procedure edtCellEditExit(Sender: TObject);
|
|
procedure actApplyFormattingExecute(Sender: TObject);
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure actPreviewExecute(Sender: TObject);
|
|
procedure actPrintExecute(Sender: TObject);
|
|
procedure actSetPrintAreaExecute(Sender: TObject);
|
|
procedure actClearPrintAreaExecute(Sender: TObject);
|
|
procedure actPrintSetupExecute(Sender: TObject);
|
|
procedure cxSpreadBookActiveSheetChanging(
|
|
Sender: TcxCustomSpreadSheetBook; const ActiveSheet: Integer;
|
|
var CanSelect: Boolean);
|
|
private
|
|
CurRow : Integer;
|
|
FIsUpdate: Boolean;
|
|
FIsApplyFormatting: Boolean;
|
|
FSaveSpreadSheet: Boolean;
|
|
procedure SetCellText(ACol, ARow : Integer; AText : String);
|
|
procedure SetCellDate(ACol, ARow : Integer; ADate : TDateTime);
|
|
procedure SetCellFont(ALeftCol, ATopRow, ARightCol, ABottomRow : Integer;
|
|
AStyle : TFontStyles; ASize : Integer);
|
|
procedure SetCellPattern(ALeftCol, ATopRow, ARightCol, ABottomRow,
|
|
ABackground, AForeGround : Integer; AFillStyle : TcxSSFillStyle);
|
|
procedure SetCellFormat(ALeftCol, ATopRow, ARightCol, ABottomRow,
|
|
AFormat : Integer);
|
|
procedure SetCellAlignment(ALeftCol, ATopRow, ARightCol, ABottomRow : Integer;
|
|
AHorzAlign : TcxHorzTextAlign; AVertAlign : TcxVertTextAlign);
|
|
procedure SetCellBorders(ALeftCol, ATopRow, ARightCol, ABottomRow : Integer;
|
|
AEdge: integer; AStyle: TcxSSEdgeLineStyle);
|
|
procedure SaveSpreadSheet;
|
|
function GetCellText(SelectionRect: TRect; R1C1: Boolean): String;
|
|
end;
|
|
|
|
var
|
|
SpreadSheetRLForm: TSpreadSheetRLForm;
|
|
|
|
implementation
|
|
|
|
uses SpreadSheetRLModify;
|
|
|
|
resourcestring
|
|
sdxInvalidPrintArea = 'You''ve selected a single cell for print area.' + #13#10#13#10 +
|
|
'If this is correct, click OK.' + #13#10 +
|
|
'If you selected single cell by mistake, click Cancel, select the cell you want to include, and then click Set Print Area again.';
|
|
|
|
|
|
{$R *.dfm}
|
|
|
|
procedure TSpreadSheetRLForm.FormShow(Sender: TObject);
|
|
begin
|
|
with cxSpreadBook do
|
|
begin
|
|
BeginUpdate;
|
|
Try
|
|
AutoRecalc := False;
|
|
ActiveSheet.Caption := 'Current'; // set the page caption for the first page
|
|
AddSheetPage('HiLo'); // add a second page and set it's caption
|
|
ActivePage := 0; // turn our attention to the first page
|
|
SetCellText(0,0,'Current Stockholding Valuations'); // set a title in the first column, first row cell
|
|
SetCellText(0,2,'Company'); // Col A - Set column titles
|
|
SetCellText(1,2,'Holding'); // B
|
|
SetCellText(2,2,'Purchased'); // C
|
|
SetCellText(3,2,'Price'); // D
|
|
SetCellText(4,2,'Cost'); // E = B * D
|
|
SetCellText(5,2,'Value'); // F
|
|
SetCellText(6,2,'Worth'); // G = B * F
|
|
SetCellText(7,2,'Gain'); // H = G - E
|
|
SetCellText(8,2,'%age Gain'); // I = H / E
|
|
ActivePage := 1; // switch to the second page
|
|
SetCellText(0,0,'High, Low and Current Stock Prices');
|
|
SetCellText(0,2,'Company'); // Col A
|
|
SetCellText(1,2,'Price'); // B
|
|
SetCellText(2,2,'High'); // C
|
|
SetCellText(3,2,'Low'); // D
|
|
SetCellText(4,2,'Average'); // E
|
|
AutoRecalc := True;
|
|
ActivePage := 0; // back to the first page
|
|
cxSpreadBookSetSelection(Nil,ActiveSheet); // call to set the current cell and cell contents display
|
|
Finally
|
|
EndUpdate;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.ToolButton1Click(Sender: TObject);
|
|
begin
|
|
with SaveDialog do // using the standard save dialog
|
|
if Execute then // if executed,
|
|
cxSpreadBook.SaveToFile(FileName); // then save the spreadsheet
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.Button4Click(Sender: TObject);
|
|
begin
|
|
Close;
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.cxSpreadBookSetSelection(Sender: TObject;
|
|
ASheet: TcxSSBookSheet);
|
|
var
|
|
CellObject: TcxSSCellObject;
|
|
begin
|
|
CellObject := cxSpreadBook.ActiveSheet.GetCellObject(ASheet.SelectionRect.Left, ASheet.SelectionRect.Top);
|
|
try
|
|
FIsUpdate := True;
|
|
edtCellEdit.Text := CellObject.Text;
|
|
pnCellsRect.Caption := GetCellText(ASheet.SelectionRect, cxSpreadBook.R1C1ReferenceStyle);
|
|
finally
|
|
CellObject.Free;
|
|
FIsUpdate := False;
|
|
end;
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.cxSpreadBookSheetPopupMenu(Sender: TObject; X,
|
|
Y: Integer);
|
|
begin
|
|
pmSheetPopup.Popup(X, Y); // popup our menu where clicked
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.edtCellEditKeyPress(Sender: TObject; var Key: Char);
|
|
begin
|
|
if Key = #13 then // pressing RETURN in our edit box
|
|
Windows.SetFocus(cxSpreadBook.Handle); // set focus back to the spreadsheet
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.SetCellText(ACol, ARow : Integer; AText : String);
|
|
begin
|
|
// get a cell object for the request col and row
|
|
with cxSpreadBook.ActiveSheet.GetCellObject(ACol,ARow) do
|
|
begin
|
|
try
|
|
Text := AText;
|
|
finally
|
|
Free; // and free it (important!)
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.SetCellDate(ACol, ARow : Integer; ADate : TDateTime);
|
|
begin
|
|
// get a cell object for the request col and row
|
|
with cxSpreadBook.ActiveSheet.GetCellObject(ACol,ARow) do
|
|
begin
|
|
try
|
|
DateTime := ADate;
|
|
finally
|
|
Free; // free it
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.SetCellFont(ALeftCol, ATopRow, ARightCol, ABottomRow : Integer; AStyle : TFontStyles; ASize : Integer);
|
|
var
|
|
I, J : Integer;
|
|
begin
|
|
with cxSpreadBook.ActiveSheet do // using our active page
|
|
for I := ALeftCol to ARightCol do // for each column specified
|
|
for J := ATopRow to ABottomRow do // for each row specified
|
|
with GetCellObject(I,J) do // get the cell
|
|
try
|
|
Style.Font.Style := AStyle;
|
|
Style.Font.Size := ASize;
|
|
finally
|
|
Free; // free it
|
|
end;
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.SetCellPattern(ALeftCol, ATopRow, ARightCol, ABottomRow, ABackground, AForeGround : Integer; AFillStyle : TcxSSFillStyle);
|
|
var
|
|
I, J : Integer;
|
|
begin
|
|
with cxSpreadBook.ActiveSheet do // using our active page
|
|
for I := ALeftCol to ARightCol do // for each column specified
|
|
for J := ATopRow to ABottomRow do // for each row specified
|
|
with GetCellObject(I,J) do // get the cell
|
|
try
|
|
Style.Brush.BackgroundColor := ABackground;
|
|
Style.Brush.ForegroundColor := AForeground;
|
|
Style.Brush.Style := AFillStyle;
|
|
finally
|
|
Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.SetCellFormat(ALeftCol, ATopRow, ARightCol, ABottomRow, AFormat : Integer);
|
|
var
|
|
I, J : Integer;
|
|
begin
|
|
with cxSpreadBook.ActiveSheet do // using our active page
|
|
for I := ALeftCol to ARightCol do // for each column specified
|
|
for J := ATopRow to ABottomRow do // for each row specified
|
|
with GetCellObject(I,J) do // get the cell
|
|
try
|
|
Style.Format := AFormat;
|
|
finally
|
|
Free; // free it
|
|
end;
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.SetCellAlignment(ALeftCol, ATopRow, ARightCol, ABottomRow : Integer;
|
|
AHorzAlign : TcxHorzTextAlign; AVertAlign : TcxVertTextAlign);
|
|
var
|
|
I, J : Integer;
|
|
begin
|
|
with cxSpreadBook.ActiveSheet do // using our active page
|
|
for I := ALeftCol to ARightCol do // for each column specified
|
|
for J := ATopRow to ABottomRow do // for each row specified
|
|
with GetCellObject(I,J) do // get the cell
|
|
try
|
|
Style.HorzTextAlign := AHorzAlign;
|
|
Style.VertTextAlign := AVertAlign;
|
|
finally
|
|
Free; // free it
|
|
end;
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.SetCellBorders(ALeftCol, ATopRow, ARightCol, ABottomRow : Integer;
|
|
AEdge: Integer; AStyle: TcxSSEdgeLineStyle);
|
|
var
|
|
I, J : Integer;
|
|
begin
|
|
with cxSpreadBook.ActiveSheet do // using our active page
|
|
for I := ALeftCol to ARightCol do // for each column specified
|
|
for J := ATopRow to ABottomRow do // for each row specified
|
|
with GetCellObject(I,J) do // get the cell
|
|
try
|
|
Case AEdge of // depending on which edge has been requested
|
|
0: Style.Borders.Left.Style := AStyle; // set to the specified style
|
|
1: Style.Borders.Top.Style := AStyle;
|
|
2: Style.Borders.Right.Style := AStyle;
|
|
3: Style.Borders.Bottom.Style := AStyle;
|
|
end;
|
|
finally
|
|
Free; // free it
|
|
end;
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.actCellsExecute(Sender: TObject);
|
|
var
|
|
AForm :TSpreadSheetRLModifyForm;
|
|
const
|
|
AFormType: array[Boolean] of TcxSSModifyType = (mtDelete, mtInsert);
|
|
begin
|
|
if FIsUpdate then Exit;
|
|
AForm := TSpreadSheetRLModifyForm.Create(Self);
|
|
AForm.Top := (Top + Height) shr 1;
|
|
AForm.Left := (Left + Width) shr 1;
|
|
try
|
|
if AForm.Execute(AFormType[TCustomAction(Sender).Tag = 1]) then
|
|
with cxSpreadBook.ActiveSheet do
|
|
case TCustomAction(Sender).Tag of
|
|
0:
|
|
DeleteCells(SelectionRect, AForm.Modify);
|
|
1:
|
|
InsertCells(SelectionRect, AForm.Modify);
|
|
end;
|
|
finally
|
|
AForm.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.actFormatCellsExecute(Sender: TObject);
|
|
begin
|
|
with cxSpreadBook.ActiveSheet do
|
|
FormatCells(SelectionRect);
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.actHideCellsExecute(Sender: TObject);
|
|
begin
|
|
if FIsUpdate then Exit;
|
|
with cxSpreadBook.ActiveSheet do
|
|
SetVisibleState(SelectionRect, True, True, False);
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.actShowCellsExecute(Sender: TObject);
|
|
begin
|
|
if FIsUpdate then Exit;
|
|
with cxSpreadBook.ActiveSheet do
|
|
SetVisibleState(SelectionRect, True, True, True);
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.actHideColExecute(Sender: TObject);
|
|
begin
|
|
if FIsUpdate then Exit;
|
|
with cxSpreadBook.ActiveSheet do
|
|
SetVisibleState(SelectionRect, True, False, False);
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.actShowColExecute(Sender: TObject);
|
|
begin
|
|
if FIsUpdate then Exit;
|
|
with cxSpreadBook.ActiveSheet do
|
|
SetVisibleState(SelectionRect, True, False, True);
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.actHideRowExecute(Sender: TObject);
|
|
begin
|
|
if FIsUpdate then Exit;
|
|
with cxSpreadBook.ActiveSheet do
|
|
SetVisibleState(SelectionRect, False, True, False);
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.actShowRowExecute(Sender: TObject);
|
|
begin
|
|
if FIsUpdate then Exit;
|
|
with cxSpreadBook.ActiveSheet do
|
|
SetVisibleState(SelectionRect, False, True, True);
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.actCutExecute(Sender: TObject);
|
|
begin
|
|
with cxSpreadBook.ActiveSheet do
|
|
Copy(SelectionRect, True);
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.actCopyExecute(Sender: TObject);
|
|
begin
|
|
with cxSpreadBook.ActiveSheet do
|
|
Copy(SelectionRect, False);
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.actPasteExecute(Sender: TObject);
|
|
begin
|
|
with cxSpreadBook.ActiveSheet do
|
|
Paste(SelectionRect.TopLeft);
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.actSaveSpeadSheetExecute(Sender: TObject);
|
|
begin
|
|
SaveSpreadSheet;
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.SaveSpreadSheet;
|
|
var
|
|
AFileName: string;
|
|
begin
|
|
if SaveDialog.Execute then
|
|
begin
|
|
AFileName := ChangeFileExt(SaveDialog.FileName, '.xls');
|
|
cxSpreadBook.SaveToFile(AFileName );
|
|
ActiveMDIChild.Caption := AFileName;
|
|
end;
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.actExitExecute(Sender: TObject);
|
|
begin
|
|
Close;
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.actApplyFormattingUpdate(Sender: TObject);
|
|
begin
|
|
TCustomAction(Sender).Enabled := FIsApplyFormatting;
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.actSaveSpeadSheetUpdate(Sender: TObject);
|
|
begin
|
|
TCustomAction(Sender).Enabled := FSaveSpreadSheet;
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.actLoadDataExecute(Sender: TObject);
|
|
var
|
|
CurCursor : TCursor;
|
|
begin
|
|
CurCursor := Screen.Cursor; // preserve the current cursor
|
|
Screen.Cursor := crHourGlass;
|
|
Try
|
|
cxSpreadBook.BeginUpdate;
|
|
cxSpreadBook.ActivePage := 0; // ensure we are looking at the right page
|
|
CurRow := 3; // set the starting current row
|
|
With Query do // and using our database query
|
|
begin
|
|
Open; // open the data
|
|
While NOT EOF do // and for every record
|
|
begin
|
|
SetCellText(0,CurRow, // set the company name
|
|
FieldByName('CO_NAME').AsString);
|
|
SetCellText(1,CurRow, // the number of shares
|
|
FieldByName('SHARES').AsString);
|
|
SetCellDate(2,CurRow, // the purchase date
|
|
FieldByName('PUR_DATE').AsDateTime);
|
|
SetCellText(3,CurRow, // the purchase price
|
|
FieldByName('PUR_PRICE').AsString);
|
|
SetCellText(4,CurRow, // calculate the purchase cost = number of shares * purchase price
|
|
Format('=B%d*D%d/100',[CurRow+1,CurRow+1]));
|
|
SetCellText(5,CurRow, // the current price
|
|
FieldByName('CUR_PRICE').AsString);
|
|
SetCellText(6,CurRow, // calculate the current valuation = number of shares * current price
|
|
Format('=B%d*F%d/100',[CurRow+1,CurRow+1]));
|
|
SetCellText(7,CurRow, // calculate the gain/loss = current valuation - purchase cost
|
|
Format('=G%d-E%d',[CurRow+1,CurRow+1]));
|
|
SetCellText(8,CurRow, // calculate the % gain/loss
|
|
Format('=H%d/E%d',[CurRow+1,CurRow+1]));
|
|
Next;
|
|
Inc(CurRow); // bump the row number
|
|
end;
|
|
Inc(CurRow);
|
|
SetCellText(4,CurRow, // set the formula for the total purchase cost
|
|
Format('=SUM(E3:E%d)',[CurRow-1]));
|
|
SetCellText(6,CurRow, // total current valuation
|
|
Format('=SUM(G3:G%d)',[CurRow-1]));
|
|
SetCellText(7,CurRow, // total gain/loss
|
|
Format('=SUM(H3:H%d)',[CurRow-1]));
|
|
SetCellText(8,CurRow, // and overall percentage
|
|
Format('=H%d/E%d',[CurRow+1,CurRow+1]));
|
|
First; // back to the first record
|
|
cxSpreadBook.ActivePage := 1; // and move to the second page
|
|
// and repeat the process to setup the data
|
|
CurRow := 3;
|
|
While NOT EOF do
|
|
begin
|
|
SetCellText(0,CurRow, // company name
|
|
FieldByName('CO_NAME').AsString);
|
|
SetCellText(1,CurRow, // current price
|
|
FieldByName('CUR_PRICE').AsString);
|
|
SetCellText(2,CurRow, // year high
|
|
FieldByName('YRL_HIGH').AsString);
|
|
SetCellText(3,CurRow, // year low
|
|
FieldByName('YRL_LOW').AsString);
|
|
SetCellText(4,CurRow, // average of Hi/Lo prices
|
|
Format('=(C%d+D%d)/2',[CurRow+1,CurRow+1]));
|
|
Next;
|
|
Inc(CurRow);
|
|
end;
|
|
Inc(CurRow);
|
|
Close;
|
|
FIsApplyFormatting := True;
|
|
end;
|
|
Finally
|
|
cxSpreadBook.EndUpdate;
|
|
cxSpreadBook.Recalc;
|
|
cxSpreadBook.ActivePage := 0; // back to first page
|
|
Screen.Cursor := CurCursor; // restore original cursor
|
|
end;
|
|
end;
|
|
|
|
function TSpreadSheetRLForm.GetCellText(SelectionRect: TRect; R1C1: Boolean): String;
|
|
begin
|
|
with TcxSSUtils do
|
|
begin
|
|
Result := ColumnNameByIndex(SelectionRect.Left, R1C1) +
|
|
RowNameByIndex(SelectionRect.Top, R1C1);
|
|
if (SelectionRect.Left <> SelectionRect.Right) or (SelectionRect.Top <> SelectionRect.Bottom) then
|
|
Result := Result + ' x ' + ColumnNameByIndex(SelectionRect.Right, R1C1) +
|
|
RowNameByIndex(SelectionRect.Bottom, R1C1);
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TSpreadSheetRLForm.AlwaysEnabled(Sender: TObject);
|
|
begin
|
|
TCustomAction(Sender).Enabled := True;
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.edtCellEditChange(Sender: TObject);
|
|
begin
|
|
if FIsUpdate then Exit;
|
|
with cxSpreadBook do
|
|
begin
|
|
with ActiveSheet.GetCellObject(ActiveSheet.SelectionRect.Left, ActiveSheet.SelectionRect.Top) do
|
|
SetCellText((Sender as TEdit).Text);
|
|
UpdateControl;
|
|
end;
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.edtCellEditExit(Sender: TObject);
|
|
begin
|
|
with cxSpreadBook do
|
|
begin
|
|
with ActiveSheet.GetCellObject(ActiveSheet.SelectionRect.Left, ActiveSheet.SelectionRect.Top) do
|
|
begin
|
|
Text := Text;
|
|
Free;
|
|
end;
|
|
UpdateControl;
|
|
SetFocus;
|
|
end;
|
|
cxSpreadBookSetSelection(Self, cxSpreadBook.ActiveSheet);
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.actApplyFormattingExecute(Sender: TObject);
|
|
var
|
|
CHeader, RHeader : TcxSSHeader;
|
|
I : Integer;
|
|
CurCursor : TCursor;
|
|
begin
|
|
CurCursor := Screen.Cursor; // preserve the current cursor
|
|
Screen.Cursor := crHourGlass;
|
|
FSaveSpreadSheet := False;
|
|
cxSpreadBook.BeginUpdate;
|
|
try
|
|
cxSpreadBook.ActivePage := 0; // ensure we are looking at the first page
|
|
// First set the column widths
|
|
CHeader := cxSpreadBook.ActiveSheet.Cols;
|
|
CHeader.Size[0] := 140;
|
|
for I := 1 to 8 do CHeader.Size[I] := 80;
|
|
// and then the Row heights for the title and column descriptors
|
|
RHeader := cxSpreadBook.ActiveSheet.Rows;
|
|
RHeader.Size[0] := 30;
|
|
RHeader.Size[2] := 30;
|
|
// and do some cell formatting
|
|
SetCellFont(0,0,0,0,[fsBold, fsUnderline],12); // set the title and column header fonts
|
|
SetCellPattern(0,0,8,1,16,1,fsSolid); // and add some cell shading for the sheet title
|
|
SetCellPattern(0,2,8,2,23,1,fsSolid); // and for the column headers
|
|
SetCellPattern(0,2,0,CurRow-2,23,1,fsSolid); // and the company names
|
|
// and now some number formatting
|
|
SetCellFormat(1,3,1,CurRow-1, 3); // Holding Column #,##0
|
|
SetCellFormat(2,3,2,CurRow-1,15); // Date Purchased d-mmm-yy
|
|
SetCellFormat(3,3,6,CurRow-1, 4); // Price/Cost/Value & Worth Column #,##0.00
|
|
SetCellFormat(7,3,7,CurRow-1, 8); // Gain/(Loss) value (#,##0.00_);[Red](#,##0.00)
|
|
SetCellFormat(8,3,8,CurRow-1,10); // Gain/(Loss) percentage 0.00%
|
|
// and now for the totals
|
|
SetCellFormat(4,CurRow,4,CurRow, 8); // Total Purchase Cost ($#,##0.00_);[Red]($#,##0.00)
|
|
SetCellFormat(6,CurRow,7,CurRow, 8); // Total Current Valuation ($#,##0.00_);[Red]($#,##0.00)
|
|
SetCellFormat(8,CurRow,8,CurRow,10); // Total Gain/(Loss) percentage 0.00%
|
|
// now align all the data
|
|
SetCellAlignment(1,3,8,CurRow,haRight,vaCenter); // Right Align all the numeric fields
|
|
// set borders for the totals
|
|
SetCellBorders(4,CurRow,4,CurRow, 1, lsThin); // thin single line at the top of the cell
|
|
SetCellBorders(6,CurRow,6,CurRow, 1, lsThin);
|
|
SetCellBorders(7,CurRow,7,CurRow, 1, lsThin);
|
|
SetCellBorders(4,CurRow,4,CurRow, 3, lsDouble); // double line at the bottom of the cell
|
|
SetCellBorders(6,CurRow,6,CurRow, 3, lsDouble); // ditto
|
|
SetCellBorders(7,CurRow,7,CurRow, 3, lsDouble); // ditto
|
|
|
|
// and now a similar process for the Hi/Lo valuations page
|
|
cxSpreadBook.ActivePage := 1; // ensure we are looking at the second page
|
|
// First set the column widths
|
|
CHeader := cxSpreadBook.ActiveSheet.Cols;
|
|
CHeader.Size[0] := 140;
|
|
for I := 1 to 4 do CHeader.Size[I] := 80;
|
|
// and then the Row heights for the title and column descriptors
|
|
RHeader := cxSpreadBook.ActiveSheet.Rows;
|
|
RHeader.Size[0] := 30;
|
|
RHeader.Size[2] := 30;
|
|
SetCellFont(0,0,0,0,[fsBold, fsUnderline],12);
|
|
// and now adding some cell shading
|
|
SetCellPattern(0,0,4,1,16,1,fsSolid); // for the sheet title
|
|
SetCellPattern(0,2,4,2,23,1,fsSolid); // for the column headers
|
|
SetCellPattern(0,2,0,CurRow-2,23,1,fsSolid); // and the company names
|
|
SetCellFormat(1,3,4,CurRow-1, 4); // Current, Hi, Lo and Average #,##0.00
|
|
SetCellAlignment(1,3,4,CurRow,haRight,vaCenter); // Right Align all the numeric fields
|
|
|
|
finally
|
|
FSaveSpreadSheet := True; // enable the save spreadsheet button
|
|
cxSpreadBook.ActivePage := 0; // return to the first page
|
|
cxSpreadBook.EndUpdate;
|
|
Screen.Cursor := CurCursor;
|
|
end;
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.FormCreate(Sender: TObject);
|
|
begin
|
|
FSaveSpreadSheet := False;
|
|
FIsApplyFormatting := False;
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.actPreviewExecute(Sender: TObject);
|
|
begin
|
|
dxComponentPrinter.ReportLink[0].Preview;
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.actPrintExecute(Sender: TObject);
|
|
begin
|
|
dxComponentPrinter.ReportLink[0].Print(True, nil);
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.actSetPrintAreaExecute(Sender: TObject);
|
|
var
|
|
R: TRect;
|
|
begin
|
|
R := cxSpreadBook.ActiveSheet.SelectionRect;
|
|
if (R.Right <> R.Left) or (R.Bottom <> R.Top) or (MessageDlg(sdxInvalidPrintArea, mtWarning, [mbOK, mbCancel], 0) = mrOK) then
|
|
TCustomdxSpreadSheetReportLink(dxComponentPrinter.ReportLink[0]).PrintArea := R;
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.actClearPrintAreaExecute(Sender: TObject);
|
|
begin
|
|
TCustomdxSpreadSheetReportLink(dxComponentPrinter.ReportLink[0]).ClearPrintArea;
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.actPrintSetupExecute(Sender: TObject);
|
|
begin
|
|
dxComponentPrinter.ReportLink[0].PageSetup;
|
|
end;
|
|
|
|
procedure TSpreadSheetRLForm.cxSpreadBookActiveSheetChanging(
|
|
Sender: TcxCustomSpreadSheetBook; const ActiveSheet: Integer;
|
|
var CanSelect: Boolean);
|
|
begin
|
|
if CanSelect then TCustomdxSpreadSheetReportLink(dxComponentPrinter.ReportLink[0]).ClearPrintArea;
|
|
end;
|
|
|
|
end.
|
|
|