Tisk v Delphi 5. - změna výchozí tiskárny - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Delphi

Tisk v Delphi 5. - změna výchozí tiskárny

tisk

26. března 2002, 00.00 | Tímto dílem začíná část seriálu pro pokročilejší čtenáře. Podíváme se na programové nastavení výchozí tiskárny ve Windows.

Tímto dílem začíná část seriálu, kterou bych si dovolil nazvat "pro pokročilé". V dnešním dílu se budeme zabývat otázkou, jak trvale změnit nastavení výchozí tiskárny ve Windows. Vlastně budeme dělat totéž, co uživatel může obvykle činit ve složce Tiskárny například pomocí položky "Nastavit jako výchozí" v kontextovém menu u každé tiskárny.

Vše zabalíme do jednoduché aplikace obsahující jen seznam tiskáren nainstalovaných na daném počítači a tlačítko na aktivaci změny výchozí tiskárny (viz obrázek).

Ukázková aplikace - vybírátko výchozí tiskárny

Začneme tím, že při vytvoření aplikace seznam naplníme jmény instalovaných tiskáren a vybereme tu tiskárnu, která je nyní nastavena jako výchozí. K tomu nám zatím postačí objekt Printer, se kterým jsme se seznámili ve druhém dílu seriálu.

procedure TForm1.FormCreate(Sender: TObject);
begin
  PrinterList.Items.Assign(Printer.Printers);
  PrinterList.ItemIndex := Printer.PrinterIndex;
end

Teď se podíváme blíže na kód obsluhující stisk tlačítka. Zde nastavíme aktivní tiskárnu podle vlastnosti ItemIndex seznamu. Zrádné je, že ve Windows se výchozí tiskárna kvůli zpětné kompatibilitě nastavuje na dvou místech - v registrech a v souboru win.ini. Musíme se postarat o obojí.

Nejdříve registry, ty jsou jednodušší. Jméno výchozí tiskárny se v nich skrývá jako položka s názvem "Default" klíče "\System\CurrentControlSet\Control\Print\Printers" ve větvi HKEY_CURRENT_CONFIG. Jistě jste si všimli, že jména tiskáren poskytovaná vlastností Printer.Pinters jsou ve formátu "<tiskárna> on <port>" (např. "HP DeskJet 710C on LPT1:"). V registrech je použita jen část jména před "on". Na to samozřejmě při programování musíme myslet.

Se souborem win.ini máme situaci ještě o něco zapeklitější. Pro nás důležité jsou jeho sekce [Devices] a [windows]. V nich jsou (mimo jiné) položky podobné následujícím:

[Devices]
HP DeskJet 710C=HPFDJC13,LPT1:
Generic PostScript Printer=ADOBEPS4,FILE:
...

[windows]
device=HP DeskJet 710C,HPFDJC13,LPT1:
...

V sekci [windows] se, jak jste již jistě uhodli, nalézá ona výchozí tiskárna jakožto hodnota položky device. Při jejím nastavování opět použijeme verzi názvu tiskárny bez portu a oddělujícího "on". Hodnotu položky v sekci [Devices] s tímto názvem pak použijeme pro nastavení hodnoty položky device v sekci [windows]. Nakonec nesmíme zapomenout informovat ostatní aplikace o změně výchozí tiskárny, což učiníme rozesláním zprávy WM_WININICHANGE všem oknům v systému (využijeme přitom speciální konstanty HWND_BROADCAST, kterou doplníme místo obvyklého handle okna jako první parametr funkce SendMessage).

Zdá se to poněkud komplikované? Když jsem toto téma nastudovával, také se mi to tak jevilo. Lépe než z mého výkladu snad vše pochopíte přímo z kódu procedury:

procedure TForm1.ApplyBtnClick(Sender: TObject);
var
  ShortPrinterName, S: string;
  Registry: TRegistry;
  IniFile: TIniFile;
begin
  { získání krátkého jména tiskárny (bez portu
    a bez "on";) }
  with PrinterList do
    ShortPrinterName := Copy Items[ItemIndex], 1,
      Pos(' on ', Items[ItemIndex]) - 1);

  { registry }
  Registry := TRegistry.Create;
  with Registry do
    try
      RootKey := HKEY_CURRENT_CONFIG;
      if OpenKey('System\CurrentControlSet'
        + '\Control\Print\Printers', False) then
      begin
        WriteString('Default', ShortPrinterName);
        CloseKey;
      end
      else
        raise Exception.Create('Nemůžu otevřít klíč registrů.');
    finally
      Free;
    end;

  { win.ini }
  IniFile := TIniFile.Create('win.ini');
  with IniFile do
    try
      S := ReadString('Devices', ShortPrinterName, '');
      WriteString('windows', 'device',
         ShortPrinterName + ',' + S);
    finally
      Free;
    end;

  { upozornění ostatních programů na změny v sekci "windows"}
  SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0,
    LongInt(PChar('windows')));
end;

Ukázkovou aplikaci si jako obvykle můžete stáhnout (i se zdrojovými kódy pro Delphi 3 a vyšší) a vyzkoušet si ji.

V příštím dílu si posvítíme na některé případy, kdy nám k zacházení s tiskárnou nepostačuje objekt TPrinter, a je nutné se uchýlit k použití Win 32 API.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: