diff --git a/components/jvcllaz/examples/JvChartDemo/JvChartDemo.lpi b/components/jvcllaz/examples/JvChartDemo/JvChartDemo.lpi index 1a4e7d2a3..496c2890b 100644 --- a/components/jvcllaz/examples/JvChartDemo/JvChartDemo.lpi +++ b/components/jvcllaz/examples/JvChartDemo/JvChartDemo.lpi @@ -54,6 +54,13 @@ + + + + + + + diff --git a/components/jvcllaz/examples/JvChartDemo/JvChartDemo.lpr b/components/jvcllaz/examples/JvChartDemo/JvChartDemo.lpr index d0ccaa902..188fba0f3 100644 --- a/components/jvcllaz/examples/JvChartDemo/JvChartDemo.lpr +++ b/components/jvcllaz/examples/JvChartDemo/JvChartDemo.lpr @@ -6,7 +6,7 @@ uses Interfaces, Forms, printer4lazarus, JvChartDemoFm in 'JvChartDemoFm.pas' {JvChartDemoForm}, - StatsClasses in 'StatsClasses.pas'; + StatsClasses in 'StatsClasses.pas', jvPenEditor; {$R *.res} diff --git a/components/jvcllaz/examples/JvChartDemo/jvchartdemofm.lfm b/components/jvcllaz/examples/JvChartDemo/jvchartdemofm.lfm index c9c54bcff..998ab2019 100644 --- a/components/jvcllaz/examples/JvChartDemo/jvchartdemofm.lfm +++ b/components/jvcllaz/examples/JvChartDemo/jvchartdemofm.lfm @@ -18,7 +18,6 @@ object JvChartDemoForm: TJvChartDemoForm Height = 398 Top = 35 Width = 625 - Font.Height = -19 Align = alClient Options.XAxisValuesPerDivision = 10 Options.XAxisLabelAlignment = taLeftJustify @@ -29,6 +28,7 @@ object JvChartDemoForm: TJvChartDemoForm Options.XGap = 0 Options.XOrigin = 0 Options.YOrigin = 0 + Options.XStartOffset = 60 Options.YStartOffset = 42 Options.PrimaryYAxis.YMax = 20 Options.PrimaryYAxis.YMin = 0 @@ -47,11 +47,13 @@ object JvChartDemoForm: TJvChartDemoForm Options.HeaderFont.Color = clWindowText Options.LegendFont.Color = clWindowText Options.AxisFont.Color = clWindowText + Options.AxisTitleFont.Height = -16 + Options.AxisTitleFont.Orientation = 900 + Options.AxisTitleFont.Style = [fsBold] Options.PaperColor = clWhite Options.AxisLineColor = clBlack Options.CursorColor = clBlack Options.CursorStyle = psDot - OnChartPaint = ChartChartPaint OnBeginFloatingMarkerDrag = ChartBeginFloatingMarkerDrag OnEndFloatingMarkerDrag = ChartEndFloatingMarkerDrag end @@ -186,7 +188,7 @@ object JvChartDemoForm: TJvChartDemoForm ParentShowHint = False end object ButtonBarAve: TSpeedButton - Left = 31 + Left = 32 Height = 25 Hint = 'Bar Chart with Average Line' Top = 5 @@ -354,6 +356,15 @@ object JvChartDemoForm: TJvChartDemoForm ShowHint = True ParentShowHint = False end + object SpinEdit1: TSpinEdit + Left = 656 + Height = 24 + Top = 6 + Width = 66 + MaxValue = 1000 + OnChange = SpinEdit1Change + TabOrder = 0 + end end object ListBox1: TListBox Left = 0 @@ -417,21 +428,84 @@ object JvChartDemoForm: TJvChartDemoForm top = 48 object Demo1: TMenuItem Caption = '&Demo' - object mnuSetHeaderFont: TMenuItem - Caption = 'Set Header Font...' - OnClick = mnuSetHeaderFontClick + object MenuItem2: TMenuItem + Caption = '-' end - object mnuSetAxisTitlefont: TMenuItem - Caption = 'Set Axis Title Font...' - OnClick = mnuSetAxisTitlefontClick + object mnuSetXAxisHeader: TMenuItem + Caption = 'Set X Axis Header...' + OnClick = mnuSetXAxisHeaderClick end - object mnuSetAxisFont: TMenuItem - Caption = 'Set Axis Label Font...' - OnClick = mnuSetAxisFontClick + object mnuSetYAxisHeader: TMenuItem + Caption = 'Set Y Axis Header...' + OnClick = mnuSetYAxisHeaderClick end - object mnuSetLegendFont: TMenuItem - Caption = 'Set Legend Font...' - OnClick = mnuSetLegendFontClick + object mnuSetMarkerSize: TMenuItem + Caption = 'Set Marker Size...' + OnClick = mnuSetMarkerSizeClick + end + object MenuItem3: TMenuItem + Caption = '-' + end + object mnuFonts: TMenuItem + Caption = 'Fonts' + object mnuSetHeaderFont: TMenuItem + Caption = 'Set Header Font...' + OnClick = mnuSetHeaderFontClick + end + object mnuSetAxisTitlefont: TMenuItem + Caption = 'Set Axis Title Font...' + OnClick = mnuSetAxisTitlefontClick + end + object mnuSetAxisFont: TMenuItem + Caption = 'Set Axis Label Font...' + OnClick = mnuSetAxisFontClick + end + object mnuSetLegendFont: TMenuItem + Caption = 'Set Legend Font...' + OnClick = mnuSetLegendFontClick + end + end + object mnuColors: TMenuItem + Caption = 'Colors' + object mnuSetPaperColor: TMenuItem + Caption = 'Set Paper Color...' + OnClick = mnuSetPaperColorClick + end + object mnuSetDivisionLineColor: TMenuItem + Caption = 'Set Division Line Color...' + OnClick = mnuSetDivisionLineColorClick + end + object mnuSetShadowColor: TMenuItem + Caption = 'Set Shadow Color..' + OnClick = mnuSetShadowColorClick + end + object mnuSetCursorColor: TMenuItem + Caption = 'Set Cursor Color...' + OnClick = mnuSetCursorColorClick + end + object mnuSetHintColor: TMenuItem + Caption = 'Set Hint Color...' + OnClick = mnuSetHintColorClick + end + end + object mnuSetLineWidths: TMenuItem + Caption = 'Line Widths' + object mnuSetAxisLineWidth: TMenuItem + Caption = 'Set Axis Line Width...' + OnClick = mnuSetAxisLineWidthClick + end + object mnuSetPenLineWidth: TMenuItem + Caption = 'Set Pen Line Width...' + OnClick = mnuSetPenLineWidthClick + end + end + object mnuPens: TMenuItem + Caption = 'Pens...' + OnClick = mnuPensClick + end + object mnuSetXStartOffset: TMenuItem + Caption = 'X Start Offset...' + OnClick = mnuSetXStartOffsetClick end object N2: TMenuItem Caption = '-' diff --git a/components/jvcllaz/examples/JvChartDemo/jvchartdemofm.pas b/components/jvcllaz/examples/JvChartDemo/jvchartdemofm.pas index 1aa656607..20ce2ee86 100644 --- a/components/jvcllaz/examples/JvChartDemo/jvchartdemofm.pas +++ b/components/jvcllaz/examples/JvChartDemo/jvchartdemofm.pas @@ -46,6 +46,23 @@ type { TJvChartDemoForm } TJvChartDemoForm = class(TForm) + mnuSetXStartOffset: TMenuItem; + mnuSetPenLineWidth: TMenuItem; + mnuSetAxisLineWidth: TMenuItem; + mnuSetLineWidths: TMenuItem; + mnuSetHintColor: TMenuItem; + mnuSetCursorColor: TMenuItem; + mnuPens: TMenuItem; + mnuSetPaperColor: TMenuItem; + mnuSetShadowColor: TMenuItem; + mnuFonts: TMenuItem; + mnuSetDivisionLineColor: TMenuItem; + mnuColors: TMenuItem; + MenuItem3: TMenuItem; + mnuSetMarkerSize: TMenuItem; + mnuSetYAxisHeader: TMenuItem; + mnuSetXAxisHeader: TMenuItem; + MenuItem2: TMenuItem; mnuSetAxisTitlefont: TMenuItem; mnuSetLegendFont: TMenuItem; mnuSetHeaderFont: TMenuItem; @@ -76,6 +93,7 @@ type mnuSetAxisFont: TMenuItem; mnuScrolling: TMenuItem; ListBox1: TListBox; + SpinEdit1: TSpinEdit; Splitter1: TSplitter; Timer1: TTimer; ShowDataInListbox1: TMenuItem; @@ -94,6 +112,11 @@ type procedure ButtonBarChartClick(Sender: TObject); procedure ButtonStackedBarAveClick(Sender: TObject); procedure ButtonStackedBarClick(Sender: TObject); + procedure mnuSetAxisLineWidthClick(Sender: TObject); + procedure mnuSetCursorColorClick(Sender: TObject); + procedure mnuSetHintColorClick(Sender: TObject); + procedure mnuSetPenLineWidthClick(Sender: TObject); + procedure mnuSetXStartOffsetClick(Sender: TObject); procedure SpeedButton7Click(Sender: TObject); procedure ButtonBarAveClick(Sender: TObject); procedure SpinEdit1Change(Sender: TObject); @@ -120,6 +143,7 @@ type procedure PrintOptions1Click(Sender: TObject); procedure MenuSecondaryAxisModeClick(Sender: TObject); + procedure ListBox1Click(Sender: TObject); procedure ListBox1DblClick(Sender: TObject); @@ -127,6 +151,15 @@ type procedure mnuSetAxisTitlefontClick(Sender: TObject); procedure mnuSetHeaderFontClick(Sender: TObject); procedure mnuSetLegendFontClick(Sender: TObject); + procedure mnuSetMarkerSizeClick(Sender: TObject); + procedure mnuSetPaperColorClick(Sender: TObject); + procedure mnuPensClick(Sender: TObject); + procedure mnuSetShadowColorClick(Sender: TObject); + procedure mnuSetXAxisHeaderClick(Sender: TObject); + procedure mnuSetYAxisHeaderClick(Sender: TObject); + + procedure mnuSetDivisionLineColorClick(Sender: TObject); + procedure mnuSetPenCountClick(Sender: TObject); procedure MenuNegValueTestClick(Sender: TObject); procedure SpeedButtonTestMouseOverClick(Sender: TObject); @@ -134,7 +167,6 @@ type FloatingMarker: TJvChartFloatingMarker); procedure ChartBeginFloatingMarkerDrag(Sender: TJvChart; FloatingMarker: TJvChartFloatingMarker); - procedure ChartChartPaint(Sender: TJvChart; aCanvas: TCanvas); procedure NewFeaturesfor20071Click(Sender: TObject); private @@ -150,6 +182,7 @@ type procedure _Generate; procedure _StoreValue(I: integer); function _QAProblemScatter: Integer; + procedure MakePensMenu; public procedure NewValues; @@ -161,12 +194,17 @@ var implementation uses - LCLIntf, // OpenURL LCLType, // MB_OK - Math; // Math:NaN handling, function isNan in D6 and higher. + Math, // Math:NaN handling, function isNan in D6 and higher. + JvPenEditor; {$R *.lfm} +const + TAG_PENCOLORS = 991; + MAX_PEN = 100; + + { Bogus vageuly sinusoidal signal generator } procedure TJvChartDemoForm._Generate; @@ -472,7 +510,6 @@ procedure TJvChartDemoForm.ButtonBarChartClick(Sender: TObject); begin Chart.Options.ChartKind := ckChartBar; NewValues; - //Chart.PlotGraph; end; procedure TJvChartDemoForm.ButtonLineClick(Sender: TObject); @@ -523,7 +560,6 @@ begin Chart.Options.ChartKind := ckChartBarAverage; NewValues; - //Chart.Plo end; procedure TJvChartDemoForm.ButtonPieClick(Sender: TObject); @@ -540,6 +576,9 @@ end; procedure TJvChartDemoForm.SpinEdit1Change(Sender: TObject); begin +// Chart.Options.PrimaryYAxis.YPixelGap := SpinEdit1.Value; +// Chart.Options.YStartOffset := SpinEdit1.Value; + Chart.Options.XStartOffset := SpinEdit1.Value; // Chart.Options.ColorScheme := SpinEdit1.Value; // Chart.PlotGraph; end; @@ -562,6 +601,8 @@ end; procedure TJvChartDemoForm.FormCreate(Sender: TObject); begin + MakePensMenu; + FStatHgt := TStatArray.Create(10); // Initialize for rolling average of last 10 samples. FStatHg0 := TStatArray.Create(10); @@ -600,6 +641,28 @@ begin Chart.GraphToClipboard; end; +procedure TJvChartDemoForm.MakePensMenu; +var + i: Integer; + mnu: TMenuItem; +begin + for i := mnuPens.Count-1 downto 0 do begin + mnu := mnuPens.Items[i]; + if (mnu <> nil) and (mnu.Tag >= TAG_PENCOLORS) and (mnu.tag < TAG_PENCOLORS + MAX_PEN) then + mnuPens.Delete(i); + end; + (* + for i:=0 to Chart.Options.PenCount - 1do + begin + mnu := TMenuItem.Create(mnuPens); + mnu.Caption := 'Set Pen ' + IntToStr(i + 1); + mnu.Tag := TAG_PENCOLORS + i; + mnu.OnClick := @mnuSetPen; + mnuPens.Add(mnu); + end; + *) +end; + procedure TJvChartDemoForm.mnuSetAxisFontClick(Sender: TObject); begin {Get the current font for the axis label texts...} @@ -609,19 +672,43 @@ begin {Set the font for the Header text...} Chart.Options.AxisFont := FontDialog1.Font; Chart.PlotGraph; -// Chart.Invalidate; end; -procedure TJvChartDemoForm.mnuSetAxisTitlefontClick(Sender: TObject); +procedure TJvChartDemoForm.mnuSetAxisLineWidthClick(Sender: TObject); +var + s: String; + w: Integer; +begin + s := InputBox('Set Axis Linewidth', 'Value:', IntToStr(Chart.Options.AxisLineWidth)); + if TryStrToInt(s, w) and (w > 0) then + Chart.Options.AxisLineWidth := w + else + MessageDlg('No valid number for axis linewidth', mtError, [mbOk], 0); +end; + +procedure TJvChartDemoForm.mnuSetAxisTitleFontClick(Sender: TObject); begin {Get the current font for the axis titles...} - FontDialog1.Font.Assign(Chart.Font); + FontDialog1.Font.Assign(Chart.Options.AxisTitleFont); - if FontDialog1.Execute then - {Set the font for the Header text...} - Chart.Font := FontDialog1.Font; - Chart.PlotGraph; - Chart.Invalidate; + if FontDialog1.Execute then + {Set the font for the Header text...} + Chart.Options.AxisTitleFont := FontDialog1.Font; + Chart.PlotGraph; +end; + +procedure TJvChartDemoForm.mnuSetCursorColorClick(Sender: TObject); +begin + ColorDialog1.Color := Chart.Options.CursorColor; + if ColorDialog1.Execute then + Chart.Options.CursorColor := ColorDialog1.Color; +end; + +procedure TJvChartDemoForm.mnuSetDivisionLineColorClick(Sender: TObject); +begin + ColorDialog1.Color := Chart.Options.DivisionLineColor; + if ColorDialog1.Execute then + Chart.Options.DivisionLineColor := ColorDialog1.Color; end; procedure TJvChartDemoForm.mnuSetHeaderFontClick(Sender: TObject); @@ -633,7 +720,13 @@ begin {Set the font for the Header text...} Chart.Options.HeaderFont := FontDialog1.Font; Chart.PlotGraph; -// Chart.Invalidate; +end; + +procedure TJvChartDemoForm.mnuSetHintColorClick(Sender: TObject); +begin + ColorDialog1.Color := Chart.Options.HintColor; + if ColorDialog1.Execute then + Chart.Options.HintColor := ColorDialog1.Color; end; procedure TJvChartDemoForm.mnuSetLegendFontClick(Sender: TObject); @@ -645,7 +738,84 @@ begin {Set the font for the Header text...} Chart.Options.LegendFont := FontDialog1.Font; Chart.PlotGraph; -// Chart.Invalidate; +end; + +procedure TJvChartDemoForm.mnuSetMarkerSizeClick(Sender: TObject); +var + s: String; +begin + s := InputBox('Set Marker Size', 'Value:', IntToStr(Chart.Options.MarkerSize)); + Chart.Options.MarkerSize := StrToInt(s); +end; + +procedure TJvChartDemoForm.mnuSetPaperColorClick(Sender: TObject); +begin + ColorDialog1.Color := Chart.Options.PaperColor; + if ColorDialog1.Execute then + Chart.Options.PaperColor := ColorDialog1.Color; +end; + + +procedure TJvChartDemoForm.mnuSetPenCountClick(Sender: TObject); +var + s: String; + n: Integer; +begin + s := InputBox('Set pen count', 'Value:', IntToStr(Chart.Options.PenCount)); + if TryStrToInt(s, n) then + begin + Chart.Options.PenCount := n; + //MakePenColorMenu; + end else + MessageDlg('No valid number of pens.', mtError, [mbOK], 0); + +end; + +procedure TJvChartDemoForm.mnuSetPenLineWidthClick(Sender: TObject); +var + s: String; + w: Integer; +begin + s := InputBox('Set Pen Linewidth', 'Value:', IntToStr(Chart.Options.PenLineWidth)); + if TryStrToInt(s, w) and (w > 0) then + Chart.Options.PenLineWidth := w + else + MessageDlg('No valid number for pen linewidth', mtError, [mbOk], 0); +end; + +procedure TJvChartDemoForm.mnuSetShadowColorClick(Sender: TObject); +begin + ColorDialog1.Color := Chart.Options.ShadowColor; + if ColorDialog1.Execute then + Chart.Options.ShadowColor := ColorDialog1.Color; +end; + +procedure TJvChartDemoForm.mnuSetXAxisHeaderClick(Sender: TObject); +var + s: String; +begin + s := InputBox('Set X Axis Title', 'Text:', Chart.Options.XAxisHeader); + Chart.Options.XAxisHeader := s; +end; + +procedure TJvChartDemoForm.mnuSetXStartOffsetClick(Sender: TObject); +var + s: String; + x: Integer; +begin + s := InputBox('Set X Axis Start Offset', 'Value:', IntToStr(Chart.Options.XStartOffset)); + if TryStrToInt(s, x) and (x >= 0) then + Chart.Options.XStartOffset := x + else + MessageDlg('No valid number for X Start Offset.', mtError, [mbOK], 0); +end; + +procedure TJvChartDemoForm.mnuSetYAxisHeaderClick(Sender: TObject); +var + s: String; +begin + s := InputBox('Set Y Axis Title', 'Text:', Chart.Options.YAxisHeader); + Chart.Options.YAxisHeader := s; end; procedure TJvChartDemoForm.About1Click(Sender: TObject); @@ -725,6 +895,20 @@ begin NewValues; end; +procedure TJvChartDemoForm.mnuPensClick(Sender: TObject); +var + F: TPenEditorForm; +begin + F := TPenEditorForm.Create(nil); + try + F.UseChart(Chart); + if F.ShowModal = mrOK then + F.ApplyToChart(Chart); + finally + F.Free; + end; +end; + procedure TJvChartDemoForm.ListBox1DblClick(Sender: TObject); begin Chart.CursorPosition := ListBox1.ItemIndex; // Highlight one sample. @@ -812,14 +996,7 @@ begin draggableCursor.Caption := FloatToStrF( Chart.Data.Value[0,draggableCursor.XPosition], ffFixed, 6,4 ); draggableCursor.Visible := true; - - - - - Chart.PlotGraph; - - end; procedure TJvChartDemoForm.ChartEndFloatingMarkerDrag(Sender: TJvChart; @@ -830,25 +1007,13 @@ begin FloatingMarker.YPosition := Chart.Data.Value[0, FloatingMarker.XPosition] else // update caption FloatingMarker.Caption := FloatToStrF( Chart.Data.Value[0,FloatingMarker.XPosition],ffFixed,6,4 ); - - end; procedure TJvChartDemoForm.ChartBeginFloatingMarkerDrag(Sender: TJvChart; FloatingMarker: TJvChartFloatingMarker); begin - if FloatingMarker.Index=2 then - FloatingMarker.Caption := '?'; - -end; - -procedure TJvChartDemoForm.ChartChartPaint(Sender: TJvChart; - aCanvas: TCanvas); -begin - aCanvas.Pen.Color := clRed; - aCanvas.Pen.Style := psSolid; - aCanvas.MoveTo(0,0); - aCanvas.LineTo(100,100); + if FloatingMarker.Index = 2 then + FloatingMarker.Caption := '?'; end; end. diff --git a/components/jvcllaz/examples/JvChartDemo/jvpeneditor.lfm b/components/jvcllaz/examples/JvChartDemo/jvpeneditor.lfm new file mode 100644 index 000000000..ea0076132 --- /dev/null +++ b/components/jvcllaz/examples/JvChartDemo/jvpeneditor.lfm @@ -0,0 +1,156 @@ +object PenEditorForm: TPenEditorForm + Left = 347 + Height = 291 + Top = 128 + Width = 505 + Caption = 'PenEditorForm' + ClientHeight = 291 + ClientWidth = 505 + OnCreate = FormCreate + OnDestroy = FormDestroy + LCLVersion = '2.1.0.0' + object btnPenColor: TButton + Left = 224 + Height = 25 + Top = 128 + Width = 64 + AutoSize = True + Caption = 'Color...' + OnClick = btnPenColorClick + TabOrder = 0 + end + object rgPenStyle: TRadioGroup + Left = 224 + Height = 80 + Top = 40 + Width = 265 + AutoFill = True + Caption = 'Style' + ChildSizing.LeftRightSpacing = 6 + ChildSizing.EnlargeHorizontal = crsHomogenousChildResize + ChildSizing.EnlargeVertical = crsHomogenousChildResize + ChildSizing.ShrinkHorizontal = crsScaleChilds + ChildSizing.ShrinkVertical = crsScaleChilds + ChildSizing.Layout = cclLeftToRightThenTopToBottom + ChildSizing.ControlsPerLine = 3 + ClientHeight = 60 + ClientWidth = 261 + Columns = 3 + Items.Strings = ( + 'Solid' + 'Dash' + 'Dot' + 'Dash-dot' + 'Dash-dot-dot' + 'Clear' + ) + OnClick = rgPenStyleClick + TabOrder = 1 + end + object ButtonPanel1: TButtonPanel + Left = 6 + Height = 34 + Top = 251 + Width = 493 + OKButton.Name = 'OKButton' + OKButton.DefaultCaption = True + HelpButton.Name = 'HelpButton' + HelpButton.DefaultCaption = True + CloseButton.Name = 'CloseButton' + CloseButton.DefaultCaption = True + CancelButton.Name = 'CancelButton' + CancelButton.DefaultCaption = True + TabOrder = 2 + ShowButtons = [pbOK, pbCancel] + end + object lbPens: TListBox + Left = 8 + Height = 200 + Top = 8 + Width = 200 + ItemHeight = 0 + OnDrawItem = lbPensDrawItem + OnSelectionChange = lbPensSelectionChange + Style = lbOwnerDrawFixed + TabOrder = 3 + end + object btnAdd: TButton + Left = 11 + Height = 25 + Top = 216 + Width = 48 + AutoSize = True + Caption = 'Add' + OnClick = btnAddClick + TabOrder = 4 + end + object btnDelete: TButton + Left = 64 + Height = 25 + Top = 216 + Width = 59 + AutoSize = True + Caption = 'Delete' + OnClick = btnDeleteClick + TabOrder = 5 + end + object edPenLegend: TEdit + Left = 304 + Height = 23 + Top = 8 + Width = 185 + OnEditingDone = edPenLegendEditingDone + TabOrder = 6 + end + object btnClear: TButton + Left = 128 + Height = 25 + Top = 216 + Width = 53 + AutoSize = True + Caption = 'Clear' + OnClick = btnClearClick + TabOrder = 7 + end + object lblLegend: TLabel + Left = 224 + Height = 15 + Top = 8 + Width = 39 + Caption = 'Legend' + ParentColor = False + end + object ColorSample: TShape + Left = 304 + Height = 25 + Top = 128 + Width = 25 + end + object ColorDialog: TColorDialog + Color = clBlack + CustomColors.Strings = ( + 'ColorA=000000' + 'ColorB=000080' + 'ColorC=008000' + 'ColorD=008080' + 'ColorE=800000' + 'ColorF=800080' + 'ColorG=808000' + 'ColorH=808080' + 'ColorI=C0C0C0' + 'ColorJ=0000FF' + 'ColorK=00FF00' + 'ColorL=00FFFF' + 'ColorM=FF0000' + 'ColorN=FF00FF' + 'ColorO=FFFF00' + 'ColorP=FFFFFF' + 'ColorQ=C0DCC0' + 'ColorR=F0CAA6' + 'ColorS=F0FBFF' + 'ColorT=A4A0A0' + ) + left = 243 + top = 168 + end +end diff --git a/components/jvcllaz/examples/JvChartDemo/jvpeneditor.pas b/components/jvcllaz/examples/JvChartDemo/jvpeneditor.pas new file mode 100644 index 000000000..de9629bf0 --- /dev/null +++ b/components/jvcllaz/examples/JvChartDemo/jvpeneditor.pas @@ -0,0 +1,265 @@ +unit jvPenEditor; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls, + Spin, ButtonPanel,Contnrs, + JvChart, Types; + +type + TPenObj = class + Legend: String; + Color: TColor; + Style: TPenStyle; + end; + + { TPenEditorForm } + + TPenEditorForm = class(TForm) + btnPenColor: TButton; + btnAdd: TButton; + btnDelete: TButton; + btnClear: TButton; + ButtonPanel1: TButtonPanel; + ColorDialog: TColorDialog; + edPenLegend: TEdit; + lblLegend: TLabel; + lbPens: TListBox; + rgPenStyle: TRadioGroup; + ColorSample: TShape; + procedure btnAddClick(Sender: TObject); + procedure btnClearClick(Sender: TObject); + procedure btnDeleteClick(Sender: TObject); + procedure btnPenColorClick(Sender: TObject); + procedure edPenLegendEditingDone(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure lbPensDrawItem(Control: TWinControl; Index: Integer; + ARect: TRect; State: TOwnerDrawState); + procedure lbPensSelectionChange(Sender: TObject; User: boolean); + procedure rgPenStyleClick(Sender: TObject); + private + FPens: TObjectList; + procedure ControlsToPen(AIndex: Integer); + procedure PenToControls(AIndex: Integer); + function GetCurrentPen: TPenObj; + + public + procedure ApplyToChart(AChart: TJvChart); + procedure UseChart(AChart: TJvChart); + + end; + + +implementation + +{$R *.lfm} + +uses + LCLType; + + +{ TPenEditorForm } + +procedure TPenEditorForm.ApplyToChart(AChart: TJvChart); +var + i: Integer; + pen: TPenObj; +begin + Assert(AChart <> nil); + AChart.Options.PenCount := FPens.Count; + AChart.Options.PenLegends.Clear; + for i := 0 to FPens.Count - 1 do + begin + pen := TPenObj(FPens[i]); + AChart.Options.PenLegends.Add(pen.Legend); + AChart.Options.PenColor[i] := pen.Color; + AChart.Options.PenStyle[i] := pen.Style; + end; +end; + +procedure TPenEditorForm.btnAddClick(Sender: TObject); +var + pen: TPenObj; +begin + pen := TPenObj.Create; + pen.Legend := ''; + pen.Style := psSolid; + pen.Color := clBlack; + FPens.Add(pen); + lbPens.Items.Add(''); +end; + +procedure TPenEditorForm.btnClearClick(Sender: TObject); +begin + FPens.Clear; + lbPens.Items.Clear; +end; + +procedure TPenEditorForm.btnDeleteClick(Sender: TObject); +begin + if lbPens.ItemIndex = -1 then + exit; + FPens.Delete(lbPens.ItemIndex); + lbPens.Items.Delete(lbPens.ItemIndex); +end; + +procedure TPenEditorForm.btnPenColorClick(Sender: TObject); +var + pen: TPenObj; +begin + pen := GetCurrentPen; + if pen = nil then + exit; + + ColorDialog.Color := pen.Color; + if ColorDialog.Execute then begin + pen.Color := ColorDialog.Color; + lbPens.Invalidate; + end; +end; + +procedure TPenEditorForm.ControlsToPen(AIndex: Integer); +var + pen: TPenObj; +begin + if AIndex = -1 then + exit; + pen := TPenObj(FPens[AIndex]); + pen.Legend := edPenLegend.Text; + if rgPenStyle.ItemIndex = rgPenStyle.Items.Count-1 then + pen.Style := psClear + else + pen.Style := TPenStyle(rgPenStyle.ItemIndex); + pen.Color := ColorSample.Brush.Color; +end; + +procedure TPenEditorForm.edPenLegendEditingDone(Sender: TObject); +var + pen: TPenObj; +begin + pen := GetCurrentPen; + if pen = nil then + exit; + pen.Legend := edPenLegend.Text; + lbPens.Invalidate; +end; + +procedure TPenEditorForm.FormCreate(Sender: TObject); +begin + FPens := TObjectList.Create; +end; + +procedure TPenEditorForm.FormDestroy(Sender: TObject); +begin + FPens.Free; +end; + +function TPenEditorForm.GetCurrentPen: TPenObj; +begin + if lbPens.ItemIndex = -1 then + Result := nil + else + Result := TPenObj(FPens[lbPens.ItemIndex]); +end; + +procedure TPenEditorForm.lbPensDrawItem(Control: TWinControl; Index: Integer; + ARect: TRect; State: TOwnerDrawState); +var + R: TRect; + pen: TPenObj; +begin + pen := TPenObj(FPens[Index]); + lbPens.Canvas.Font.Assign(lbPens.Font); + if [odSelected, odFocused] * State <> [] then + begin + lbPens.Canvas.Brush.Color := clHighlight; + lbPens.Canvas.Font.Color := clHighlightText; + end else + begin + lbPens.Canvas.Brush.Color := lbPens.Color; + lbPens.Canvas.Font.Color := lbPens.Font.Color; + end; + lbPens.Canvas.FillRect(ARect); + R := ARect; + R.Right := R.Left + 50; + InflateRect(R, -2, 0); + lbPens.Canvas.Pen.Style := pen.Style; + lbPens.Canvas.Pen.Color := pen.Color; + lbPens.Canvas.Line(R.Left, (R.Top + R.Bottom) div 2, R.Right, (R.Top + R.Bottom) div 2); + lbPens.Canvas.TextOut(R.Right + 2, (R.Top + R.Bottom - lbPens.Canvas.TextHeight('Rg')) div 2, pen.Legend); + if odFocused in State then + lbPens.Canvas.DrawFocusRect(ARect); +end; + +procedure TPenEditorForm.lbPensSelectionChange(Sender: TObject; User: boolean); +begin + PenToControls(lbPens.ItemIndex); +end; + +procedure TPenEditorForm.PenToControls(AIndex: Integer); +var + pen: TPenObj; +begin + if AIndex = -1 then + exit; + + pen := TPenObj(FPens[AIndex]); + edPenLegend.Text := pen.Legend; + if pen.Style = psClear then + rgPenStyle.ItemIndex := rgPenStyle.Items.Count-1 + else + rgPenStyle.ItemIndex := ord(pen.Style); + ColorSample.Brush.Color := pen.Color; + + edPenLegend.Enabled := true; + rgPenStyle.Enabled := true; + btnPenColor.Enabled := true; + ColorSample.Visible := true; +end; + +procedure TPenEditorForm.rgPenStyleClick(Sender: TObject); +var + pen: TPenObj; +begin + pen := GetCurrentPen; + if pen = nil then + exit; + + if rgPenStyle.itemIndex = rgPenStyle.Items.Count -1 then + pen.Style := psClear + else + pen.Style := TPenStyle(rgPenStyle.ItemIndex); + lbPens.Invalidate; +end; + +procedure TPenEditorForm.UseChart(AChart: TJvChart); +var + i: Integer; + pen: TPenObj; +begin + Assert(AChart <> nil); + + FPens.Clear; + lbPens.Items.Clear; + for i := 0 to AChart.Options.PenLegends.Count - 1 do + begin + pen := TPenObj.Create; + pen.Legend := AChart.Options.PenLegends[i]; + pen.Color := AChart.Options.PenColor[i]; + pen.Style := AChart.Options.PenStyle[i]; + FPens.Add(pen); + lbPens.Items.Add(''); + end; + + edPenLegend.Enabled := false; + rgpenStyle.Enabled := false; + btnPenColor.Enabled := false; + ColorSample.Visible := false; +end; + +end. + diff --git a/components/jvcllaz/run/JvCustomControls/jvchart.pas b/components/jvcllaz/run/JvCustomControls/jvchart.pas index 8686b06ee..90acffdb7 100644 --- a/components/jvcllaz/run/JvCustomControls/jvchart.pas +++ b/components/jvcllaz/run/JvCustomControls/jvchart.pas @@ -112,6 +112,7 @@ const JvDefaultAvgLineColor = TColor($00EEDDDD); JvDefaultDivisionLineColor = clLtGray; //NEW! JvDefaultShadowColor = clLtGray; //NEW! + JvDefaultPaperColor = clWhite; JvDefaultYLegends = 20; MaxShowXValueInLegends = 10; @@ -391,6 +392,7 @@ type function GetYLegends: TStrings; procedure SetYLegends(Value: TStrings); procedure SetYDivisions(AValue: Integer); + procedure SetYPixelGap(AValue: Double); public constructor Create(Owner: TJvChartOptions); virtual; destructor Destroy; override; @@ -398,7 +400,7 @@ type procedure Normalize; procedure Clear; // runtime only properties - property YPixelGap: Double read FYPixelGap write FYPixelGap; + property YPixelGap: Double read FYPixelGap write SetYPixelGap; property Active: Boolean read FActive; property YGap: Double read FYGap; property YGap1: Double read FYGap1; // Gap multiplication factor for value scaling. @@ -424,21 +426,15 @@ type function GetAverageValue(Index: Integer): Double; procedure SetAverageValue(Index: Integer; AValue: Double); function GetPenColor(Index: Integer): TColor; - procedure SetPenColor(Index: Integer; AColor: TColor); function GetPenStyle(Index: Integer): TPenStyle; - procedure SetPenStyle(Index: Integer; APenStyle: TPenStyle); function GetPenMarkerKind(Index: Integer): TJvChartPenMarkerKind; procedure SetPenMarkerKind(Index: Integer; AMarkKind: TJvChartPenMarkerKind); - procedure SetXStartOffset(Offset: Integer); function GetPenSecondaryAxisFlag(Index: Integer): Boolean; procedure SetPenSecondaryAxisFlag(Index: Integer; NewValue: Boolean); function GetPenValueLabels(Index: Integer): Boolean; procedure SetPenValueLabels(Index: Integer; NewValue: Boolean); - procedure SetPenCount(Count: Integer); - procedure SetChartKind(AKind: TJvChartKind); // TStrings<->TStringList transmogrifiers function GetPenLegends: TStrings; - procedure SetPenLegends(Value: TStrings); function GetPenUnit: TStrings; procedure SetPenUnit(Value: TStrings); function GetXLegends: TStrings; @@ -446,13 +442,29 @@ type procedure SetHeaderFont(AFont: TFont); procedure SetLegendFont(AFont: TFont); procedure SetAxisFont(AFont: TFont); - procedure SetPaperColor(AColor: TColor); procedure SetPrimaryYAxis(AssignFrom: TJvChartYAxisOptions); procedure SetSecondaryYAxis(AssignFrom: TJvChartYAxisOptions); // Each pen can be associated with either the primary or secondary axis, // this function decides which axis to return depending on the pen configuration: function GetPenAxis(Index: Integer): TJvChartYAxisOptions; + + procedure SetAxisLineWidth(const Value: Integer); + procedure SetAxisTitleFont(const Value: TFont); + procedure SetChartKind(AKind: TJvChartKind); + procedure SetDivisionLineColor(const AColor: TColor); + procedure SetMarkerSize(const Value: Integer); + procedure SetPaperColor(const AColor: TColor); + procedure SetPenColor(Index: Integer; AColor: TColor); + procedure SetPenCount(Count: Integer); + procedure SetPenLegends(Value: TStrings); + procedure SetPenLineWidth(const Value: Integer); + procedure SetPenStyle(Index: Integer; APenStyle: TPenStyle); + procedure SetShadowColor(const AColor: TColor); procedure SetXAxisDateTimeDivision(const Value: Double); + procedure SetXAxisHeader(const Value: String); + procedure SetXStartOffset(Offset: Integer); + procedure SetYAxisHeader(const Value: String); + procedure SetYStartOffset(Offset: Integer); protected FChartKind: TJvChartKind; // default JvChartLine {runtime pixel spacing multipliers} @@ -461,6 +473,7 @@ type FHeaderFont: TFont; FLegendFont: TFont; FAxisFont: TFont; + FAxisTitleFont: TFont; FTitle: string; FNoDataMessage: string; FYAxisHeader: string; @@ -570,8 +583,6 @@ type //NEW! NOV 2004. Optionally display this instead of fixed resource string rsNoData { X Axis Properties } - property YAxisHeader: string read FYAxisHeader write FYAxisHeader; - property YAxisDivisionMarkers: Boolean read FYAxisDivisionMarkers write FYAxisDivisionMarkers default True; // Do you want grid-paper look? { X Axis Properties } property XAxisDivisionMarkers: Boolean read FXAxisDivisionMarkers write FXAxisDivisionMarkers default True; @@ -580,15 +591,14 @@ type // Number of Values (aka samples) in each vertical dotted lines that are divisision marker. property XAxisLabelAlignment: TAlignment read FXAxisLabelAlignment write FXAxisLabelAlignment; // New: Text alignment for X axis labels. Default is left alignment. - property XAxisDateTimeMode: Boolean read FXAxisDateTimeMode write FXAxisDateTimeMode; // REWORKED LOGIC NEW IN 2007! See GraphXAxisDivisionMarkers property XAxisDateTimeDivision: Double read FXAxisDateTimeDivision write SetXAxisDateTimeDivision; // NEW 2007 : What is the nominal date/time division (1.0=day, 1.0/24=1 hour) - property XAxisDateTimeFormat: string read FXAxisDateTimeFormat write FXAxisDateTimeFormat; - property XAxisHeader: string read FXAxisHeader write FXAxisHeader; + property XAxisHeader: string read FXAxisHeader write SetXAxisHeader; property XAxisLegendSkipBy: Integer read FXAxisLegendSkipBy write FXAxisLegendSkipBy default 1; + property DateTimeFormat: string read FDateTimeFormat write FDateTimeFormat; // Usually a long date-time label, ISO standard yyyy-mm-dd hh:nn:ss is fine, as is Windows locale defaults. property PenCount: Integer read FPenCount write SetPenCount default 1; @@ -596,10 +606,15 @@ type property XOrigin: Integer read FXOrigin write FXOrigin; property YOrigin: Integer read FYOrigin write FYOrigin; // Position of bottom of chart (not always the zero origin) property XStartOffset: Longint read FXStartOffset write SetXStartOffset default 45; - property YStartOffset: Longint read FYStartOffset write FYStartOffset default 10; + property YStartOffset: Longint read FYStartOffset write SetYStartOffset default 10; + + { Y Axis Properties } + property YAxisHeader: string read FYAxisHeader write SetYAxisHeader; + property YAxisDivisionMarkers: Boolean read FYAxisDivisionMarkers write FYAxisDivisionMarkers default True; + { Y Range } { plotting markers } - property MarkerSize: Integer read FMarkerSize write FMarkerSize default JvChartDefaultMarkerSize; + property MarkerSize: Integer read FMarkerSize write SetMarkerSize default JvChartDefaultMarkerSize; property FillUnderLine : Boolean read FFillUnderLine write FFillUnderLine default False; { !! New: Primary (left side) Y axis, and Secondary (right side) Y Axis !!} property PrimaryYAxis: TJvChartYAxisOptions read FPrimaryYAxis write SetPrimaryYAxis; @@ -617,20 +632,21 @@ type property Legend: TJvChartLegend read FLegend write FLegend default clChartLegendNone; property LegendRowCount: Integer read FLegendRowCount write FLegendRowCount; property LegendWidth: Integer read FLegendWidth write FLegendWidth default 150; - property PenLineWidth: Integer read FPenLineWidth write FPenLineWidth default 1; - property AxisLineWidth: Integer read FAxisLineWidth write FAxisLineWidth default 2; + property PenLineWidth: Integer read FPenLineWidth write SetPenLineWidth default 1; + property AxisLineWidth: Integer read FAxisLineWidth write SetAxisLineWidth default 2; { more and more design time. these ones not sure about whether they are designtime or not.} property XValueCount: Integer read FXValueCount write FXValueCount default 10; {Font properties} property HeaderFont: TFont read FHeaderFont write SetHeaderFont; property LegendFont: TFont read FLegendFont write SetLegendFont; property AxisFont: TFont read FAxisFont write SetAxisFont; + property AxisTitleFont: TFont read FAxisTitleFont write SetAxisTitleFont; { Color properties} - property DivisionLineColor: TColor read FDivisionLineColor write FDivisionLineColor default + property DivisionLineColor: TColor read FDivisionLineColor write SetDivisionLineColor default JvDefaultDivisionLineColor; // NEW! Division line - property ShadowColor: TColor read FShadowColor write FShadowColor default JvDefaultShadowColor; // NEW! Shadow color + property ShadowColor: TColor read FShadowColor write SetShadowColor default JvDefaultShadowColor; // NEW! Shadow color - property PaperColor: TColor read FPaperColor write SetPaperColor; + property PaperColor: TColor read FPaperColor write SetPaperColor default clWhite; property AxisLineColor: TColor read FAxisLineColor write FAxisLineColor; property HintColor: TColor read FHintColor write FHintColor default JvDefaultHintColor; property AverageLineColor: TColor read FAverageLineColor write FAverageLineColor default JvDefaultAvgLineColor; @@ -690,7 +706,7 @@ type FMouseDownY: Longint; FMouseValue: Integer; FMousePen: Integer; - FYFont: TFont; // Delphi Font object wrapper. +// FYFont: TFont; // Delphi Font object wrapper. //NEW: FXOrigin: Double; {was in TJvChart.PlotGraph} FYOrigin: Double; {was in TJvChart.PlotGraph} @@ -703,10 +719,10 @@ type // over top of the TImage, so that we can just restore the TImage // without replotting the whole chart. // Y Axis Vertical Font - FYFontHandle: HFONT; // Y AXIS VERTICAL TEXT: Vertical Font Handle (remember to DeleteObject) - FYLogFont: TLogFont; // Y AXIS VERTICAL TEXT: Logical Font Options Record - procedure MakeVerticalFont; // Call GDI calls to get the Y Axis Vertical Font handle - procedure MyGraphVertFont(ACanvas: TCanvas); // vertical font handle + // FYFontHandle: HFONT; // Y AXIS VERTICAL TEXT: Vertical Font Handle (remember to DeleteObject) +// FYLogFont: TLogFont; // Y AXIS VERTICAL TEXT: Logical Font Options Record +// procedure MakeVerticalFont; // Call GDI calls to get the Y Axis Vertical Font handle +// procedure MyGraphVertFont(ACanvas: TCanvas); // vertical font handle procedure PaintCursor; // called from Paint iif a Cursor is visible. does NOT modify FPicture! protected procedure DrawFloatingMarkers; @@ -1776,6 +1792,14 @@ begin FOwner.NotifyOptionsChange; end; +procedure TJvchartYAxisOptions.SetYPixelGap(AValue: Double); +begin + if FYPixelGap = AValue then exit; + FYPixelGap := AValue; + FOwner.NotifyOptionsChange; +end; + + //=== { TJvChartOptions } ==================================================== constructor TJvChartOptions.Create(Owner: TJvChart); @@ -1832,24 +1856,27 @@ begin FAverageLineColor := JvDefaultAvgLineColor; FDivisionLineColor := JvDefaultDivisionLineColor; // NEW! FShadowColor := JvDefaultShadowColor; //NEW! + FPaperColor := JvDefaultPaperColor; + FHintColor := JvDefaultHintColor; FHeaderFont := TFont.Create; FLegendFont := TFont.Create; FAxisFont := TFont.Create; + FAxisTitleFont := TFont.Create; + FAxisTitleFont.Orientation := 900; //FShowLegend := True; FMouseEdit := True; FMouseInfo := True; FLegendWidth := 150; FPenLineWidth := 1; - FAxisLineWidth := 3; + FAxisLineWidth := 2; FXValueCount := 10; FXAxisLegendSkipBy := 1; FXLegendHoriz := 0; - FHintColor := JvDefaultHintColor; end; destructor TJvChartOptions.Destroy; @@ -1864,6 +1891,7 @@ begin FreeAndNil(FHeaderFont); FreeAndNil(FLegendFont); FreeAndNil(FAxisFont); + FreeAndNil(FAxisTitleFont); inherited Destroy; end; @@ -1884,6 +1912,7 @@ begin FHeaderFont.Assign(src.HeaderFont); FLegendFont.Assign(src.LegendFont); FAxisFont.Assign(src.AxisFont); + FAxisTitleFont.Assign(src.AxisTitleFont); FPenLegends.Assign(src.PenLegends); FPenUnit.Assign(src.PenUnit); FXLegends.Assign(src.XLegends); @@ -2002,12 +2031,6 @@ begin Result := FPrimaryYAxis; // default end; -procedure TJvChartOptions.SetChartKind(AKind: TJvChartKind); -begin - if AKind <> FChartKind then - FChartKind := AKind; -end; - function TJvChartOptions.GetPenMarkerKind(Index: Integer): TJvChartPenMarkerKind; begin if (Index >= 0) and (Index < Length(FPenMarkerKind)) then @@ -2061,7 +2084,10 @@ begin if Index >= Length(FPenColors) then SetLength(FPenColors, Index + 1); + FPenColors[Index] := AColor; + if Assigned(FOwner) then + FOwner.Invalidate; end; procedure TJvChartOptions.SetPenStyle(Index: Integer; APenStyle: TPenStyle); @@ -2072,6 +2098,8 @@ begin if Index >= Length(FPenStyles) then SetLength(FPenStyles, Index + 1); FPenStyles[Index] := APenStyle; + if Assigned(FOwner) then + FOwner.Invalidate; end; function TJvChartOptions.GetPenStyle(Index: Integer): TPenStyle; @@ -2151,11 +2179,6 @@ begin Result := TStrings(FPenLegends); end; -procedure TJvChartOptions.SetPenLegends(Value: TStrings); -begin - FPenLegends.Assign(Value); -end; - function TJvChartOptions.GetPenUnit: TStrings; begin Result := TStrings(FPenUnit); @@ -2171,16 +2194,98 @@ begin Result := TStrings(FXLegends); end; +procedure TJvChartOptions.SetAxisLineWidth(const Value: Integer); +begin + if FAxisLineWidth = Value then exit; + FAxisLineWidth := Value; + NotifyOptionsChange; +end; + +procedure TJvChartOptions.SetAxisTitleFont(const Value: TFont); +begin + FAxisTitleFont.Assign(Value); + FAxisTitleFont.Orientation := 900; + NotifyOptionsChange; +end; + +procedure TJvChartOptions.SetChartKind(AKind: TJvChartKind); +begin + if AKind = FChartKind then exit; + + FChartKind := AKind; + NotifyOptionsChange; +end; + +procedure TJvChartOptions.SetDivisionLinecolor(const AColor: TColor); +begin + if FDivisionLineColor = AColor then exit; + FDivisionLineColor := AColor; + if Assigned(FOwner) then + FOwner.Invalidate; +end; + +procedure TJvChartOptions.SetMarkerSize(const Value: Integer); +begin + if FMarkerSize = Value then exit; + FMarkerSize := Value; + NotifyOptionsChange; +end; + +procedure TJvChartOptions.SetPaperColor(const AColor: TColor); +begin + if AColor <> FPaperColor then + begin + FPaperColor := AColor; + if Assigned(FOwner) then + FOwner.Invalidate; + end; +end; + +procedure TJvChartOptions.SetPenLegends(Value: TStrings); +begin + FPenLegends.Assign(Value); + NotifyOptionsChange; +end; + +procedure TJvChartOptions.SetPenLineWidth(const Value: Integer); +begin + if FPenLineWidth = Value then exit; + FPenLineWidth := Value; + NotifyOptionsChange; +end; + +procedure TJvChartOptions.SetShadowColor(const AColor: TColor); +begin + if FShadowColor = AColor then exit; + FShadowColor := AColor; + if Assigned(FOwner) then + FOwner.Invalidate; +end; + procedure TJvChartOptions.SetXAxisDateTimeDivision(const Value: Double); begin FXAxisDateTimeDivision := Value; end; +procedure TJvChartOptions.SetXAxisHeader(const Value: String); +begin + if FXAxisHeader = Value then exit; + FXAxisHeader := Value; + NotifyOptionsChange; +end; + procedure TJvChartOptions.SetXLegends(Value: TStrings); begin FXLegends.Assign(Value); end; +procedure TJvChartOptions.SetYAxisHeader(const Value: String); +begin + if FYAxisHeader = Value then exit; + FYAxisHeader := Value; + NotifyOptionsChange; +end; + procedure TJvChartOptions.SetHeaderFont(AFont: TFont); begin FHeaderFont.Assign(AFont); @@ -2206,24 +2311,26 @@ begin FSecondaryYAxis.Assign(AssignFrom); end; -procedure TJvChartOptions.SetPaperColor(AColor: TColor); -begin - if AColor <> FPaperColor then - begin - FPaperColor := AColor; - if Assigned(FOwner) then - FOwner.Invalidate; - end; -end; - procedure TJvChartOptions.SetXStartOffset(Offset: Integer); begin //if not PrintInSession then // if (Offset < 10) or (Offset > (FOwner.Width div 2)) then // raise ERangeError.CreateRes(@RsEChartOptionsXStartOffsetValueOutO); + if FXStartOffset = Offset then + exit; FXStartOffset := Offset; + NotifyOptionsChange; end; +procedure TJvChartOptions.SetYStartOffset(Offset: Integer); +begin + if FYStartOffset = Offset then + exit; + FYStartOffset := Offset; + NotifyOptionsChange; +end; + + //=== { TJvChart } =========================================================== { GRAPH } @@ -2292,10 +2399,11 @@ destructor TJvChart.Destroy; begin {Add code for destroying my own data...here} FBitmap.Free; + { if Ord(FYFontHandle) <> 0 then DeleteObject(FYFontHandle); // vertical font object FreeAndNil(FYFont); - + } FreeAndNil(FPicture); FreeAndNil(FAverageData); FreeAndNil(FOptions); @@ -3198,7 +3306,9 @@ var if Options.PenStyle[I] <> psClear then begin if Options.XPixelGap < 3.0 then - ACanvas.Pen.Color := Options.PenColor[I]; // greek-out the borders + ACanvas.Pen.Color := Options.PenColor[I] // greek-out the borders + else + ACanvas.Pen.Color := clBlack; MyColorRectangle(ACanvas, I, Round((XOrigin + J * Options.XPixelGap) + (Options.XPixelGap / 6)), Round(YOrigin - YOldOrigin), @@ -4461,7 +4571,8 @@ begin Exit; ACanvas.Brush.Color := Color; { !!warning: uses Win32 only font-handle stuff!!} - MyGraphVertFont(ACanvas); // Select Vertical Font Output. + ACanvas.Font.Assign(FOptions.AxisTitleFont); +// MyGraphVertFont(ACanvas); // Select Vertical Font Output. if Options.XStartOffset > 10 then begin {ht := MyTextHeight(StrText); }// not used (ahuser) @@ -4884,8 +4995,8 @@ begin StrWidth := ACanvas.TextWidth(RsNoValuesHere); if StrWidth > nWidth then nWidth := StrWidth; - MyColorRectangle(ACanvas, jvChartHintColorIndex, X + 3, Y + 3, X + nWidth + 3 + 5, Y + nLineH + 3); - MyColorRectangle(ACanvas, jvChartPaperColorIndex, X, Y, X + nWidth + 5, Y + nLineH); + MyColorRectangle(ACanvas, jvChartShadowColorIndex, X + 3, Y + 3, X + nWidth + 3, Y + nLineH + 3); + MyColorRectangle(ACanvas, jvChartHintColorIndex, X, Y, X + nWidth, Y + nLineH); ACanvas.Font.Color := Self.Font.Color; MyLeftTextOutHint(ACanvas, X + 2, Y, RsNoValuesHere); FMouseLegend := True; @@ -4903,7 +5014,7 @@ begin X := (Self.Width - nWidth); // Draw hint box: - MyColorRectangle(ACanvas, jvChartPaperColorIndex, X + 3, Y + 3, X + nWidth + 3, Y + nHeight + 3); + MyColorRectangle(ACanvas, jvChartShadowColorIndex, X + 3, Y + 3, X + nWidth + 3, Y + nHeight + 3); MyColorRectangle(ACanvas, jvChartHintColorIndex, X, Y, X + nWidth, Y + nHeight); //MyLeftTextOut( ACanvas, X + 3, Y + 3, 'Foo'); @@ -5227,7 +5338,7 @@ end; { or check for metafile output! } {****************************************************************************} - + (* { !!warning: uses Win32 only font-handle stuff!!} procedure TJvChart.MakeVerticalFont; begin @@ -5270,6 +5381,7 @@ begin FYFont.Color := Options.AxisFont.Color; FYFont.Handle := FYFontHandle; end; +*) procedure TJvChart.MyHeader(ACanvas: TCanvas; StrText: string); @@ -5301,6 +5413,7 @@ begin end; +(* { !!warning: uses Win32 only font-handle stuff!!} procedure TJvChart.MyGraphVertFont(ACanvas: TCanvas); begin @@ -5313,7 +5426,7 @@ begin if not PrintInSession then Assert(ACanvas.Font.Handle = FYFontHandle); end; - +*) procedure TJvChart.MyHeaderFont(ACanvas: TCanvas); begin @@ -5813,9 +5926,7 @@ begin if (Options.FGradientDirection = grNone) or (Options.PaperColor = Options.FGradientColor) then Exit; ACanvas := GetChartCanvas(false); - VC := Options.XValueCount; - if VC < 1 then - VC := 1; + VC := Max(1, Options.XValueCount); RawRect.Top := FOptions.YStartOffset; RawRect.Bottom := Trunc(YOrigin); RawRect.Left := Round(XOrigin);