var
 ts:Tprinter;
 s:string;
begin
 try
 s:=inputbox('提示','hi','');
 if s='' then exit;
 ts:=Tprinter.Create;
 ts.BeginDoc;
 //textout(p.Handle,50,69,pchar('sdfsdf'),6); 
 ts.Canvas.TextOut(0,0,'s');
 ts.EndDoc;
 ts.Free;
 except
  showmessage(inttostr(getlasterror));
 end;
//===========
程序如上,在2003上表现正常,在2000中单独编写为程序时正常,这段代码放入另外一个程序时报错,经检测是ts.beginDoc 这行代码,getlasterror=6 无效句柄.用api  textout 同样如此,到底那里错了啊?

解决方案 »

  1.   

    用writetofile试试
    把端口看成文件
      

  2.   

    没有必要这样打印吧?直接打印就行了为何要 ts:=Tprinter.Create?printer.Canvas.TextOut(0,0,'s') 就可以。
      

  3.   

    uses Printers;单元的时候
    直接用Printer就行了,不用再手工去创建;
    他的定义是:
    function Printer: TPrinter;
    begin
      if FPrinter = nil then FPrinter := TPrinter.Create;
      Result := FPrinter;
    end;
      

  4.   

    writetofile 不适合,我要定位文字的坐标.直接用function printer:Tprinter 也不行.
    如果是vb倒可以,可是delphi中这个函数返回Tprinter
    类,效果和ts:=Tprinter.create是一样的.正确用法如下:
    var
     i:integer;
    begin
     printer.BeginDoc;  //依然要调用beginDoc
        for i:=0 to 10 do
        begin
          //textout(p.Handle,50,69,pchar('sdfsdf'),6);
          printer.Canvas.TextOut(50,69*(i+1),'haha,I finally it');
        end;
      printer.EndDoc;
    end;
    这样用才可以,否则报错.我的错误关键在于:
    ------
    在2003上表现正常,在2000中单独编写为程序时正常,这段代码放入另外一个程序时报错,
    ------
    那段代码独立出来是正常的执行的!!!放入另外程序中就错了,那个程序调用了WH_JOURNALRECORD钩子,
    但是调试的时候我关闭了这个钩子,错误一样存在.
      

  5.   

    要么直接uses Printers,要么检查你的那个出错的程序里去掉uses Printers看看
      

  6.   

    wo kao,很多事情真没办法解释,
    function Printer: TPrinter;
    begin
      if FPrinter = nil then FPrinter := TPrinter.Create;
      Result := FPrinter;
    end;看代码function printer和ts:=Tprinter.create效果一样,但是用ts报错,
    用printer不报错.
      

  7.   

    呵呵Printer默认是一个全局的打印变量,你的create以后的是你自己的一个临时变量,不是由系统维护的,而function printer应该返回的是全局变量的引用
      

  8.   

    但是,别的程序中,ts:=Tprinter.create都是正常的,不报错的.只有那个带钩子的打印程序
    用ts:=Tprinter.create不行,而且不安装钩子,那个程序打印依然失败,在从代码看,也看不出来什么,真是奇怪了....