📄 jvqchart.pas
字号:
raise ERangeError.CreateRes(@RsEChartOptionsPenCountPenCountOutOf);
if Index >= Length(FPenStyles) then
SetLength(FPenStyles, Index + 1);
FPenStyles[Index] := APenStyle;
end;
function TJvChartOptions.GetPenStyle(Index: Integer): TPenStyle;
begin
if (Index >= 0) and (Index < Length(FPenStyles)) then
Result := FPenStyles[Index]
else
Result := psSolid;
end;
function TJvChartOptions.GetAverageValue(Index: Integer): Double;
begin
if Index < 0 then
raise ERangeError.CreateRes(@RsEGetAverageValueIndexNegative);
if Index >= Length(FAverageValue) then
Result := 0.0
else
Result := FAverageValue[Index];
end;
procedure TJvChartOptions.SetAverageValue(Index: Integer; AValue: Double);
begin
if Index < 0 then
raise ERangeError.CreateRes(@RsESetAverageValueIndexNegative);
if Index >= Length(FAverageValue) then
SetLength(FAverageValue, Index + 1);
FAverageValue[Index] := AValue;
end;
function TJvChartOptions.GetPenSecondaryAxisFlag(Index: Integer): Boolean;
begin
if (Index < 0) or (Index >= Length(FPenSecondaryAxisFlag)) then
Result := False
else
Result := FPenSecondaryAxisFlag[Index];
end;
procedure TJvChartOptions.SetPenSecondaryAxisFlag(Index: Integer; NewValue: Boolean);
begin
if (Index < 0) or (Index >= MAX_PEN) then
raise ERangeError.CreateRes(@RsEChartOptionsPenCountPenCountOutOf);
if Index >= Length(FPenSecondaryAxisFlag) then
SetLength(FPenSecondaryAxisFlag, Index + 1);
FPenSecondaryAxisFlag[Index] := NewValue;
end;
function TJvChartOptions.GetPenValueLabels(Index: Integer): Boolean;
begin
if (Index < 0) or (Index >= Length(FPenValueLabels)) then
Result := False
else
Result := FPenValueLabels[Index];
end;
procedure TJvChartOptions.SetPenValueLabels(Index: Integer; NewValue: Boolean);
begin
if (Index < 0) or (Index >= MAX_PEN) then
raise ERangeError.CreateRes(@RsEChartOptionsPenCountPenCountOutOf);
if Index >= Length(FPenValueLabels) then
SetLength(FPenValueLabels, Index + 1);
FPenValueLabels[Index] := NewValue;
end;
procedure TJvChartOptions.SetPenCount(Count: Integer);
begin
if (Count < 0) or (Count >= MAX_PEN) then
raise ERangeError.CreateRes(@RsEChartOptionsPenCountPenCountOutOf);
FPenCount := Count;
SetLength(FPenSecondaryAxisFlag, FPenCount + 1);
end;
function TJvChartOptions.GetPenLegends: TStrings;
begin
Result := FPenLegends as TStrings;
end;
procedure TJvChartOptions.SetPenLegends(Value: TStrings);
begin
FPenLegends.Assign(Value);
end;
function TJvChartOptions.GetPenUnit: TStrings;
begin
Result := FPenUnit as TStrings;
end;
procedure TJvChartOptions.SetPenUnit(Value: TStrings);
begin
FPenUnit.Assign(Value);
end;
function TJvChartOptions.GetXLegends: TStrings;
begin
Result := FXLegends as TStrings;
end;
procedure TJvChartOptions.SetXLegends(Value: TStrings);
begin
FXLegends.Assign(Value);
end;
procedure TJvChartOptions.SetHeaderFont(AFont: TFont);
begin
FHeaderFont.Assign(AFont);
end;
procedure TJvChartOptions.SetLegendFont(AFont: TFont);
begin
FLegendFont.Assign(AFont);
end;
procedure TJvChartOptions.SetAxisFont(AFont: TFont);
begin
FAxisFont.Assign(AFont);
end;
procedure TJvChartOptions.SetPrimaryYAxis(AssignFrom: TJvChartYAxisOptions);
begin
FPrimaryYAxis.Assign(AssignFrom);
end;
procedure TJvChartOptions.SetSecondaryYAxis(AssignFrom: TJvChartYAxisOptions);
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);
FXStartOffset := Offset;
end;
//=== { TJvChart } ===========================================================
{ GRAPH }
{**************************************************************************}
{ call this function : NEVER! }
{**************************************************************************}
constructor TJvChart.Create(AOwner: TComponent);
begin
inherited Create(AOwner); {by TImage...}
ControlStyle := ControlStyle + [csOpaque];
// XXX FLICKER REDUCTION: Set ControlStyle properly. -WP. APRIL 2004.
FPicture := TPicture.Create;
FCursorPosition := -1; // Invisible until CursorPosition is set >=0 to make it visible.
FMouseDownHintStrs := TStringList.Create;
{ logical font used for rotating text to show vertical labels }
FData := TJvChartData.Create;
FAverageData := TJvChartData.Create;
FFloatingMarker := TObjectList.Create; // NEW: collection of TJvChartFloatingMarker objects.
FFloatingMarker.OwnsObjects := True;
FOptions := TJvChartOptions.Create(Self);
CalcYEnd;
PrintInSession := False;
FOldYGap := 1;
FOldYOrigin := 0;
FStartDrag := False;
FMouseLegend := False;
FContainsNegative := False;
FMouseValue := 0;
FMousePen := 0;
{Set default values for component fields...}
if csDesigning in ComponentState then
begin
// default height and width
if not Assigned(Parent) then
begin
Width := 300;
Height := 300;
end;
end;
end;
{**************************************************************************}
{ call this function : NEVER! }
{**************************************************************************}
destructor TJvChart.Destroy;
begin
{Add code for destroying my own data...here}
FBitmap.Free;
FreeAndNil(FYFont);
FreeAndNil(FPicture);
FreeAndNil(FAverageData);
FreeAndNil(FOptions);
FreeAndNil(FData);
FreeAndNil(FFloatingMarker); // Destroy collection of TJvChartFloatingMarker objects. Destroys contained objects also.
FreeAndNil(FMouseDownHintStrs); //new.
inherited Destroy;
end;
{Paint helper}
function TJvChart.DestRect: TRect;
var
W, H {, cw, ch}: Integer; // not used (ahuser)
// xyaspect: Double; // not used (ahuser)
begin
W := Picture.Width;
H := Picture.Height;
(* cw := ClientWidth;
ch := ClientHeight;
if Stretch or (Proportional and ((W > cw) or (H > ch))) then
begin
if Proportional and (W > 0) and (H > 0) then
begin
xyaspect := W / H;
if W > H then
begin
W := cw;
H := Trunc(cw / xyaspect);
if H > ch then // woops, too big
begin
H := ch;
W := Trunc(ch * xyaspect);
end;
end
else
begin
H := ch;
W := Trunc(ch * xyaspect);
if W > cw then // woops, too big
begin
W := cw;
H := Trunc(cw / xyaspect);
end;
end;
end
else
begin
W := cw;
H := ch;
end;
end;
*)
with Result do
begin
Left := 0;
Top := 0;
Right := W;
Bottom := H;
end;
(* if Center then
OffsetRect(Result, (cw - W) div 2, (ch - H) div 2); *)
end;
procedure TJvChart.Loaded;
begin
inherited Loaded;
ResizeChartCanvas;
end;
procedure TJvChart.Resize;
begin
inherited Resize;
ResizeChartCanvas;
// Invalidate already happens in ResizeChartCanvas.
end;
{ PAINT }
procedure TJvChart.DesignModePaint;
var
DesignStr: string;
tw, th: Integer;
ACanvas: TCanvas;
begin
ACanvas := GetChartCanvas;
ACanvas.Brush.Color := Options.PaperColor;
ACanvas.Rectangle(0, 0, Width, Height);
DesignStr := ClassName + RsChartDesigntimeLabel;
if Options.PrimaryYAxis.YMin >= Options.PrimaryYAxis.YMax then
begin
if Options.PrimaryYAxis.YMax > 0 then
Options.PrimaryYAxis.YMin := 0.0;
end;
if (Abs(Options.PrimaryYAxis.YMax) < 0.000001) and (Abs(Options.PrimaryYAxis.YMin) < 0.000001) then
Options.PrimaryYAxis.YMax := 10.0; // Reasonable non-zero default, so that charting works!
Options.PrimaryYAxis.Normalize;
Options.SecondaryYAxis.Normalize;
GraphSetup;
PrimaryYAxisLabels;
GraphXAxis;
GraphXAxisDivisionMarkers;
GraphYAxis;
GraphYAxisDivisionMarkers;
{ designtime component label }
tw := ACanvas.TextWidth(DesignStr);
th := ACanvas.TextHeight(DesignStr);
ACanvas.Brush.Color := Options.PaperColor;
ACanvas.Pen.Color := Color;
//ACanvas.Pen.Style
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -