问题是这样的我用GetTextMetrics(Printer.Canvas.Handle, Metrics) 
得到Result := Metrics.tmAveCharWidth;
然后在传给我的打印代码 Xmm := Xmm + FiOffSetX/10;
  Ymm := Ymm + FiOffSetY/10;
  Px := Round(Round(Xmm * HPointsPerInch * 10000/25.4) / 10000);
  Py := Round(Round(Ymm * VPointsPerInch * 10000/25.4) / 10000);
  Py := Py - GetOffSetY;  //因为是绝对坐标, 因此, 不用换算成相对于Y轴坐标
  Px := Px + 2 * AvgCharWidth;
  //ShowMessage(IntToStr(AvgCharWidth));
  Printer.Canvas.Font.Name :=FontName;
  Printer.Canvas.Font.Style:=Fontstyle;
  Printer.Canvas.Font.Size := FontSize;
   //Printer.Canvas.Font.Color := clGreen;
  if not Printer.Aborted then
    Printer.Canvas.TextOut(Px, Py, Txt);然后奇怪的事情就出现了,
我showmessage(IntToStr(AvgCharWidth)),程序初次运行的时候,第一个AvgCharWidth:=9
                                                       第二个AvgCharWidth:=27
                                      当我在发出打印指令,程序再次开始的时候
                                                              第一个变成AvgCharWidth:=13
                                                       第二个还是AvgCharWidth:=27
这样的话,程序初次运行所打印的第一个字符的位置,就和以后程序运行所打印的第一个字符位置不一样了
(我打印的是邮编,一个数字一个坐标)
现在打出来的效果就是这样的6 10000,中间始终空着
那位高手指点一下江山啊,在线等,谢谢!