请问我用delphi做的控件,出现一个怪问题!(100分)

  • 主题发起人 主题发起人 jiu
  • 开始时间 开始时间
J

jiu

Unregistered / Unconfirmed
GUEST, unregistred user!
我编写的delphi控件,先把打印机设为快速打印,但调用我的控件以后,出现快速打印
消失了,我很急!!
我调用的是api函数!
 
你调用的是Api,可以逐行测试,看到底是哪一个Api出的问题,同时是否可以尝试在调用你的
Api后再改为告诉打印,只是看是否能够实现。
估计这个问题需要你自己去耐心调试。
 
我没有对打印机进行初始!
当我调用以后,程序改变了打印机的设置!
请帮帮忙!
 
我没有使用过那方面的函数,不过是否可以这样。
首先程序执行时读出打印机状态。
然后进行你的Api调用,接着强打印接状态写回。

有一点外行,见笑,希望有帮助。
 
你对api熟不熟!麻烦解决以下,我很急!!
 
挑选出问题的关键代码贴上来吧,也许大家能够给你一些帮助。
我这里没有能够告诉打印的打印机,可能只能看一下代码。
 
对了,不知道你是否拥有HubDog的葵花宝典,他手机的打印技巧可不少呀,对你应该有帮助的。
 
没有!请告知!
拜托!!!!
 
这里可以下载。Delphi资源社区,不错的。[:)]
http://delphi.mychangshu.com/dispdoc.asp?id=168
http://delphi.mychangshu.com/data/HUBDOG.CHM
 
你会不会发控制码,
给打印机,你的qq是多少!
 
没做过。[:)]
看我在Delphibbs论坛泡着,而且回的速度这么快,象有QQ的吗?[:D][:D][:D]
我很不喜欢那东西。[8D]
 
那你就在论坛上回复,好吗!
 
你连出错代码都没有,怎么找错误呀?[?]
 
我把代码给你
with printer,printer.Canvasdo

begin


begin
Doc ;
//字体
font.Name :=df;

for j:=0 to ido

begin

during1:=dtext[j];
strpcopy(during,during1);

//是否打印的内容是否超过制定的长度
if strlen(during)>dmax then

during1:=copy(during1,0,dmax);
font.Size :=dts[j];
//打印的内容是否为空
if during1<>'' then

textout(dtx[j]*2,dty[j]*2,during1);
end;

EndDoc ;
以上都通过了
 
pChar类型的during是否申请空间?
我是在没有办法,因为我的打印机是Hp Lastjet,不能看到你的问题。
只好将HubDog的一段打印程序粘贴上来了,希望对你有用。
代码:
uses CommDlg;

{$IFNDEF WIN32}
 const MAX_PATH = 144;
{$ENDIF}

procedure TForm1.Button1Click(Sender: TObject);
var
  Pd : TPrintDlg;
 do
cInfo: TDocInfo;
begin

  FillChar(Pd, sizeof(Pd), #0);

  Pd.lStructSize := sizeof(Pd);
  Pd.hWndOwner := Form1.Handle;
  Pd.Flags := PD_RETURNDC;
  if PrintDlg(pd) then
 begin

    FillChar(DocInfo, sizeof(DocInfo), #0);
   do
cInfo.cbSize := SizeOf(DocInfo);
    GetMem(DocInfo.lpszDocName, 32);
    GetMem(DocInfo.lpszOutput, MAX_PATH);
    lStrCpy(DocInfo.lpszDocName, 'Mydo
cument');
   {Add this line to print to a file }
    lStrCpy(DocInfo.lpszOutput, 'C:/Download/Test.doc');
    StartDoc(Pd.hDc,do
cInfo);
    StartPage(Pd.hDc);
    TextOut(Pd.hDc, 100, 100, 'Page 1', 6);
    EndPage(Pd.hDc);
    StartPage(Pd.hDc);
    TextOut(Pd.hDc, 100, 100, 'Page 2', 6);
    EndPage(Pd.hDc);
    EndDoc(Pd.hDc);
    FreeMem(DocInfo.lpszDocName, 32);
    FreeMem(DocInfo.lpszOutput, MAX_PATH);
  end;

end;

//////////////////////////////////////////////////////
uses winspool;

procedure PrintFile(const sFileName: string);
const
  BufSize = 16384;
type
  TDoc_Info_1 = record
    pDocName: pChar;
    pOutputFile: pChar;
    pDataType: pChar;
  end;

var
  Count, BytesWritten: integer;
  hPrinter: THandle;
  Device : array[0..255] of char;
  Driver : array[0..255] of char;
  Port   : array[0..255] of char;
  hDeviceMode: THandle;
 do
cInfo: TDoc_Info_1;
  f: file;
  Buffer: Pointer;
begin

  Printer.PrinterIndex := -1;
  Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
  if not WinSpool.OpenPrinter(@Device, hPrinter, nil) then
 exit;
 do
cInfo.pDocName := 'MyDocument';
 do
cInfo.pOutputFile := nil;
 do
cInfo.pDatatype := 'RAW';
  if StartDocPrinter(hPrinter, 1, @DocInfo) = 0 then

  begin

    WinSpool.ClosePrinter(hPrinter);
    exit;
  end;

  if not StartPagePrinter(hPrinter) then

  begin

    EndDocPrinter(hPrinter);
    WinSpool.ClosePrinter(hPrinter);
    exit;
  end;

  System.Assign(f, sFileName);
  try
    Reset(f, 1);
    GetMem(Buffer, BufSize);
    while not eof(f)do

    begin

      Blockread(f, Buffer^, BufSize, Count);
      if Count > 0 then

      begin

        if not WritePrinter(hPrinter, Buffer, Count, BytesWritten) then

        begin

          EndPagePrinter(hPrinter);
          EndDocPrinter(hPrinter);
          WinSpool.ClosePrinter(hPrinter);
          FreeMem(Buffer, BufSize);
          exit;
        end;

      end;

    end;

    FreeMem(Buffer, BufSize);
    EndDocPrinter(hPrinter);
    WinSpool.ClosePrinter(hPrinter);
  finally
    System.Closefile( f );
  end;

end;


*************************************
 procedure WriteRawStringToPrinter(PrinterName: String;
S: String);
 var
   Handle: THandle;
   N: DWORD;
  do
cInfo1: TDocInfo1;
 begin

 if not OpenPrinter(PChar(PrinterName), Handle, nil) then

   begin

   ShowMessage('error ' + IntToStr(GetLastError));
   Exit;
   end;

 withdo
cInfodo

   begin

   pDocName := PChar('testdo
c');
   pOutputFile := nil;
   pDataType := 'RAW';
   end;

 StartDocPrinter(Handle, 1, ocInfo);
 StartPagePrinter(Handle);
 WritePrinter(Handle, PChar(S), Length(S), N);
 EndPagePrinter(Handle);
 EndDocPrinter(Handle);
 ClosePrinter(Handle);
 end;


The PrinterName parameter must be the name of the printer as it is
installed. For example, if the name of the printer
is "HP LaserJet 5MP" then
 that is what you should pass.
</quote>
/////////////////////////////////////////////////////

Use CreateFile to get a handle to LPT1

  LPTHandle := CreateFile( 'LPT1',GENERIC_WRITE,
                 0, PSecurityAttributes(nil),
                 OPEN_EXISTING, FILE_FLAG_OVERLAPPED,
                 0);


then
 use WriteFile to send a string of characters or use

  While not
    TransmitCommChar( LPTHandle, CharToSend )do

      Application.ProcessMessages;

It sends one raw character at a time to the parallel port. It waits for the recent character to get processed and then
 immediately sends a new one. I got it printing stuff
pretty fast.
 
我不会发控制码给打印机,该打印机的高速打印的控制码值为68(十进制);
能否告诉我!!
 
我也不知道,不过有一个不知道是否正确的思路。
使用CreateFile打开打印机,然后使用WriteFile发送命令,
似乎应该是Escapt指令集,需要添加Esc+68的。
实验一下。
 
麻烦你跟我写详细一点,最好用语句写,谢谢
 
没有呀,只是思路,我必须下了,还要回宿舍呢,呵呵,明天看看吧,估计你需要多查一些资料。
将HubDog的葵花宝典下载下来好好看看。
保证你受益非浅!
 
后退
顶部