Delphi中printdialog,和fontdialog如何使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Delphi中printdialog,和fontdialog如何使用相关的知识,希望对你有一定的参考价值。

opendialog我知道怎么用
就是 if opendialog1.excute then
memo1.lines.loadfromfile(opendialog1.filename)
上面代码可以实现
类似这种格式,如何实现printdialog和fontdialog

一.PrintDialog 控件常用的属性、方法和事件
属性、方法和事件 功能解释
Collate 设置对话框中分页选项
Copies 设置对话框中份数
FromPage、ToPage 设置打印范围
Options 设置对话框的扩展属性

二.FontDialog 控件常用的属性、方法和事件
属性、方法和事件 功能解释
Device 设置字体显示设备
Font 设置字体
Options 设置字体的扩展属性
三.界面设计:
在【Form1】上放置一个【Memo】控件,名为【Memo1】,设置【Memo1】的【ScrollBars】属性为【ssBoth】,单击【Lines】属性右边的【⋯】按钮,编辑【Memo1】的【Lines】内容;在【Form1】上放置两个【Button】控件,分别名为【Button1】、【Button2】,设置【Button1】的【Caption】属性为【字体】,设置【Button2】的【Caption】属性为【颜色】;在【Form1】上放置一个【FontDialog】控件,名为【FontDialog1】;在【Form1】上放置一个【ColorDialog】,名为【ColorDialog1】;调整控件,形成程序界面图如图5.9-1 所示:
5、 代码设计:双击【Button1】按钮,输入如下代码(阴影部分):
procedure TForm1.Button1Click(Sender: TObject);
begin
if fontdialog1.Execute then
memo1.Font:=fontdialog1.Font;
end;
参考技术A procedure TForm1.Button5Click(Sender: TObject);
begin
if FontDialog1.Execute then
ListBox1.Font := FontDialog1.Font;

也可以单独设置分项
ListBox1.Font.Style := [fsBold, fsItalic, fsUnderline, fsStrikeOut];
ListBox1.Font.Color := FontDialog1.Font.Color; //字体颜色
ListBox1.Font.Style := FontDialog1.Font.Style; //字体样式 [fsBold, fsItalic, fsUnderline, fsStrikeOut]
ListBox1.Font.Size := FontDialog1.Font.Size; //字体大小
ListBox1.Font.Charset := FontDialog1.Font.Charset; //字符集

end;

打印的
procedure TForm1.Button7Click(Sender: TObject);
var
i: Integer;
PRNText: system.text;
begin
if PrintDialog1.Execute then
begin
AssignPrn(PRNText);
Rewrite(PRNText);
with Printer do
begin
Canvas.Font := ListBox1.Font;
for i := 0 to ListBox1.Count - 1 do
begin
system.Writeln(PRNText, ListBox1.Items[i]);
end;
end;
system.close(PRNText);
end;

end;
刚才只看到了fontdialog的,呵呵追问

这个我复制进去 运行 显示就是 prn ,printer没有定义

追答

刚才忘了说了,需要 uses Printers;

追问

uses Printers; 我也加了 就多了个printer没有定义了
我还有几个问题 ,因为我在做毕业设计,时间太紧了,呵呵学的又不好,好多问题,麻烦了
1、就是form2调用form1的adoquery问题 form2中我用的是DBGrid调用 ,但是DBGRID调用时必须在DATAsource中修改属性 ,但是是另一张form的datasource,怎么能实现
2、怎样在listbox中显示ADOQUERY查询到的所有记录,我现在只能显示DBGrid中指针所指的那条

追答

不会呀,我又试了一下,printer的没问题呀?而且我已经测试打印成功了,你将Pinters 放到上面那个uses里
datasource的问题,我的理解是不是你想将form2上的dbgrid的datasource设置为form1上的datasource?如果你问的是这个的话,那么直接设置就可以了,将form2上的dbgrid的datasource直接设置为form1.datasource1,就可以了,或者你在代码里设置dbgrid1.datasource := form1.datasource1;

listbox显示所有记录的问题,
if (ADOQuery1.Active) and (ADOQuery1.RecordCount > 0) then
begin
ADOQuery1.First;
ListBox1.Clear;
while not ADOQuery1.Eof do
begin
ListBox1.Items.Add(ADOQuery1.FieldByName('字段1').AsString);
//如果你想显示所有列,你就这样 ADOQuery1.FieldByName('字段1').AsString + ' ' + ADOQuery1.FieldByName('字段2').AsString
ADOQuery1.Next;
end;
end;

本回答被提问者和网友采纳

奇淫怪巧之给Delphi的PrintDialog增加一个页码选定范围打印的Edit 转

   在Delphi中使用PrintDialog打印对话框的时候,这个控件有三个选项,就是PrintRang那个属性的三个选项,其中有一个选项三,让我们自定义选择页码范围来打印。但是比较蛋疼的是,这个地方选中了之后啥子效果都没有。无法制定自己的页码范围,很是蛋疼。这里实际上应该要有一个Edit之类的编辑框的,这样可以让用户输入1,2,3-4之类的页码范围来整就比较人性化了。起初以为是自己没有指定某属性神马的导致,于是在控件的各个属性中找,找的我蛋都要裂开了,都没找出来似乎是隐藏了那个Edit的属性。。。。无果,整开了PrintDialog的源码看。也未发现相关的代码。咋办,咋办呢。路总是人走出来的,目的就是要在这个弹出的对话框上加一个编辑框就OK了,方式很多,可以在弹出来之后,查找句柄,然后创建一个Edit,然后SetParent就上去了。这是一方面,另外一方面,就是要配合对话框上,用户点击上面的选项来相应的联动这个Edit为可用或非可用状态。这个自然也是有办法的,我首先想到的就是Hook了,于是就用Hook整了,WH_CallWndProc消息处理过程函数的Hook,就行了。至于是要拦截神马消息,嘿嘿,这个是WinSDK的范畴,不熟悉的人,去翻番书,或者百度一番,就可以知道是WM_Command这个消息来处理窗口中的某些控件的消息处理的。首先就是要获取那个弹出的打印对话框的句柄了,我说过了可以用FindWindow来找。不过我这里要使用消息过程钩子,那么自然就不要这个了,直接从钩子中获取对话框句柄,会更加Happy。看看PrintDialog的代码,俺们可以知道,神马PrintDialog,OpenDialog,FontDialog打开都要触发WM_InitDialog这个消息,就是初始化对话框的消息。所以,第一步,俺们就拦截这个消息就 可以获取到句柄,然后创建俺们的Edit,然后将Edit设置到对话框中,俺们需要他在的位置。第二步,就是来拦截WM_Command,然后来处理和用户点击的联动处理咯。然后就是在对话框的Destroy消息中注销Hook,释放Edit。于是这个过程就OK了

首先在打开对话框之前,注册我们的过程处理钩子,必须要之前注册,因为要拦截WM_InitDialog消息嘛

procedure TForm1.Button1Click(Sender: TObject);
begin
  CEdit := TEdit.CreateParented(Application.Handle);
  CEdit.Parent := Application.MainForm;
  Hok := SetWindowsHookEx(WH_CALLWNDPROC,WNDProcHook,HInstance,GetCurrentThreadId);
  if PrintDialog1.Execute then
  begin
    ShowMessage(CEdit.Text);
  end;
  UnhookWindowsHookEx(HOK);
  FreeAndNil(CEdit);
end;

然后是钩子函数过程处理

var
  DownBtnID: Integer;
  PrntDlgHandle: THandle;
  CEdit: TEdit;
function WNDProcHook(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall;
var
  msg: PCWPSTRUCT;
  wNotifyCode,wID: Word;
  r,WinR: TRect;
  DwonBtnHandle: THandle;
begin
  if code < 0 then
    Result := CallNextHookEx(Hok, code, wparam, lparam)
  else
  begin
    msg := PCWPSTRUCT(lparam);
    case msg.message of
    WM_INITDIALOG:
       begin
          PrntDlgHandle := msg.hwnd;
          DwonBtnHandle := FindWindowEx(PrntDlgHandle,0,\'Button\',\'打印范围\');
          Windows.SetParent(CEdit.Handle,DwonBtnHandle);
          GetWindowRect(DwonBtnHandle,WinR);
          CEdit.Visible := True;
          DwonBtnHandle := FindWindowEx(PrntDlgHandle,0,\'Button\',\'选定范围(&S)\');
          CEdit.Enabled := SendMessage(DwonBtnHandle,BM_GETCHECK,0,0) = 1;
          GetWindowRect(DwonBtnHandle,r);
          DownBtnID := GetDlgCtrlID(DwonBtnHandle);
          CEdit.Left := r.Right - WinR.Left;
          CEdit.Top := r.Top - WinR.Top;
       end;
    WM_COMMAND:
       begin
          if msg.hwnd = PrntDlgHandle then
          begin
            wNotifyCode := HIWORD(Msg.wparam);
            wID := LOWORD(Msg.wParam);
            if wNotifyCode = BN_CLICKED then
            begin
              CEdit.Enabled := wID = DownBtnID
            end;
          end;
       end;
    WM_DESTROY:
       begin
         //UnhookWindowsHookEx(HOK);
         //Hok := 0;
         //FreeAndNil(CEdit);
       end;
    end;
    Result := 0;
  end;
end;

  可见,我这里注销了WM_Destroy中的处理。目的是因为俺们还需要返回这个Edit中的内容嘛,所以我们直接在使用完了之后注销钩子,释放Edit就行了!

实现之后的效果,就是这样的咯

以上是关于Delphi中printdialog,和fontdialog如何使用的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中,PrintDocument 和 PrintDialog 中的 PrinterSettings 有啥区别?

WPF 打印操作之PrintDialog

将 PrintDialog 拦截到 XPS 文档编写器

WPF安装打印机驱动后PrintDialog 执行打印事件

PrintDialog.ShowDialog(this) 在 Windows 7 上立即返回 DialogResult.Cancel

通过代码更改 PrintDialog 中的打印机名称