Tisk v Delphi 6. - trocha API - 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:

Soutěž

Sponzorem soutěže je:

IDIF

 

Kde se koná výstava fotografií Luďka Vojtěchovského?

V dnešní soutěži hrajeme o:



Delphi

Tisk v Delphi 6. - trocha API

tisk

4. dubna 2002, 00.00 | Pokračování seriálu o tisku v Delphi. V dnešním dílu zahájíme část věnovanou nastavení některých vlastností tiskárny pomocí Win32 API.

Čas od času se při psaní části programu zodpovědné za tisk objeví požadavky, které nejdou vyřídit pomocí vlastností a metod objektu TPrinter (popsaného ve druhém dílu). Příkladem budiž programová změna velikosti tiskové strany, nastavení kvality tisku, černobílý tisk apod. Na "hraní si" s podobnými věcmi budeme muset vytáhnout těžší kalibr, než je objekt TPrinter Delphi - totiž Win32 API.

TDeviceMode

Prakticky všechna naše komunikace s tiskárnou bude probíhat pomocí struktury TDeviceMode. Je to záznam se spoustou položek, které se dají číst a samozřejmě i nastavovat. Jeho deklaraci (unita Windows) tady nebudu opisovat, protože je poněkud delší (nevzpomínám si, že bych se někdy ve Win32 API setkal s větší strukturou), zájemci ji najdou v nápovědě k Win32 API pod názvem DEVMODE.

Struktura TDeviceMode slouží k popisu všech možných vlastností tiskárny. V našem seriálu si nebudeme ukazovat úplně všechna "kouzla", která jdou se strukturou provádět, ale jen ty nejdůležitější, což by mělo podnítit vaši vlastní zvědavost a výzkumy. Ale prvním problémem, který budeme muset vyřešit, je jak vůbec strukturu příslušející zvolené tiskárně získat.

Pojď k taťkovi, TDeviceMode...

Problém není tak úplně jednoduchý, jak vypadá. Ukážu zde kostru procedury, která strukturu TDeviceMode (přesněji ukazatel na ni) získá od objektu TPrinter a po nějaké činnosti se strukturou zase vše uvede do korektního stavu:

procedure DoSomethingWithDeviceMode(Sender: TObject);
var
  Device, Driver, Port: array [0..255] of Char;
  DeviceHandle: THandle;
  PDM: PDeviceMode; // ukazatel na TDeviceMode
begin
  Printer.PrinterIndex := Printer.PrinterIndex;
  Printer.GetPrinter(Device, Driver, Port, DeviceHandle);
  if DeviceHandle <> 0 then
  begin
    PDM := GlobalLock(DeviceHandle);

    { *** sem umístit kód pracující s PDM *** }

    GlobalUnlock(DeviceHandle);
  end
  else
    raise Exception.Create(
      'Nemůžu získat handle ke struktuře TDeviceMode.');
end;

Na prvním řádku pod begin "provětráme" vlastnost PrinterIndex tím, že ji nastavíme na svou vlastní hodnotu. Je to malý trik - aniž tím cokoliv změníme, donutíme totiž Windows nahrát do paměti ovladač tiskárny (pokud tam ještě nebyl) a připravit příslušnou strukturu TDeviceMode k použití. Voláním metody GetPrinter kromě vedlejších produktů jako jsou název tiskárny, ovladače a portu získáme i handle k požadované struktuře (v proměnné DeviceHandle). Je to handle k alokovanému bloku paměti, na nějž po nezbytné kontrole validity (DeviceHandle <> 0) získáme ukazatel pomocí funkce GlobalLock. Jelikož je v tomto paměťovém bloku umístěna naše žádaná struktura, máme tím pádem ukazatel na ni. S tímto ukazatelem můžeme pracovat dle libosti. Po skončení manipulací s obsahem struktury TDeviceMode zase odemkneme paměť pomocí GlobalUnlock.

Teď nadešel čas si povědět, jak se strukturou správně zacházet.

Nastavování jednotlivých položek

Když ve struktuře TDeviceMode měníme nějaké položky, je třeba o tom Windows informovat, aby věděly, co bylo vlastně změněno. (Pokud by tomu tak nebylo, Windows by si musely udržovat dvě kopie struktury a pak je srovnávat nebo předpokládat, že se změnily úplně všechny položky. Ani jeden způsob by nebyl zrovna ukázkou efektivního přístupu k věci.). K vyznačování změn slouží speciální položka dmFields. Jejím obsahem je součet speciálních konstant, které určují, jaké položky byly změněny. Například když změníme položku dmColor, přičteme k položce dmFields konstantu DM_COLOR. Jak je z příkladu vidět, názvy konstant jsou snadno odvoditelné z názvů položek (stačí přidat podtržítko po "DM" a pro přehlednost zapsat velkými písmeny), takže nepovažuji za nutné tady všechny konstanty explicitně vypisovat.

Jaké položky můžeme nastavit?

To je asi nejdůležitější otázka z celého tématu. Jelikož odpověď na ní je spolu s podrobnějším vysvětlením trochu delší, ponechávám ji do příštího dílu seriálu. Takže "na počtenou" u dalšího článku.

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: