⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gmlabelprinter.pas

📁 GmPrintSuite 2.96.7] a
💻 PAS
📖 第 1 页 / 共 3 页
字号:
procedure TGmLabelTemplateList.ExportToFile(AFilename: string);
var
  Ini: TIniFile;
  ATemplate: TGmLabelTemplateInfo;
  ICount: integer;
begin
  Ini := TIniFile.Create(AFilename);
  try
    for ICount := 0 to Count-1 do
    begin
      if not Ini.SectionExists(Template[ICount].TemplateName) then
      begin
        ATemplate := Template[ICount];
        Ini.WriteInteger(ATemplate.TemplateName, 'id', Ord(ATemplate.TemplateID));
        Ini.WriteInteger(ATemplate.TemplateName, 'nh', ATemplate.NumLabelsHorz);
        Ini.WriteInteger(ATemplate.TemplateName, 'nv', ATemplate.NumLabelsVert);
        Ini.WriteFloat(ATemplate.TemplateName, 'lh', ATemplate.LabelHeight[gmInches]);
        Ini.WriteFloat(ATemplate.TemplateName, 'lw', ATemplate.LabelWidth[gmInches]);
        Ini.WriteFloat(ATemplate.TemplateName, 'sh', ATemplate.LabelSpacingHorz[gmInches]);
        Ini.WriteFloat(ATemplate.TemplateName, 'sv', ATemplate.LabelSpacingVert[gmInches]);
        Ini.WriteFloat(ATemplate.TemplateName, 'ox', ATemplate.OffsetX[gmInches]);
        Ini.WriteFloat(ATemplate.TemplateName, 'oy', ATemplate.OffsetY[gmInches]);
        Ini.WriteFloat(ATemplate.TemplateName, 'pw', ATemplate.PageExtent[gmInches].Width);
        Ini.WriteFloat(ATemplate.TemplateName, 'ph', ATemplate.PageExtent[gmInches].Height);
        Ini.WriteString(ATemplate.TemplateName, 'ps', PaperSizeToStr(ATemplate.PaperSize));
        Ini.WriteInteger(ATemplate.TemplateName,'o', Ord(ATemplate.Orientation));
        Ini.WriteInteger(ATemplate.TemplateName,'ls', Ord(ATemplate.LabelShape));
        Ini.WriteFloat(ATemplate.TemplateName, 'cr', ATemplate.CornerRadius[gmInches]);
      end;
    end;
  finally
    Ini.Free;
  end;
end;

//------------------------------------------------------------------------------

// *** TGmLabelPrinter ***

constructor TGmLabelPrinter.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FTemplateList := TGmLabelTemplateList.Create;
  FBrush := TBrush.Create;
  FPen := TPen.Create;
  FSelectedTemplate := FTemplateList[0];
  FLabelDrawOrder := gmRows;
  FClipLabels := True;
  FStartLabel := 1;
  FLabelTemplate := L7159_Address;
  FBrush.Style := bsSolid;
end;

destructor TGmLabelPrinter.Destroy;
begin
  FTemplateList.FDestroying := True;
  FTemplateList.Free;
  FBrush.Free;
  FPen.Free;
  inherited Destroy;
end;

function TGmLabelPrinter.GetLabelsPerPage: integer;
begin
  Result := FSelectedTemplate.NumLabelsHorz * FSelectedTemplate.NumLabelsVert;
end;

procedure TGmLabelPrinter.SetBrush(Value: TBrush);
begin
  FBrush.Assign(Value);
end;

procedure TGmLabelPrinter.SetPen(Value: TPen);
begin
  FPen.Assign(Value);
end;

procedure TGmLabelPrinter.SetLabelTemplate(Value: TGmLabelTemplate);
begin
  FSelectedTemplate := FTemplateList.PreDefinedTemplate(Value);
  FLabelTemplate := Value;
end;

procedure TGmLabelPrinter.SetPreview(Value: TGmPreview);
begin
  FPreview := Value;
end;

procedure TGmLabelPrinter.Notification(AComponent: TComponent; Operation: TOperation);
begin
  inherited Notification(AComponent, Operation);
  if (Operation = opRemove) and (AComponent = FPreview) then FPreview := nil;
end;

procedure TGmLabelPrinter.DrawLabels(NumLabels: integer);
var
  Corner: Extended;
  ARect: TGmRect;
  Origin: TGmPoint;
  LabelXYIndex: TPoint;
  LoopCount: integer;
  NumDrawn: integer;
  LastLabel: TPoint;
  AGmValueHeight: TGmValue;
  AGmValueVertSpacing: TGmValue;
  AGmValueRect: TGmValueRect;
  ALabelHeight: Extended;
  ALabelSpacingVert: Extended;
  SaveBrush: TBrush;
  SavePen: TPen;
begin
  if not Assigned(FPreview) then
  begin
    ShowGmError(Self, GM_NO_PREVIEW_ASSIGNED);
    Exit;
  end;
  if not Assigned(FSelectedTemplate) then Exit;
  if (FSelectedTemplate.NumLabelsHorz = 0) or (FSelectedTemplate.NumLabelsVert = 0) then Exit;

  FPreview.Canvas.SaveCanvasProperties;
  FPreview.BeginUpdate;
  FPreview.Canvas.CoordsRelativeTo := gmFromPage;
  FPreview.Canvas.RemoveClipRgn;
  SaveBrush := TBrush.Create;
  SavePen := TPen.Create;
  with FSelectedTemplate do
  begin

    FDrawing := True;
    if Assigned(FBeforeDrawLabels) then FBeforeDrawLabels(Self);
    FBreakAdded := False;
    Corner := CornerRadius[gmInches] * 2;
    if PaperSize <> Custom then
    begin
      FPreview.PaperSize := PaperSize;
      FPreview.Orientation := Orientation;
    end
    else
    begin
      with PageExtent[gmInches] do FPreview.SetCustomPageSize(Width, Height, gmInches);
    end;

    FCurrentXY := GmPoint(OffsetX[gmInches], OffsetY[gmInches]);
    Origin := FCurrentXY;

    LabelXYIndex := Point(1,1);
    LastLabel := Point(NumLabelsHorz, NumLabelsVert);
    LoopCount := 0;
    NumDrawn := 0;
    while NumDrawn < NumLabels do
    begin
      Inc(LoopCount);
      ALabelHeight := LabelHeight[gmInches];
      ALabelSpacingVert := LabelSpacingVert[gmInches];
      if (Assigned(FOnGetLabelHeight)) and (FLabelDrawOrder = gmColumns) then
      begin
        AGmValueHeight := TGmValue.Create(nil);
        AGmValueVertSpacing := TGmValue.Create(nil);
        try
          AGmValueHeight.AsInches := ALabelHeight;
          AGmValueVertSpacing.AsInches := ALabelSpacingVert;
          FOnGetLabelHeight(Self, NumDrawn+1, LabelXYIndex.X, LabelXYIndex.Y, AGmValueHeight, AGmValueVertSpacing);
          ALabelHeight := AGmValueHeight.AsInches;
          ALabelSpacingVert := AGmValueVertSpacing.AsInches;
        finally
          AGmValueHeight.Free;
          AGmValueVertSpacing.Free;
        end;
      end;
      ARect := GmRect(FCurrentXY.X, FCurrentXY.Y, FCurrentXY.X+LabelWidth[gmInches], FCurrentXY.Y+ALabelHeight);
      if LoopCount >= StartLabel then
      begin
        SaveBrush.Assign(FPreview.Canvas.Brush);
        SavePen.Assign(FPreview.Canvas.Pen);
        FPreview.Canvas.Brush.Assign(FBrush);
        FPreview.Canvas.Pen.Assign(FPen);
        case LabelShape of
          gmLabelRect     : FPreview.Canvas.Rectangle(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom, gmInches);
          gmLabelEllipse  : FPreview.Canvas.Ellipse(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom, gmInches);
          gmLabelRoundRect: FPreview.Canvas.RoundRect(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom, Corner, Corner, gmInches);
        end;
        FPreview.Canvas.Brush.Assign(SaveBrush);
        FPreview.Canvas.Pen.Assign(SavePen);
        FPreview.Canvas.LastObject.PrintThisObject := False;
        if FClipLabels then
        begin
          // set clipping region...
          case LabelShape of
            gmLabelRect     : FPreview.Canvas.SetClipRect(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom, gmInches);
            gmLabelEllipse  : FPreview.Canvas.SetClipEllipse(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom, gmInches);
            gmLabelRoundRect: FPreview.Canvas.SetClipRoundRect(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom, Corner, Corner, gmInches);
          end;
        end;
        Inc(NumDrawn);
        FBreakAdded := False;
        if Assigned(FOnDrawLabel) then
        begin
          AGmValueRect := TGmValueRect.Create;
          try
            AGmValueRect.AsInchRect := ARect;
            // call ondraw method...
            FOnDrawLabel(Self, NumDrawn, AGmValueRect, FPreview.Canvas);
          finally
            AGmValueRect.Free;
          end;
        end;
        FPreview.Canvas.RemoveClipRgn;
      end;
      if ((EqualPoints(LabelXYIndex, LastLabel)) or (FBreakAdded)) and (NumDrawn < NumLabels) then
      begin
        FPreview.NewPage;
        FCurrentXY := Origin;
        LabelXYIndex := Point(1,1);
      end
      else
      begin
        if FLabelDrawOrder = gmRows then
        begin
          FCurrentXY.X := FCurrentXY.X + LabelSpacingHorz[gmInches];
          if LabelXYIndex.X = NumLabelsHorz then
          begin
            FCurrentXY.X := Origin.X;
            FCurrentXY.Y := FCurrentXY.Y + LabelSpacingVert[gmInches];
            LabelXYIndex.X := 1;
            LabelXYIndex.Y := LabelXYIndex.Y+1;
          end
          else
            LabelXYIndex.X := LabelXYIndex.X+1;
        end
        else
        begin
          // draw order = gmCols
          FCurrentXY.Y := FCurrentXY.Y + ALabelSpacingVert;
          if LabelXYIndex.Y = NumLabelsVert then
          begin
            FCurrentXY.Y := Origin.Y;
            FCurrentXY.X := FCurrentXY.X + LabelSpacingHorz[gmInches];
            LabelXYIndex.X := LabelXYIndex.X+1;
            LabelXYIndex.Y := 1;
          end
          else
            LabelXYIndex.Y := LabelXYIndex.Y+1;
        end;
      end;
    end;
  end;
  SaveBrush.Free;
  SavePen.Free;
  FPreview.Canvas.LoadCanvasProperties;
  FPreview.EndUpdate;
end;

procedure TGmLabelPrinter.NewPage;
begin
  FBreakAdded := True;
end;

procedure TGmLabelPrinter.UseTemplate(ATemplate: TGmLabelTemplateInfo);
begin
  if ATemplate <> nil then
    FSelectedTemplate := ATemplate;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -