Iscem escape sekvenco blagajniskega predala

Problemi s strojno opremo.
alesp
Prispevkov: 9
Pridružen: 03.10.2003 06:31:17

Iscem escape sekvenco blagajniskega predala

Odgovor Napisal/-a alesp » 23.10.2007 12:23:37

Na serijski port je lahko povezana samo ena naprava naenkrat. Ce imas na istem portu se tiskalnik, se seveda nanj sploh ne mores povezati. Poskrbeti moras, da port ni zaseden, oz. ce je zaseden, uporabniku pokazes ustrezno sporocilo.

SimonG
Prispevkov: 86
Pridružen: 12.08.2002 01:04:31

Iscem escape sekvenco blagajniskega predala

Odgovor Napisal/-a SimonG » 23.10.2007 16:10:58

Pozdravljen

pišem iz glave ker nisem za računalnikom s source kodo
sam imam to rešeno na sledeč način :
na računalnik je priključenih več tiskalnikov...pos tiskalnike lahko instaliraš pod win in prišeš nanje preko driverjev,
v tem primeru imam narejen izpis na printer.canvas itd...,
mislim, da imajo pos tiskalniki (kadar jih instaliraš preko win. dodan control font s katerim lahko odpiraš predal itd)

ali pa direktno na port
na com port blagajniški printer (kot v dos-u) z ukazi writeln.

lp simon

p.s. meni odpira predal esc in mala črka i (star in epson tiskalniki)

M.C
Prispevkov: 630
Pridružen: 24.02.2003 14:27:43

Iscem escape sekvenco blagajniskega predala

Odgovor Napisal/-a M.C » 24.10.2007 11:29:45

Poskus prestavitve printerja na drug port:


Printer v winsih ima nastavljen na COM2, priključen pa je na COM1
Zakaj tole ne dela, če je FILE: pa dela ?

Koda: Izberi vse

  

var
  pDevice : pChar;
  pDriver : pChar;
  pPort   : pChar;
  hDMode : THandle;
  PDMode : PDEVMODE;
  PrintDialog: TPrintDialog;
begin

    Printer.PrinterIndex := 4;
  //Test --> dela če je printer priključen na com1 in v winsih tudi tja nastavljen  
   //Printer.BeginDoc;
   // Printer.Canvas.TextOut(0,0, 'Delphi Is RAD!');
   // Printer.EndDoc;
  //exit;



  

    GetMem(pDevice, cchDeviceName);
    GetMem(pDriver, MAX_PATH);
    GetMem(pPort, MAX_PATH);
    Printer.GetPrinter(pDevice, pDriver, pPort, hDMode);
    // PRINTA V FILE
    //Printer.SetPrinter(pDevice, PDriver, 'FILE:', hDMode);
    //PRINTA kao na  COM1, samo se ne zgodi nič
    Printer.SetPrinter(pDevice, PDriver, 'COM1:', hDMode);    
    FreeMem(pDevice, cchDeviceName);
    FreeMem(pDriver, MAX_PATH);
    FreeMem(pPort, MAX_PATH);
    Printer.BeginDoc;
    Printer.Canvas.TextOut(0,0, 'Delphi Is RAD!');
    Printer.EndDoc;

end;
Zadnjič spremenil M.C, dne 24.10.2007 11:30:18, skupaj popravljeno 1 krat.
Order is heavens first rule. Therefore some must be better than the rest.

SimonG
Prispevkov: 86
Pridružen: 12.08.2002 01:04:31

Iscem escape sekvenco blagajniskega predala

Odgovor Napisal/-a SimonG » 25.10.2007 15:00:55

pozdravljen !

ker assignfile preusmeriš izpis direktno na port in je portu vseeno ali je tam printer ali ne...

preko printer.setprinter.index itd pa pišeš na canvas tiskalnika (in driver programa) ki sam skrbi za ustrezen izpis tiskalnik (priklopljen kjer koli pač je...)

ps nisem profi ampak tako pač razumem delovanje tiskalnikov v win-sih

lp simon

M.C
Prispevkov: 630
Pridružen: 24.02.2003 14:27:43

Iscem escape sekvenco blagajniskega predala

Odgovor Napisal/-a M.C » 29.11.2007 16:20:59

recimo da na portu nimam nobenega printerja

Koda: Izberi vse

  
comport1.WriteStr(Chr($1B) + chr($70)+ chr($00)+ chr($60)+ chr($70)+ chr($10)+ chr($04)+ chr($01)+ chr($10)+ chr($04) + chr($02) + chr($10)+ chr($03)+ chr($03) + chr($10) + chr($04) + chr($04));
tole dela, t.j. predal se odpre

Koda: Izberi vse

 
Writeln(MyFile, enak string kot zgoraj));
tole ne dela, izpiše: "p p"


no in na koncu sem prišel do tegale:
1, odstranim printer s porta
2. odprem predal
3. dodam printer nazaj na port (preverjno se potem nahaja v tiskalniki/faxi ....)


Vse dela ok, samo če app še kar teče in zgornjo proceduro ponovim mi crkne na comport1.Open; Če app prej reštartam je pa spet ok.

Nekaj se očitno dogodi oz obvisi na točki 3, če kdo kaj vidi .. ker če tole dam ven se lepo odpira kot treba.

Koda: Izberi vse

 


function AddAPrinter(PrinterName, PortName, DriverName, PrintProcessor: string):     boolean;
    var
      pName: PChar;
      Level: DWORD;
      pPrinter: PPrinterInfo2;
    begin

      pName := nil;
      Level := 2;
      New(pPrinter);
      pPrinter^.pServerName := nil;
      pPrinter^.pShareName := nil;
      pPrinter^.pComment := nil;
      pPrinter^.pLocation := nil;
      pPrinter^.pDevMode := nil;
      pPrinter^.pSepFile := nil;
      pPrinter^.pDatatype := nil;
      pPrinter^.pParameters := nil;
      pPrinter^.pSecurityDescriptor := nil;
      pPrinter^.Attributes := 0;
      pPrinter^.Priority := 0;
      pPrinter^.DefaultPriority := 0;
      pPrinter^.StartTime := 0;
      pPrinter^.UntilTime := 0;
      pPrinter^.Status := 0;
      pPrinter^.cJobs := 0;
      pPrinter^.AveragePPM :=0;

      pPrinter^.pPrinterName := PCHAR(PrinterName);
      pPrinter^.pPortName := PCHAR(PortName);
      pPrinter^.pDriverName := PCHAR(DriverName);
      pPrinter^.pPrintProcessor := PCHAR(PrintProcessor);


      if AddPrinter(pName, Level, pPrinter) <> 0 then
        Result := true
      else begin
        // ShowMessage(inttostr(GetlastError));
        Result := false;
      end;



    end;
Order is heavens first rule. Therefore some must be better than the rest.

Uporabniški avatar
gabr
Prispevkov: 4129
Pridružen: 28.08.2001 14:10:47

Iscem escape sekvenco blagajniskega predala

Odgovor Napisal/-a gabr » 29.11.2007 16:39:27

A si že poskusil odpret printer v raw načinu in poslat escape sekvenco direkt, mimo driverja?

http://msdn2.microsoft.com/en-us/library/ms535786.aspx

Gp

M.C
Prispevkov: 630
Pridružen: 24.02.2003 14:27:43

Iscem escape sekvenco blagajniskega predala

Odgovor Napisal/-a M.C » 30.11.2007 09:10:18

končno nekaj uporabnega, evo da se ne bo še kdo s temle mučil:

szPrinterName = npr 'EPSON TM-T......'

LP

Koda: Izberi vse

 

function TForm2.OdpriPredal(szPrinterName:pCHAR): boolean;
var
  bStatus:boolean;
  hPrinter:Cardinal;
  DocInfo1: TDocInfo1;
  dwJob:DWORD;
  dwBytesWritten: DWORD;
  PrinterDef: PRINTER_DEFAULTS;
  Data : array[0..7] of char;
  dwCount: DWORD;
begin
  dwBytesWritten := 0;

  FillChar(PrinterDef, sizeof(PrinterDef), #0);
  PrinterDef.DesiredAccess := PRINTER_ALL_ACCESS;

  // Open a handle to the printer.
  bStatus := OpenPrinter( szPrinterName, hPrinter, @PrinterDef );

  if (bStatus) then
  begin
   // Fill in the structure with info about this "document."
   DocInfo1.pDocName := PChar('test doc');
   DocInfo1.pOutputFile := nil;
   DocInfo1.pDatatype := 'RAW';

   // Inform the spooler the document is beginning.
   dwJob := StartDocPrinter(hPrinter, 1, @DocInfo1);

   if (dwJob > 0) then
   begin
     // Start a page.
     bStatus := StartPagePrinter( hPrinter );
     if (bStatus) then
     begin
       // Send the data to the printer.
       Data[0] := #27;
       Data[1] := #112;
       Data[2] := '0';
       Data[3] := '2';
       Data[4] := '5';
       Data[5] := '2';
       Data[6] := '0';
       Data[7] := '0';

       bStatus := WritePrinter(hPrinter, @Data, SizeOf(Data), dwBytesWritten);
       EndPagePrinter (hPrinter);
     end;
     // Inform the spooler that the document is ending.
     EndDocPrinter( hPrinter );
   end;
   // Close the printer handle.
   ClosePrinter( hPrinter );
  end;
  // Check to see if correct number of bytes were written.
  if (not bStatus or (dwBytesWritten <> dwCount))  then
  begin
   bStatus := FALSE;
  end
  else
  begin
   bStatus := TRUE;
  end;

  result :=  bStatus;
end;  
Order is heavens first rule. Therefore some must be better than the rest.

Odgovori