* Fixed bug #33217, range check error when loading/saving colors, patch from Andreas Friess

git-svn-id: trunk@38325 -
This commit is contained in:
michael 2018-02-24 10:09:52 +00:00
parent 80d8a73f05
commit 4a0072d43d
2 changed files with 92 additions and 15 deletions

View File

@ -2296,6 +2296,11 @@ begin
Result := (R shl 16) or (G shl 8) or B;
end;
function QWordToReportColor(AQWord: QWord):TFPReportColor;
begin
Result := TFPReportColor(AQWord and $FFFFFFFF);
end;
function StretchModeToString(AEnum: TFPReportStretchMode): string; inline;
begin
result := GetEnumName(TypeInfo(TFPReportStretchMode), Ord(AEnum));
@ -3403,7 +3408,11 @@ begin
end;
end
else
begin
if not Assigned(FFont) then
FFont := TFPReportFont.Create;
Result := FFont;
end;
end;
procedure TFPReportCustomMemo.SetUseParentFont(AValue: Boolean);
@ -4369,11 +4378,11 @@ begin
begin
AWriter.WriteString('FontName', Font.Name);
AWriter.WriteInteger('FontSize', Font.Size);
AWriter.WriteInteger('FontColor', Font.Color);
AWriter.WriteQWord('FontColor', Font.Color);
end;
AWriter.WriteFloat('LineSpacing', LineSpacing);
AWriter.WriteInteger('LinkColor', LinkColor);
AWriter.WriteQWord('LinkColor', LinkColor);
AWriter.WriteString('Options', MemoOptionsToString(Options));
end;
@ -4537,10 +4546,10 @@ begin
begin
Font.Name := AReader.ReadString('FontName', Font.Name);
Font.Size := AReader.ReadInteger('FontSize', Font.Size);
Font.Color := AReader.ReadInteger('FontColor', Font.Color);
Font.Color := QWordToReportColor(AReader.ReadQWord('FontColor', Font.Color));
end;
FLineSpacing := AReader.ReadFloat('LineSpacing', LineSpacing);
FLinkColor := AReader.ReadInteger('LinkColor', LinkColor);
FLinkColor := QWordToReportColor(AReader.ReadQWord('LinkColor', LinkColor));
Options := StringToMemoOptions(AReader.ReadString('Options', ''));
Changed;
end;
@ -4604,7 +4613,7 @@ begin
AWriter.WriteString('ShapeType', ShapeTypeToString(ShapeType));
AWriter.WriteString('Orientation', OrientationToString(Orientation));
AWriter.WriteFloat('CornerRadius', CornerRadius);
AWriter.WriteInteger('Color', Color);
AWriter.WriteQWord('Color', Color);
end;
constructor TFPReportCustomShape.Create(AOwner: TComponent);
@ -5622,25 +5631,25 @@ var
begin
if (AOriginal = nil) then
begin
AWriter.WriteInteger('Color', Color);
AWriter.WriteQWord('Color', Color);
AWriter.WriteString('Pen', FramePenToString(Pen));
AWriter.WriteInteger('Width', Ord(Width));
AWriter.WriteString('Shape', FrameShapeToString(Shape));
//TODO Write out the enum values instead of the Integer value.
I := integer(Lines);
AWriter.WriteInteger('Lines', I);
AWriter.WriteInteger('BackgroundColor', BackgroundColor);
AWriter.WriteQWord('BackgroundColor', BackgroundColor);
end
else
begin
AWriter.WriteIntegerDiff('Color', Color, AOriginal.Color);
AWriter.WriteQWordDiff('Color', Color, AOriginal.Color);
AWriter.WriteStringDiff('Pen', FramePenToString(Pen), FramePenToString(AOriginal.Pen));
AWriter.WriteIntegerDiff('Width', Ord(Width), AOriginal.Width);
AWriter.WriteStringDiff('Shape', FrameShapeToString(Shape), FrameShapeToString(AOriginal.Shape));
I := integer(Lines);
J := integer(Aoriginal.Lines);
AWriter.WriteIntegerDiff('Lines', I, J);
AWriter.WriteIntegerDiff('BackgroundColor', BackgroundColor, AOriginal.BackgroundColor);
AWriter.WriteQWordDiff('BackgroundColor', BackgroundColor, AOriginal.BackgroundColor);
end;
end;
@ -5648,13 +5657,13 @@ procedure TFPReportFrame.ReadElement(AReader: TFPReportStreamer);
var
I: integer;
begin
Color := AReader.ReadInteger('Color', Color);
Color := QWordToReportColor(AReader.ReadQWord('Color', Color ));
Pen := StringToFramePen(AReader.ReadString('Pen', 'psSolid'));
Width := AReader.ReadInteger('Width', Ord(Width));
Shape := StringToFrameShape(AReader.ReadString('Shape', 'fsNone'));
I := integer(Lines);
Lines := TFPReportFrameLines(AReader.ReadInteger('Lines', I));
BackgroundColor := AReader.ReadInteger('BackgroundColor', BackgroundColor);
BackgroundColor := QWordToReportColor(AReader.ReadQWord('BackgroundColor', BackgroundColor));
end;
{ TFPReportTextAlignment }
@ -6764,7 +6773,7 @@ begin
Pagesize.Height := AReader.ReadFloat('PageSize.Height', 297);
Font.Name := AReader.ReadString('FontName', Font.Name);
Font.Size := AReader.ReadInteger('FontSize', Font.Size);
Font.Color := AReader.ReadInteger('FontColor', Font.Color);
Font.Color := QWordToReportColor(AReader.ReadQWord('FontColor', Font.Color));
FDataName:=AReader.ReadString('Data','');
if FDataName<>'' then
RestoreDataFromNames;
@ -6804,7 +6813,7 @@ begin
AWriter.WriteFloat('PageSize.Height', PageSize.Height);
AWriter.WriteString('FontName', Font.Name);
AWriter.WriteInteger('FontSize', Font.Size);
AWriter.WriteInteger('FontColor', Font.Color);
AWriter.WriteQWord('FontColor', Font.Color);
if Assigned(FData) then
AWriter.WriteString('Data',FData.Name);
AWriter.PushElement('Margins');
@ -7963,7 +7972,7 @@ begin
begin
AWriter.WriteString('FontName', Font.Name);
AWriter.WriteInteger('FontSize', Font.Size);
AWriter.WriteInteger('FontColor', Font.Color);
AWriter.WriteQWord('FontColor', Font.Color);
end;
end;
@ -8058,7 +8067,7 @@ begin
begin
Font.Name := AReader.ReadString('FontName', Font.Name);
Font.Size := AReader.ReadInteger('FontSize', Font.Size);
Font.Color := AReader.ReadInteger('FontColor', Font.Color);
Font.Color := QWordToReportColor(AReader.ReadQWord('FontColor', Font.Color));
end;
// TODO: Read Data information

View File

@ -42,6 +42,8 @@ type
// Writing properties of the current element
procedure WriteInteger(AName: String; AValue: Integer); virtual; abstract;
procedure WriteInt64(AName: String; AValue: Int64); virtual; abstract;
procedure WriteQWord(AName: String; AValue: QWord); virtual; abstract;
procedure WriteFloat(AName: String; AValue: Extended); virtual; abstract;
procedure WriteString(AName: String; AValue: String); virtual; abstract;
procedure WriteBoolean(AName: String; AValue: Boolean); virtual; abstract;
@ -49,6 +51,8 @@ type
procedure WriteStream(AName: String; AValue: TStream); virtual; abstract;
// Writing properties but only when different from original
procedure WriteIntegerDiff(AName: String; AValue, AOriginal: Integer); virtual; abstract;
procedure WriteInt64Diff(AName: String; AValue, AOriginal: Int64); virtual; abstract;
procedure WriteQWordDiff(AName: String; AValue, AOriginal: QWord); virtual; abstract;
procedure WriteFloatDiff(AName: String; AValue, AOriginal: Extended); virtual; abstract;
procedure WriteStringDiff(AName: String; AValue, AOriginal: String); virtual; abstract;
procedure WriteBooleanDiff(AName: String; AValue, AOriginal: Boolean); virtual; abstract;
@ -56,6 +60,8 @@ type
procedure WriteStreamDiff(AName: String; AValue, AOriginal: TStream); virtual; abstract;
// Reading properties
function ReadInteger(AName: String; ADefault: Integer): Integer; virtual; abstract;
function ReadInt64(AName: String; ADefault: Int64): Int64; virtual; abstract;
function ReadQWord(AName: String; ADefault: QWord): QWord; virtual; abstract;
function ReadFloat(AName: String; ADefault: Extended): Extended; virtual; abstract;
function ReadString(AName: String; ADefault: String): String; virtual; abstract;
function ReadDateTime(AName: String; ADefault: TDateTime): TDateTime; virtual; abstract;
@ -81,18 +87,24 @@ type
public
// FPReportStreamer interface
procedure WriteInteger(AName: String; AValue: Integer); override;
procedure WriteInt64(AName: String; AValue: Int64); override;
procedure WriteQWord(AName: String; AValue: QWord); override;
procedure WriteFloat(AName: String; AValue: Extended); override;
procedure WriteString(AName: String; AValue: String); override;
procedure WriteBoolean(AName: String; AValue: Boolean); override;
procedure WriteDateTime(AName: String; AValue: TDateTime); override;
procedure WriteStream(AName: String; AValue: TStream); override;
procedure WriteIntegerDiff(AName: String; AValue, AOriginal: Integer); override;
procedure WriteInt64Diff(AName: String; AValue, AOriginal: Int64); override;
procedure WriteQWordDiff(AName: String; AValue, AOriginal: QWord); override;
procedure WriteFloatDiff(AName: String; AValue, AOriginal: Extended); override;
procedure WriteStringDiff(AName: String; AValue, AOriginal: String); override;
procedure WriteBooleanDiff(AName: String; AValue, AOriginal: Boolean); override;
procedure WriteDateTimeDiff(AName: String; AValue, AOriginal: TDateTime); override;
procedure WriteStreamDiff(AName: String; AValue, AOriginal: TStream); override;
function ReadInteger(AName: String; ADefault: Integer): Integer; override;
function ReadInt64(AName: String; ADefault: Int64): Int64; override;
function ReadQWord(AName: String; ADefault: QWord): QWord; override;
function ReadFloat(AName: String; ADefault: Extended): Extended; override;
function ReadString(AName: String; ADefault: String): String; override;
function ReadDateTime(AName: String; ADefault: TDateTime): TDateTime; override;
@ -205,6 +217,16 @@ begin
CurrentElement.Add(AName, AValue);
end;
procedure TFPReportJSONStreamer.WriteInt64(AName: String; AValue: Int64);
begin
CurrentElement.Add(AName, AValue);
end;
procedure TFPReportJSONStreamer.WriteQWord(AName: String; AValue: QWord);
begin
CurrentElement.Add(AName, AValue);
end;
procedure TFPReportJSONStreamer.WriteFloat(AName: String; AValue: Extended);
begin
CurrentElement.Add(AName, AValue);
@ -236,6 +258,20 @@ begin
WriteInteger(AName, AValue);
end;
procedure TFPReportJSONStreamer.WriteInt64Diff(AName: String; AValue,
AOriginal: Int64);
begin
if (AValue <> AOriginal) then
WriteInt64(AName, AValue);
end;
procedure TFPReportJSONStreamer.WriteQWordDiff(AName: String; AValue,
AOriginal: QWord);
begin
if (AValue <> AOriginal) then
WriteQWord(AName, AValue);
end;
procedure TFPReportJSONStreamer.WriteFloatDiff(AName: String; AValue, AOriginal: Extended);
begin
if (AValue <> AOriginal) then
@ -268,6 +304,22 @@ begin
end;
function TFPReportJSONStreamer.ReadInteger(AName: String; ADefault: Integer): Integer;
var
d: TJSONData;
begin
d := FindChild(AName) as TJSONData;
if d = nil then
Result := ADefault
else
begin
if d.JSONType = jtNumber then
Result := d.AsInteger
else
Result := ADefault;
end;
end;
function TFPReportJSONStreamer.ReadInt64(AName: String; ADefault: Int64): Int64;
var
d: TJSONData;
begin
@ -283,6 +335,22 @@ begin
end;
end;
function TFPReportJSONStreamer.ReadQWord(AName: String; ADefault: QWord): QWord;
var
d: TJSONData;
begin
d := FindChild(AName) as TJSONData;
if d = nil then
Result := ADefault
else
begin
if d.JSONType = jtNumber then
Result := d.AsQWord
else
Result := ADefault;
end;
end;
function TFPReportJSONStreamer.ReadFloat(AName: String; ADefault: Extended): Extended;
var
d: TJSONData;