type TSPdfLineRange = class(TSPdfBasicRange) public function Create(pg: TSPage); function Do();override; function AddRange(range: TSPdfBasicRange); function SetAllRangeProp(pg: TSPage; sx: real; sy: real; ex: real; ey: real; w: real; fh: real; dh: real); function Align(jc: string); function AdjustRangeOffset(page: TSPage; x_offset: real; y_offset: real); function AlignRightBound(right_bound: real); private range_array_: array of TSPdfBasicRange; end; function TSPdfLineRange.Create(pg: TSPage); begin {self.}TSPage := pg; range_array_ := array(); end; function TSPdfLineRange.AddRange(range: TSPdfBasicRange); begin range_array_[length(range_array_)] := range; end; function TSPdfLineRange.Do();override; begin for _,range in range_array_ do range.Do(); end; function TSPdfLineRange.SetAllRangeProp(pg: TSPage; sx: real; sy: real; ex: real; ey: real; w: real; fh: real; dh: real); begin for _,range in range_array_ do begin if not ifnil(pg) then range.TSPage := pg; if not ifnil(sx) then range.StartX := sx; if not ifnil(sy) then range.StartY := sy; if not ifnil(ex) then range.EndX := ex; if not ifnil(ey) then range.EndY := ey; if not ifnil(w) then range.Width := w; if not ifnil(fh) then range.FixedHeight := fh; if not ifnil(dh) then range.DynamicHeight := dh; end end; function TSPdfLineRange.Align(jc: string); begin offset := 0; first := range_array_[0]; last := range_array_[length(range_array_)-1]; case jc of "center": offset := ({self.}Width - last.EndX + first.EndX - last.Width) / 2; "right": offset := {self.}Width - last.EndX + first.EndX - last.Width; end; if offset <= 0 then return; for _,range in range_array_ do range.EndX += offset; end; function TSPdfLineRange.AdjustRangeOffset(page: TSPage; x_offset: real; y_offset: real); begin if page <> {self.}TSPage then return; for _,range in range_array_ do begin if not ifnil(x_offset) then range.EndX += x_offset; if not ifnil(y_offset) then range.EndY += y_offset; end; end; function TSPdfLineRange.AlignRightBound(right_bound: real); begin last := range_array_[length(range_array_)-1]; diff := right_bound - (last.EndX + last.Width); if diff > 1e-6 then begin avg := diff / (length(range_array_) - 1); for i:=1 to length(range_array_)-1 do range_array_[i].EndX += avg * i; end end;