📄 gmlabelprinter.pas
字号:
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 + -