需要帮助用delphi打印文本文件

2024-01-08

我正在尝试使用 Delphi 2010 打印文本文件。我找到了一些代码,但是当我运行时,它要求保存 xps 文件,但不显示打印对话框。代码位于http://www.delphipages.com/forum/showthread.php?t=72986 http://www.delphipages.com/forum/showthread.php?t=72986

procedure TForm1.print_btnClick(Sender: TObject);
var
  filename: string;
begin
  filename := 'printfile.txt';
  ShellExecute(handle, 'print', pchar(Filename), nil, nil, SW_NORMAL);
end;

另一个位于http://www.delphibasics.co.uk/Article.asp?Name=Printing http://www.delphibasics.co.uk/Article.asp?Name=Printing

这个是一次又一次循环“确定”对话框,它无法打印任何内容。

问候


Option 1

您可以编写自己的打印代码。一个简单的例子(uses Printers):

procedure PrintTextFile(const FileName: string; const Numbering: boolean = true);
const
  FONT_NAME = 'Times New Roman';
  FONT_SIZE = 10;
var
  MARGIN: integer;
  sl: TStringList;
  i, h: Integer;
  r, rFooter: TRect;
  s: string;
  DocEnd: integer;
begin
  with TPrintDialog.Create(nil) do
    try
      if not Execute then
        Exit;
    finally
      Free;
    end;
  sl := TStringList.Create;
  try
    sl.LoadFromFile(FileName);
    Printer.BeginDoc;
    Printer.Title := FileName; // or application name or sth else
    Printer.Canvas.Font.Name := FONT_NAME;
    Printer.Canvas.Font.Size := FONT_SIZE;
    MARGIN := 5*Printer.Canvas.TextWidth('M');
    DocEnd := Printer.PageHeight - MARGIN;
    if Numbering then
    begin
      dec(DocEnd, 2*Printer.Canvas.TextHeight('8'));
      rFooter := Rect(0, DocEnd, Printer.PageWidth, Printer.PageHeight - MARGIN);
      DrawText(Printer.Canvas.Handle,
        PChar(IntToStr(Printer.PageNumber)),
        length(IntToStr(Printer.PageNumber)),
        rFooter,
        DT_SINGLELINE or DT_CENTER or DT_BOTTOM);
    end;
    r.Left := MARGIN;
    r.Top := MARGIN;
    for i := 0 to sl.Count - 1 do
    begin
      r.Right := Printer.PageWidth - MARGIN;
      r.Bottom := DocEnd;
      s := sl.Strings[i];
      if s = '' then s := ' ';
      h := DrawText(Printer.Canvas.Handle, // Height of paragraph on paper
        PChar(s),
        length(s),
        r,
        DT_LEFT or DT_TOP or DT_WORDBREAK or DT_CALCRECT);
      if r.Top + h >= DocEnd then
      begin
        Printer.NewPage;
        if Numbering then
          DrawText(Printer.Canvas.Handle,
            PChar(IntToStr(Printer.PageNumber)),
            length(IntToStr(Printer.PageNumber)),
            rFooter,
            DT_SINGLELINE or DT_CENTER or DT_BOTTOM);
        r.Top := MARGIN;
        r.Bottom := DocEnd;
      end;
      if h > Printer.PageHeight - 2*MARGIN then
        raise Exception.Create('Line too long to fit on single page.');
      DrawText(Printer.Canvas.Handle,
        PChar(s),
        length(s),
        r,
        DT_LEFT or DT_TOP or DT_WORDBREAK);
      inc(r.Top, h);
    end;
    Printer.EndDoc;
  finally
    sl.Free;
  end;
end;

Warning:上面的代码做了not如果文本文件中的任何单行太宽以至于无法容纳在单张纸上(换行后),则可以使用。我现在太累了,无法解决这个问题。

Option 2

一个令人讨厌的伎俩是使用一个看不见的东西TRichEdit打印。

procedure PrintTextFile(AOwner: TWinControl; const FileName: string);
begin
  with TRichEdit.Create(nil) do
    try
      Visible := false;
      Parent := AOwner;
      Lines.LoadFromFile(FileName);
      with TPrintDialog.Create(nil) do
        try
          if Execute then
            Print(FileName);
        finally
          Free;
        end;
    finally
      Free;
    end;
end;

我建议不要这样做,因为它有点太令人讨厌了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

需要帮助用delphi打印文本文件 的相关文章

  • 使用远程数据编写 Android、iPad、iPhone 客户端的技术

    我需要探索世界 你写了一个杀手级应用程序 但你有 Android iPhone iPad 客户端吗 我的问题是 1 向这些设备发送数据的最佳方式是什么 按照建议进行肥皂和休息here https stackoverflow com ques
  • 德尔福和Doxygen

    我想使用 doxygen pas2dox 记录我的源代码 当我设置好所有内容 包括过滤器和提取选项 提取所有内容 时 doxygen 运行良好 但生成的文档仅包含源文件作为链接 并且没有提取类型 方法 过滤后的源看起来不错 有任何提示如何定
  • 新编译的应用程序需要 UAC/elevation?

    我有一个系统 我将其设置为普通的 UAC 并在我的 delphi 环境中编译名为 ka exe 的项目 并为其创建一个 installshield 项目 设置完毕 一切顺利 但每当我开始我的程序时 它都需要提升 而我不知道为什么 为了确保
  • Soap Delphi 客户端因 1MB 调用超时而结束

    我们正在开发 SOAP Web 服务 Apache PHP 所有小规模调用都运行良好 但对于 1Mb 的 Soap 调用 HTTPS 调用大小为 1MB 我们的 Delphi Soap 客户端在除一台 PC 之外的所有 PC 上都因超时而停
  • 从不同的形式调用过程

    我正在使用 Lazarus 我有一个名为TForm1单元名称为 Unit 1 在这里我有一个名为mergeDATfile a shortint 这会产生一些东西 顺便说一句 我必须创建另一个名为TForm2里面有按钮 Button1 当它被
  • 如何使用 IdTCPClient 等待来自服务器的字符串?

    我的 IdTelnet indy 10 1 有问题 我无法以 Unicode 模式从服务器读取数据 现在我想用 IdTCPClient 编写 telnet 终端 服务器有时发送一行 有时发送越来越多的行 但发送之间没有固定的时间 现在我的问
  • “已发布集 '%s' 的大小大于 4 字节”。如何修复这个编译器错误?

    我有一组包含 138 个值的枚举值 就像是 type TSomething sOne sTwo sThree sOnehundredAndThirtyeight TSomethings set of TSomething TSomethin
  • 在 tlistbox 中绘制缩略图

    在 DelphiXE 中 我使用 tFileOpenDialog 选择一个文件夹 然后在 tListBox 中列出该文件夹中的所有 jpg 文件 我允许将列表项拖放到列表中进行自定义排序 以便稍后按顺序显示它们 我希望能够在文件名旁边绘制图
  • 构建机器是否需要单独的 Delphi XE4 许可证?

    用于通过以下方式构建应用程序dcc32在构建服务器上我可以使用 Delphi Trial 这种方法的许可证没有任何问题 现在 我将通过以下方式在 TeamCity 上构建 Delphi XE4 应用程序msbuild 我是否需要拥有构建机器
  • Delphi:如何检查是否按下了任何鼠标按钮 - 在鼠标事件之外?

    我有一个 TDrawGrid 想要处理单击单元格并使用鼠标滚轮滚动单元格的方式略有不同 使用鼠标滚轮滚动时 视图应以选定的单元格为中心 而仅单击单元格时 视图不应居中移动 因为这会令人困惑 用鼠标滚轮滚动会触发OnSelectCell事件
  • 如何等到我启动的程序使用完该文件后才删除该文件?

    我一直在寻找一种方法来打开通过 Delphi 应用程序及其适当的应用程序保存到我的计算机上的文件 该文件存储在 SQL 数据库中的 Varbinary 字段中 加载到内存流中 然后通过 TMemoryStream 的 SavetoFile
  • 如何使用 VCL 类的接口 - 第 2 部分 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 继续我之前关于使用 VCL 接口的调
  • 有没有办法在 TRttiField 中 FieldType 为零的结构中获取 real48 和短字符串变量的 RTTI 提示?

    我发现 Delphi 中的扩展 RTTI 功能有一个奇怪的疏忽 可能是故意的 我想转储包含大约 1500 个不同字段的记录类型中的所有字段 是的 认真的 其中一些是 real48 类型 一些是短字符串 对于这两种类型 在运行时这些类型的 F
  • 以高效的方式将字符串转换为十六进制

    我开发了以下函数将字符串转换为十六进制值 function StrToHex const S String String const HexDigits array 0 15 of Char 0123456789ABCDEF var I I
  • XE2 中的 COM 是否损坏?我该如何解决它?

    Update XE2 Update 2 修复了下述错误 下面的程序是从实际程序中截取的 在 XE2 中失败并出现异常 这是 2010 年的回归 我没有 XE 来测试 但我希望该程序在 XE 上运行良好 感谢 Primo 确认代码在 XE 上
  • Delphi错误数据集未处于插入或编辑模式

    客观的 单击 TRxDBCombo 上的按钮调用搜索框 从搜索框中选择记录时 结果将设置为 TComboEditBox 的字段值 并发布在 TRxMemoryData 数据集中 错误 第二次调用此函数时出现数据集未处于插入或编辑模式 TDB
  • 如何更改 Chromium 组件的默认背景颜色?

    I use TChromium http code google com p delphichromiumembedded 我分配AWebPageAsString这是一个带有灰色背景颜色的静态 HTML 页面 FBrowser TChrom
  • 如何添加资源并使用它们

    在我的应用程序中 我想添加 2 个图像作为资源 我想使用这些图像 当我在应用程序中单击 是 按钮时 第一张图像将被设置为壁纸 当我在应用程序中单击 否 按钮时 第二张图像将被设置为桌面壁纸 提前致谢 regards 最简单的方法是创建一个文
  • 在运行时创建 TQReport 元素

    在运行时创建 TQReport 元素 嗯 至少尝试一下 我不知道这份报告中应出现哪些标题或数据 我得到一个代表数据行和列的 TString 的 TList 我在组的带打印事件中植入 创建 指令 并在主数据行带的 OnNeedData 事件中
  • 如何将我的图标添加到组件选项板页面中的组件? [复制]

    这个问题在这里已经有答案了 可能的重复 Delphi非可视化组件图像 https stackoverflow com questions 3319276 delphi non visual component image 如何将我的图标添加

随机推荐

  • 没有 sudo 访问权限无法安装 Python

    我在我的服务器中提取 配置并使用了 make 作为安装包 但是 我无法使用进行安装 我收到错误 wepapps python Python 2 6 1 make install usr bin install c python usr lo
  • MVC 5 捆绑错误

    我有一个大问题 我创建了一个 MVC 5 项目 但无法使用默认代码启动它 问题出在捆绑上 它停在 Global asax cs Application Start方法 在BundleConfig RegisterBundles Bundle
  • 如何解决 Ionic 未捕获错误:找不到模块“。”添加新页面时?

    未捕获的错误 找不到模块 at webpackMissingModule index js 3 at e code index js 3 at Object
  • 为什么 flutter.dev 无法访问?

    我似乎无法访问 flutter dev 网站 我尝试使用不同的浏览器 设备和网络 但总是无法访问 无法访问该网站 flutter dev 响应时间过长 Tried tracert flutter dev只到达主路由器并开始timeout 我
  • 如何在摩纳哥编辑器中设置行尾

    默认为 CRLF 我想将其更改为 LF 因为我正在处理 BASH 脚本 请帮忙 我已浏览文档但找不到任何解决方案或示例 https github com Microsoft vscode blob 013501950e78b9dde5c2e
  • 使用适用于 IE 的 Javascript 模拟单击​​链接

    我想让 javascript 单击页面上的链接 我在网上发现了一些建议添加如下功能的内容 function fireEvent obj evt var fireOnThis obj if document createEvent var e
  • 如何检测 iframe 来源何时更改?

    我想检测用户何时单击其中的链接iframe并改变来源iframe 因为我想调整它的大小 我也使用 jQuery 检测这一点的最佳方法是什么 实际上我需要这样的东西 这个例子是在jQuery中 它不起作用 我想象这个 iframe live
  • 为什么 BindingSource 不告诉我哪个属性已更改?

    我正在考虑使用数据绑定 最简单的事情似乎是使用 BindingSource 来包装我的数据对象 然而 虽然 CurrentItemChanged 事件告诉我属性何时发生更改 但它并没有告诉我是哪一个属性发生更改 而这是我需要的重要部分 有什
  • 动画关键帧的 scss 函数

    我想做一个可重用的 sass 函数 让我可以轻松编写 keyframescss 动画 无需编写太多代码 但我不知道如何去做 尤其是数学部分 我有一个包含带有此 css 的单个背景图像的 div height 100vh width 8000
  • 与页面交互时图像质量第二次下降

    当页面以任何方式移动时 窗口大小调整 滚动 悬停 用作图标的图像会重新渲染并使侧面变得粗糙 它在具有透明背景和圆形边框的图像上非常明显 如示例中所示 有什么办法解决这个问题吗 例子 img src http www iconsd
  • 基本 Firebase 数据库保存

    任何人看到下面的内容都是正确的答案 并且我的所有设置都正确 我仍然不知道问题是什么 我用 facebook 登录 用它来创建一个 firebaseuser 对象 然后发送以下内容作为测试数据 我发现这是一个间歇性问题 从设备上卸载应用程序并
  • Reactjs - 控制多个复选框

    我在 Reactjs 中构建了一个 CheckAllBoxes 组件 我有一个物品清单 fruits orange apple grape 将军
  • 如何在不使用“return”语句的情况下退出异步协程?

    我在决定如何打破这个协程时遇到了一些麻烦 如果except声明捕获 通常 我只会使用 def f x try foo var next a volitile generator x except Exception print it bro
  • 如何在 Room 中动态创建新表?

    请帮帮我 在我的应用程序中 用户可以通过按按钮创建新的数据库表 用户还可以稍后访问该表以接收其中的数据 目前我通过 dataBaseHelper 类利用旧的 SQLite 所以我可以 public static void createTab
  • 如何在 Airflow 中的 PythonOperator 中登录 Python 函数

    我在 Airflow DAG 中使用 PythonOperator 并且需要在操作符的 Python 函数中打印一些内容 我尝试打印 但显然没有成功 不太确定这会起作用 接下来我尝试在 PythonOperator 中传递 self log
  • XAML 中的属性 Duration 不允许值类型 Duration

    我正在尝试使用普通的 Windows Metro 风格应用程序执行以下操作 public class MyButton Button public Duration Duration get set
  • 元类冲突:基类和派生类具有不同的元类

    class AbstractBaseClass metaclass abc ABCMeta abc abstractmethod def someMethod class DerviedClass AbstractBaseClass met
  • Sqlite + Java:表未更新

    我正在使用 SQLite 的 Java 包装器 名为SQLiteJDBC http www zentus com sqlitejdbc 这可能会对任何答案产生一些影响 我有一个在 GUI 中显示的表 在该 UI 中 我有一个用于该表的单个行
  • 地址可达性 - 服务器和端口 - iOS 5

    我正在尝试检查服务器是否在线或离线 连接到服务器时我面临一个问题 即它有一个端口 我现在的代码 struct sockaddr in address address sin len sizeof address address sin fa
  • 需要帮助用delphi打印文本文件

    我正在尝试使用 Delphi 2010 打印文本文件 我找到了一些代码 但是当我运行时 它要求保存 xps 文件 但不显示打印对话框 代码位于http www delphipages com forum showthread php t 7