2010-05-11 51 views
4

我沒有編程背景,這是我的第一槍。我寫了一個應該在結果表上打印的Delphi程序。我在一個研究所工作,我們必須每兩個月建立數百個結果表。這很難做到,不同的筆跡也是一個重要的問題。我有這樣的代碼:如何在正確的座標處打印文本字段?

if PrintDialog.Execute() then 
    begin 
     with MyPrinter do 
     begin 
      MyPrinter.BeginDoc();//Start Printing 

      //Prints First Name 
      MyPrinter.Canvas.TextOut(FirstNameX,FirstNameY,EditFirstName.Text); 

      //Prints Last Name 
      MyPrinter.Canvas.TextOut(LastNameX,LastNameY,EditLastName.Text); 

      //Prints Level 
      MyPrinter.Canvas.TextOut(LevelX,LevelY,EditLevel.Text); 

      //Prints Date 
      MyPrinter.Canvas.TextOut(DateX,DateY,MEditDate.Text); 

      //Prints Student Number 
      MyPrinter.Canvas.TextOut(StdNumX,StdNumY,EditStdnumber.Text); 
      .... 
      MyPrinter.EndDoc();//End Printing 
     end; 
     end; 

我無法獲得正確的座標以正確打印。我錯過了什麼嗎?我怎樣才能設置正確的座標?您知道TPrinter使用像素來獲得座標,但紙張的尺寸以英寸或釐米爲單位。 我真的很困惑。我感謝任何幫助。

+3

由於您沒有編程背景......一些提示。不錯,但由於您明確使用MyPrinter對象,所以使用「with..do」構造是多餘的。擺脫... ..因爲他們只是讓生活變得艱難,模糊你的意圖,並混淆Code Insight。使用一致的2字符縮進。 – 2010-05-11 23:18:46

+1

「使用一致的2字符縮進。」 甚至更​​好:使用代碼格式化程序,因此您不必手動執行。 – dummzeuch 2010-05-12 09:21:54

回答

4

@Milad我建議你使用像Quick Report這樣的報告組件(隨德爾福的舊版本一起提供,並且非常易於使用)或FreeReport(它是免費的),使您的任務更輕鬆。

更多信息檢查論文鏈接

如果你想不組件德爾福直接打印

在這裏我留下幾個環節,可以幫助。

+1

換句話說,看看Delphi版本中捆綁的任何報告生成器:例如,它可能是ReportBuilder。如果你想花一些錢(而且你不應該做一次性工作),你可能想看看FreeReport的大哥FastReport ... – 2010-05-12 06:12:19

1

邊使用報告工具是一個好主意,如果你確實想自己做,你可以。我這樣做是爲了在我們的許可應用程序中打印自定義紙張。關鍵是要知道紙張的大小,並使用打印機的PageHeight和PageWidth屬性來解決這個問題。對於A4紙,我選擇使用297毫米×210毫米,由此我能夠計算出我想要的東西。該計算是這樣完成的:

nStartPos := 210-141; 
nUserColX := muldiv(localPrinter.PageWidth, 187, 297); 
nUserColY := muldiv(localPrinter.PageHeight, nStartPos, 210); 

的nStartPos變量做是爲了開始在一個特定的地方,然後nUserColY用於向下移動在時間線如下:

nUserColY := nUserColY - localPrinter.canvas.font.height - (localPrinter.canvas.font.height div 8); 

然後,這一次允許多條線路適合。 這不完整,但應該是自定義打印的良好開端。