Avatar billede nca Juniormester
02. januar 2003 - 22:43 Der er 7 kommentarer og
1 løsning

Er standardprinteren tilsluttet og klar?

Jeg har været ude for, at mit program stoppede under indlæsning med en GPF i windows XP. Programmet er skrevet i Delphi 5 Enterprise og benytter QuickReport standard 3.5.
Årsagen var, at standardprinteren ikke længere fandtes på netværket.
Findes der en metode til at finde ud af, om standardprinteren stadig "er i live"? (Jeg kan sagtens finde ud af, om der er en standardprinter.)
Jeg er ikke interesseret i en metode, der blot checker de lokale LPT-porte.
Avatar billede stone Forsker
03. januar 2003 - 00:52 #1
uses
  Printers, Messages;

function GetDefaultPrinter: string;
var
  ResStr: array[0..255] of Char;
begin
  GetProfileString('Windows', 'device', '', ResStr, 255);
  Result := StrPas(ResStr);
end;

procedure SetDefaultPrinter1(NewDefPrinter: string);
var
  ResStr: array[0..255] of Char;
begin
  StrPCopy(ResStr, NewdefPrinter);
  WriteProfileString('windows', 'device', ResStr);
  StrCopy(ResStr, 'windows');
  SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, Longint(@ResStr));
end;

procedure SetDefaultPrinter2(PrinterName: string);
var
  I: Integer;
  Device: PChar;
  Driver: PChar;
  Port: PChar;
  HdeviceMode: THandle;
  aPrinter: TPrinter;
begin
  Printer.PrinterIndex := -1;
  GetMem(Device, 255);
  GetMem(Driver, 255);
  GetMem(Port, 255);
  aPrinter := TPrinter.Create;
  try
    for I := 0 to Printer.Printers.Count - 1 do
    begin
      if Printer.Printers = PrinterName then
      begin
        aprinter.PrinterIndex := i;
        aPrinter.getprinter(device, driver, port, HdeviceMode);
        StrCat(Device, ',');
        StrCat(Device, Driver);
        StrCat(Device, Port);
        WriteProfileString('windows', 'device', Device);
        StrCopy(Device, 'windows');
        SendMessage(HWND_BROADCAST, WM_WININICHANGE,
          0, Longint(@Device));
      end;
    end;
  finally
    aPrinter.Free;
  end;
  FreeMem(Device, 255);
  FreeMem(Driver, 255);
  FreeMem(Port, 255);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  label1.Caption := GetDefaultPrinter2;
end;

//Fill the combobox with all available printers
procedure TForm1.FormCreate(Sender: TObject);
begin
  Combobox1.Items.Clear;
  Combobox1.Items.AddStrings(Printer.Printers);
end;

//Set the selected printer in the combobox as default printer
procedure TForm1.Button2Click(Sender: TObject);
begin
  SetDefaultPrinter(Combobox1.Text);
end;
Avatar billede nca Juniormester
03. januar 2003 - 10:03 #2
>>Stone
Dit forslag løser ikke mit problem.
Jeg går ind og finder navnet på standarprinteren "Printer xx på PCxx", men hvis den pågældende printserver ikker er tændt eller på nettet længere, vil QuickReport stoppe programmet med en fejlmeddelelse. Men hvis siderne med QuickReport komponenten bliver created under indlæsning af programmer, kommer der bare en GPF. Derfor vil jeg gerne kunne checke om standardprinteren er klar før siderne bliver created.
Avatar billede stone Forsker
03. januar 2003 - 12:41 #3
ok...kigger lige videre på det
Avatar billede stone Forsker
07. januar 2003 - 01:26 #4
har lige kigget på qusoft.com...
her har de et forslag som du kan afprøve.
SNIP "Q.  I get a exception error when running our application on a machine without a default printer.
A.  QuickReport requires that a default printer be installed.  The report is prepared using information from the printer driver.  The following code shows one way to check and see if a default printer has been defined.
"END SNIP

procedure TfrmReport.btnReportClick(Sender: TObject);
var
  FDevice:    PChar;
  FDriver:    PChar;
  FPort:      PChar;
  FHandle:    THandle;
  CurrentPrinterName: string;
begin
  GetMem (FDevice, 255);
  GetMem (FDriver, 255);
  GetMem (FPort, 255);
  Printer.GetPrinter (FDevice, FDriver, FPort, FHandle);
  CurrentPrinterName := FDevice;
  if FDevice <> nil then FreeMem (FDevice, 255);
  if FDriver <> nil then FreeMem (FDriver, 255);
  if FPort <> nil then FreeMem (FPort, 255);

  if CurrentPrinterName <> '' then
    { Preview the report }
    QuickRep1.Preview
  else
    MessageDlg('You do not have a default printer defined.' +
              #13#13 + 'Please select a printer before running a report.',
              mtError,[mbOK],0);
end;
Avatar billede nca Juniormester
07. januar 2003 - 08:30 #5
>> Stone
Tak for din indsats, men du ender stadig det samme sted, nemlig med at finde navnet på standardprinteren.
Hvis du kikker i printerkataloget (under XP) kan du se printerens navn, antal sider i køen samt status på printeren (hvis du sætter visningen til Ikoner med filoplysninger). Det er denne status, som jeg gerne vil ha' fat i.
Avatar billede stone Forsker
07. januar 2003 - 13:33 #6
har igen kigget på qusoft vedrørende problemet,, når quickreport kører i netværk skal man selv definerer en printer manuel, ellers får man en GPF.
Der er ikke umiddelbar en løsning på problemet. Som Qusoft siger" install a Printer" doo ja det bliver man jo klogere af *SS*
Prøver at kigge videre..det er en hård nød.
Avatar billede nca Juniormester
19. januar 2003 - 11:00 #7
Jeg lukker spørgsmålet nu
Avatar billede nca Juniormester
19. januar 2003 - 11:01 #8
>>>Stone
Tak for hjælpen
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