Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 24. - Zjištění doby, za kterou se aktivuje spořič obrazovky; Test, zda aplikace odpovídá či ne; Výpis tiskáren instalovaných v systému; Jaké formáty papíru tiskárna podporuje?; Podporuje tiskárna barevný tisk?

Jan Šindelář - 9.1.2002

Zjištění doby, za kterou se aktivuje spořič obrazovky

Potřebujete-li z nějakého důvodu zjistit, za jaký časový interval se aktivuje spořič obrazovky, můžete využít následující funkci, která vám tuto dobu vrátí v sekundách.

function GetScreenSaverTimeout: Integer;
begin
SystemParametersInfo(SPI_GETSCREENSAVETIMEOUT, 0, @result, 0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(GetScreenSaverTimeout) + ` sekund`);
end;

Nutno ovšem poznamenat, že funkce vám vrátí hodnotu i v tom případě, že právě není žádný spořič v ovládacích panelech obrazovky vybrán. Když se do ovládacích panelů podíváte a nastavíte spořič obrazovky na "není", sice logicky nebudete moci měnit dobu jeho aktivace (tato volba je „disablovaná“), ale přesto tam je původní hodnota (neboli hodnota, která bude platná ihned po zvolení nějakého spořiče) vidět.

Test, zda aplikace odpovídá či ne

Upřímně řečeno, tento tip se asi moc v praxi neuplatní, ale proč si to nevyzkoušet. Jistě víte, že pokud se nějaká aplikace jak se říká "kousne" neboli přestane systému z nějakého důvodu odpovídat (což sice nemusí vždycky znamenat její pád, ale obvykle tomu tak je), zobrazí se po čase dialog k uzavření aplikace (nebo se počká, zda začne znovu odpovídat). Nebudeme se teď raději zabývat tím, jak moc spolehlivě tento proces funguje či spíše nefunguje (hovoříme-li o Windows 9x), a zkusíme si sami zjistit, zda daná aplikace odpovídá.

function AppIsResponding(ClassName : string) : boolean;
const
TIMEOUT = 50;

var
  Res: DWORD;
  h: HWND;
begin
  h := FindWindow(PChar(ClassName), nil);
  if h <> 0 then
    result := SendMessageTimeout(H, WM_NULL, 0, 0, SMTO_NORMAL or SMTO_ABORTIFHUNG, TIMEOUT, Res) <> 0
  else
  ShowMessage(Format(`%s nenalezeno!`,[ClassName]));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if AppIsResponding(`Notepad`) then ShowMessage(`Aplikace odpovídá.`);
end;

V příkladu je vidět použití pro Poznámkový blok. V těle samotné funkce je konstanta, které určuje časový interval čekání na odezvu v milisekundách.

Výpis tiskáren instalovaných v systému

Problematikou tiskáren a tisku obecně jsme se v našem seriálu dosud nezabývali a je to možná škoda. Proto si teď ukážeme několik tipů a příště v tom možná ještě budeme částečně pokračovat. Nejprve tedy výpis instalovaných tiskáren. V tom nám pomůže knihovna Printers; celý kód je vlastně velice jednoduchý. Předpokladem je, že máte někde na formuláři umístěn ListBox, kam se budou instalované tiskárny vypisovat. Součástí výpisu je též port tiskárny. A zde je tedy jednoduchý výpis:

procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Items := Printer.Printers;
ListBox1.ItemIndex := Printer.PrinterIndex;
end;

Jaké formáty papíru tiskárna podporuje?

Zajímavým parametrem tiskárny je též seznam podporovaných médií (či chcete-li podporovaných rozměrů papíru), na které je tiskárna schopna tisknout. Právě jejich seznam se teď naučíme zjišťovat. Opět využijeme knihovny Printers a také knihovny WinSpool, jejíž funkce DeviceCapabilities nám právě s použitím vhodného parametru "prozradí" názvy jednotlivých typů papíru. Jejich seznam budeme pro změnu vypisovat do komponenty Memo, takže je nutno ji přidat na formulář.

procedure TForm1.Button1Click(Sender: TObject);
type
TPaperName = array [0..63] of Char;
TPaperNameArray = array [1..High(Integer) div SizeOf(TPaperName)] of TPaperName;
PPaperNameArray = ^TPaperNameArray;
var
Device, Driver, Port : array[0..255] of Char;
hDevMode : THandle;
i, CountPaperFormats : Integer;
pPaperFormats : pPaperNameArray;
begin
Memo1.Lines.Clear;
Printer.GetPrinter(Device, Driver, Port, hDevmode);
CountPaperformats := WinSpool.DeviceCapabilities(Device, Port, DC_PAPERNAMES, Nil, Nil);
if CountPaperformats > 0 then
begin
  GetMem(pPaperformats, CountPaperformats * SizeOf(TPaperName));
  try
  WinSpool.DeviceCapabilities(Device, Port, DC_PAPERNAMES, PChar(pPaperFormats), Nil);
  for i := 1 to CountPaperformats do Memo1.Lines.Add(pPaperformats^[i]);
  finally
  FreeMem(pPaperFormats);
  end;
end;
end;

Podporuje tiskárna barevný tisk?

Na závěr si dnes ukážeme, jak zjistit další neméně zajímavou a důležitou vlastnost tiskárny – zda může tisknout barevně. I v tomto případě nám pomůže knihovna Printers.

procedure TForm1.Button1Click(Sender: TObject);
var
Device, Driver, Port: array[0..255] of Char;
DM1, DM2 : PDeviceMode;
Sz: Integer;
DevMode: THandle;
begin
Printer.PrinterIndex := -1;
Printer.GetPrinter(Device, Driver, Port, DevMode);
if DevMode <> 0 then
begin
  DM1 := nil;
  DM2 := nil;
  Sz := DocumentProperties(0, 0, Device, DM1^, DM2^, 0);
  GetMem(DM1, Sz);
  DocumentProperties(0, 0, Device, DM1^, DM2^, DM_OUT_BUFFER);
  if DM1^.dmColor >1 then ShowMessage(`Tiskárna podporuje více barev`)
  else ShowMessage(`Tiskárna podporuje jen černou a bílou`);
  if DM1^.dmFields and DM_COLOR <> 0 then ShowMessage(`Tiskárna podporuje barevný tisk`)
  else ShowMessage(`Tiskárna nepodporuje barevný tisk`);
  FreeMem(DM1);
end;
end;

Příště se pustíme do samotného tisku a ukážeme si některá další zajímavá nastavení a vlastnosti tiskárny a tisku všeobecně.