Avatar billede a_nor Nybegynder
21. september 2006 - 11:27 Der er 8 kommentarer og
1 løsning

Printer bliver uanvendelig

Hej Eksperter


Jeg har et problem med en printertilkobling jeg ikke kan greje (for nu at sige det pænt).
Programmet er lavet i Delphi 3. Når programmet starter "tjekkes" printertilknytningen:

  Var PDc : HDC;


  begin
  PDc    := Printer.Handle;
  ...
 

"Standardprinteren" er herefter normalt tilgængelige i PDc og Printer, og rutiner som StartDoc og EndDoc kan bruges.

Problemet er at tilgængeligheden af Standardprinteren nogle gange forsvinder, selvom den stadig er markeret som Standard i "Printere og Fax-enheder".
Officeprogrammerne skriver også stadigvæk fint ud.
Printeren kan også "forsvinde" mens programmet kører og man har skiftet til Word/Excel undervejs.
Den eneste løsning er tilsyneladende at vælge en anden standardprinter, og herefter "vælge tilbage" igen.

Har også prøvet at sætte  Printer.PrinterIndex uden større held.

Printeren der ønskes brugt er Ricoh Aficio CL 3100 N, og printerdriveren er søgt opdateret.


Gode ideer til hvordan jeg kan komme videre  ? ? ?

mvh  Anders
Avatar billede stoney Nybegynder
21. september 2006 - 11:49 #1
Har du prøvet at sætte printeren hver gang inden du udskriver ?

Jeg har lavet en ISAPI appl hvor der bliver printet via en webside og det virker upåklageligt

// Printer.GetPrinter(Device, Driver, Port, hDMode);
// Printer.SetPrinter(Device, Driver, Port, 0);

Stoney
Avatar billede a_nor Nybegynder
21. september 2006 - 12:59 #2
Tak for tippet Stoney.

Jeg har kun prøvet at sætte Printerindex som de (Borland) anbefaler i Hjælpen, men kan godt se at der foregår langt mere i SetPrinter.

Jeg vil derfor lave et lille testprogram som kan køres når problemet opstår. (Inden jeg begynder at rette for meget i koden  :-))  )  Problemet opstår kun nogle gange om ugen, og kun hos en enkelt kunde ! ?

Anders
Avatar billede tolderlund Nybegynder
22. september 2006 - 10:34 #3
Det er uklart hvad du mener med at printeren "forsvinder"?
Og hvorfor gemmer du Printer.Handle over i PDc?
Hvorfor ikke bare fjerne PDc og bruge Printer.Handle de steder du skal bruge værdien?
Det her er kun et vildt gæt, men kan værdien af Printer.Handle ændre sig undervejs, så den værdi du har gemt i PDc ikke længere er gyldig?
Men det er lidt svært at hjælpe når jeg ikke ved hvad du mener med "forsvinder".
Avatar billede a_nor Nybegynder
22. september 2006 - 14:44 #4
Hej tolderlund,

med "forsvinder" mener jeg følgende:
Normalt virker progammet fint med print. Men ... efter man har været i f.eks. Word at arbejde, (stadig med mit prog. kørende) og går tilbage til mit prog, holder print nogle gange op med at virke. (Der kommer meddelelse om at printeren ikke kan bruges ) Det hjælper ikke at genstarte programmet, der meddeles nu at printeren ikke kunne tilknyttes.

Det hjælper heller ikke at genstarte computeren. Eneste kendte løsning er at genvælge den ønskede printer som Standard i "Printere og Fax-enheder". (Hvis ikke brugeren har valgt en printer i mit program anvendes Standard printeren)

Årsagen til anvendelsen a PDc, er et lævn fra fortiden. Jeg bruger en stribe rutiner (af ældre dato) som  anvender windows-kald til udskriften. Jeg vil give dig ret i at det kan være noget "snask" med denne kopi af handlet, men den tildeles handlet hver gang jeg starter print (PrnStart). I øvrigt er problemet der også med rapporter lavet med QReport.

Anders
Avatar billede tolderlund Nybegynder
26. september 2006 - 10:37 #5
En ting jeg ikke forstår er at du overhovedet bruger Printer.Handle.
Bruger du ikke TPrinter klassen til at printe med?
Avatar billede a_nor Nybegynder
26. september 2006 - 11:43 #6
Kun delvis, bruger bla.

procedure PrnLine(X: Integer; PS: ShortString);
  var
    P:    array[0..255] of Char;
  begin
  StrPCopy(P,PS);
  SetTextAlign(PDC,TA_Left+TA_NOUPDATECP);
  TextOut(PDc, X+offsetX, CurrentLine*LineHeight+offsetY, P, StrLen(P));
  end; { PrnLine }

men det er ikke her hunden ligger begravet. Allerede ved programstart køres:

Procedure TilknytPrinter;

  var i:integer;
begin
i:=0;
try
  if aUsr.DefPrinterNdx>0 then
    Printer.PrinterIndex := aUsr.DefPrinterNdx-1;  //
  except
  wMes('Tilknytning af printer nr. '+intToStr(aUsr.DefPrinterNdx-1)+' fejler ?');
  end;
wMes('Tilknytter printer....',continue);
...

og så er der noget kode som lidt mere stædigt forsøger at få fat i printeren, da en netværksprinter kunne være for længe om at melde klar ?
Avatar billede tolderlund Nybegynder
26. september 2006 - 12:56 #7
Det kode ser mystisk ud.
Det ser ud som om du forventer at printeren har et bestemt index nr?
Hvordan ved du at du bruger det rigtige index nr?
Du er modig. Jeg turde ikke lave sådan noget... :-)
Avatar billede a_nor Nybegynder
27. september 2006 - 10:24 #8
Alt det der vedrører 'tilknyt' var noget jeg byggede på til testformål. Tidligere brugte jeg altid Default Printer.
Printertabellen er uforandret sålænge der ikke pilles i "printere og faxenheder", men jeg er helt enig i at det er tvivlsomt blot at bruge index. Så må hele printernavnet gemmes istedet, med indexet kunne jeg nøjes med en enkelt byte :-)
Avatar billede a_nor Nybegynder
13. februar 2008 - 18:17 #9
Stoney og Tolderlund - Hvis i vil have nogen point for jeres medvirken, så kast et svar snarest!


Jeg har iøvrigt opgivet at finde ud af hvad der skete. Kunden har fået nye maskiner, og fejlen forsvandt samtidig.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester