Browse Source

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

git-svn-id: trunk@38325 -
michael 7 years ago
parent
commit
4a0072d43d
2 changed files with 92 additions and 15 deletions
  1. 24 15
      packages/fcl-report/src/fpreport.pp
  2. 68 0
      packages/fcl-report/src/fpreportstreamer.pp

+ 24 - 15
packages/fcl-report/src/fpreport.pp

@@ -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

+ 68 - 0
packages/fcl-report/src/fpreportstreamer.pp

@@ -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;