Tipy, triky, makra pro aplikace Office, Control Panel 3.1, OS/2 Merlin, Borland C++ Builder 4 a Visual C++5.0 a 6.0.
A jsme tu opět s malým nášupem rad, jak si zpříjemnit i ulehčit každodenní práci s počítačem a jeho aplikacemi...

Word
Kapitálky
Nadpisy vypadají hezky, jsou-li napsány písmem ve stylu kapitálek. V něm jsou všechna zapsaná malá písmena převedena na velká a zapsaná velká písmena jsou větší. Např. Zatmění Slunce v Maďarsku.
Na kapitálky můžeme změnit vybraný text příkazem Formát|Písmo a označením stylu “Kapitálky”. Používáme-li kapitálky častěji, je vhodné změnu vyvolat klávesovou zkratkou. Vytvoříme ji tak, že zadáme příkaz Nástroje|Vlastní, stiskneme tlačítko “Klávesnice”, vyhledáme kategorii “Formát” a příkaz “Kapitálky”. Zjistíme, že od výrobce softwaru je přiřazena klávesová zkratka Ctrl+Shift+K, ta však ve verzi 97 a 2000 nefunguje. Přiřadíme si tedy jinou. Postavíme kurzor do políčka “Stiskněte klávesovou zkratku” a stiskneme např. kombinaci kláves Alt+Ctrl+Shift+K. Ta není nikde použita. V políčku “Změny uložit do” ponecháme obecnou šablonu “Normal.dot”. Volbu potvrdíme tlačítkem “Přiřadit” a dvakrát za sebou stiskneme tlačítko “Zavřít”. Když nyní označíme text jako blok a na klávesnici stiskneme zadanou klávesovou zkratku, zformátuje se text na kapitálky.
Poznámka: Ve Wordu verze 5 a 95 kombinace kláves Ctrl+Shift+K funguje. Text se na kapitálky zformátuje.

Symbol
Pokud často používáme nějaký znak, např. telefon, obálky, šipky, nemusíme zadávat příkaz Vložit|Symbol, na kartě “Symbol” vybrat znakovou sadu Wingdings, označit znak, stisknout klávesu “Vložit” a následně “Zavřít”. Můžeme si pro tyto znaky vytvořit klávesovou zkratku.
Zadáme příkaz Vložit|Symbol, na kartě “Symboly” vybereme písmo, např. Wingdings, a označíme symbol, pro který chceme klávesovou zkratku vytvořit (například telefon). Stiskneme tlačítko “Klávesová zkratka”, do políčka “Stiskněte klávesovou zkratku” (ve verzi 5 a 95 “Stiskněte novou klávesovou zkratku”) umístíme kurzor a stiskneme klávesy, např. Alt+Ctrl+Shift+T. V políčku “Změny uložit do” ponecháme obecnou šablonu “Normal.dot”. Stiskneme tlačítko “Přiřadit”, “Zavřít” a ještě jednou “Zavřít”. Po stisku zadané kombinace kláves je nyní znak do textu vložen bez nutnosti cokoli vybírat a zkratka je použitelná v libovolném nově založeném dokumentu.

Obrázek
Pro vkládání obrázku ze souborů se používá příkaz Vložit|Obrázek|Ze souboru (ve verzi 5 a 95 Vložit|Obrázek), následuje vyhledání složky a obrázku. I tuto činnost lze usnadnit použitím klávesové zkratky. Zadáme příkaz Nástroje|Vlastní (ve verzi 5 Nástroje|Upravit), stiskneme tlačítko “Klávesnice” (ve verzi 5 a 95 je to karta “Klávesnice”), vybereme kategorii “Vložit” (ve verzi 5 “Vložení”) a příkaz “Vložit obrázek” (ve verzi 5 a 95 jde o příkaz “InsertPicture”) a do políčka “Stiskněte klávesovou zkratku” (ve verzi 5 a 95 “Stiskněte novou klávesovou zkratku”) uvedeme např. Alt+Ctrl+ Shift+O. V políčku “Změny uložit do” ponecháme obecnou šablonu “Normal.dot”. Volbu potvrdíme tlačítkem “Přiřadit” a dvakrát za sebou stiskneme tlačítko “Zavřít”.
Nyní se po stisku zadané klávesové zkratky zobrazí přímo posledně použitá složka s obrázky, lze je tedy vkládat velice operativně.
Zobrazíme-li příkaz Vložit|Obrázek|Ze souboru (ve verzi 5 a 95 Vložit|Obrázek), bude po jeho straně námi zvolená klávesová zkratka.

Zrušení doplněných klávesových zkratek
Všechny klávesové zkratky, tedy jak pro formátování a vložení znaku, tak pro příkaz, zrušíme velice snadno. Zadáme příkaz Nástroje|Vlastní, stiskneme tlačítko “Klávesnice” a následně tlačítko “Obnovit vše”. Návrat ukončíme tlačítky “Zavřít”.
Uvedené návody můžete vzít jako námět nebo inspiraci pro zjednodušení zadávání jiných akcí.

Excel
Excel 2000 spustit jen 1x
Aplikaci Excel 2000 můžeme spustit v nabídce Start|Programy|Microsoft Excel, stiskem tlačítka v panelu zástupců Office, nebo pokud jsme vytvořili zástupce na pracovní ploše, stiskem této ikony. Soubory otevřeme poklepáním na ně v průzkumníku nebo po zadání příkazu Soubor|Otevřít.
Každý sešit má své tlačítko na hlavním panelu Windows. Mezi sešity lze přepínat stiskem tohoto tlačítka nebo klávesovou zkratkou Alt+Tab.
Excel bychom měli spustit jen jednou. Nesmíme opakovaně použít výše uvedené postupy, neboť by se Excel spustil znovu a u počítače neoplývajícího velkou vnitřní pamětí by došlo ke zpomalení reakcí.
Ve Wordu 2000 toto nebezpečí nehrozí. Aplikace se spustí vždy jen jednou, byť ji znovu spustíme z nabídky Start|Programy.

Skok na poslední buňku v. 5, 95, 97 a 2000
Na nejzazší buňku s daty (poslední sloupec a poslední řádek) přesuneme buňkový kurzor klávesovou zkratkou Ctrl+End. Zrušíme-li hodnotu v této buňce, budeme se touto klávesovou zkratkou přesouvat stále na poslední buňku, byť je již prázdná.
Stačí však sešit uložit, např. klávesovou zkratkou Ctrl+S nebo klasicky příkazem Soubor|Uložit, a buňkový kurzor se bude přesouvat na skutečně poslední zaplněnou buňku na listu.

Automaticky otevíraný soubor
Pracujeme-li delší dobu s nějakým souborem, můžeme si jeho otevírání usnadnit. Otevřeme ho již při spuštění Excelu. V Excelu existuje složka XLStart a soubory do ní uložené se při spuštění Excelu automaticky otevřou.
Složka pro automatické otevírání souborů je podle verzí Excelu:
v. 5: C:\excel\xlstart.
v. 95: C:\MSOffice\Excel\XLStart.
v. 97: C:\Program Files\Microsoft Office\Office\XLStart.
Verze 2000 je zajímavá tím, že má dvě složky XLStart. Jedna je na cestě C:\Windows\Application Data\Microsoft\Excel\XLStart a druhá C:\Program Files\Microsoft Office\Office\XLStart. Je lhostejné, do které složky soubor umístíme – vždy se při spuštění Excelu všechny soubory umístěné v uvedených složkách otevřou.
Automaticky se též otevřou všechny soubory, se kterými může Excel pracovat, umístíme-li je do složky zapsané na kartě “Obecné” v položce “Alternativní umístění spouštěcích souborů” (po zadání příkazu Nástroje|Možnosti). Ve verzi 5 jde o příkaz Nástroje|Předvolby, karta “Obecné” a položka “Druhé umístění souborů”, a ve verzi 95 o příkaz Nástroje|Možnosti, karta “Obecné”, položka “Druhé umístění souborů”.

Automatizace ve Word 97 a 2000 cz
Automatizace při psaní
Word umožňuje některé činnosti automatizovat. Zapíšeme-li *text* (text ve hvězdičkách bez mezer), hvězdičky zmizí a dojde k automatickému přeformátování na “tučné” písmo. Použijeme-li na začátku a konci slova podtržítka, řez slova se změní na kurzívu. Tato úprava se však automaticky provede jen tehdy, když po zadání příkazu Nástroje|Automatické opravy, je na kartě “Při psaní” označeno políčko “*Tučné* a _ kurzívu _ skutečným formátováním”.
Spodní čáru pod odstavcem lze vytvořit automaticky. Nejprve zkontrolujeme, zda je po zadání příkazu Nástroje|Automatické opravy na kartě “Při psaní” označena položka “Ohraničení”. Stiskneme-li potom opakovaně (min. 3x) některý z těchto znaků, zakreslí se čára. 
-	pomlčka	tenká čára
_	podtržítko	tlustá čára
=	rovnítko 	dvojitá čára
*	hvězdička	tlustá přerušovaná 							čára
#				tenká-tlustá-tenká
~	tilda 		vlnovka
Ty se vytvoří pod odstavcem nad těmito znaky. 
Pokud budeme chtít čáru pod odstavcem smazat, nemůžeme použít klávesu Delete nebo Backspace. Se zrušením čar se nebudeme trápit. Postavíme kurzor do podtrženého odstavce, zadáme příkaz Formát | Ohraničení a stínování a na kartě “Ohraničení” stiskneme tlačítko “Žádné” nebo klepneme myší na obrázek. Čáru tak zrušíme.
Psaní číslovaných seznamů si můžeme zjednodušit. Opět zadáme příkaz Nástroje|Automatické opravy, na kartě “Při psaní” označíme pole “Automaticky číslování”. Zapíšeme-li zkraje odstavce číslo nebo písmeno (malé nebo velké) následované tečkou a mezerou nebo tabulátorem, tak se po stisku klávesy Enter změní na číslovaný (či abecední) seznam a automaticky se vytvoří další položka. Vytváření ukončíme opakovaným stiskem klávesy Enter (2x) nebo smazáním poslední položky klávesou Backspace.

Při psaní jsou však zvláštnosti:
l Použijeme-li jako první znak písmeno i, resp. I, obdržíme číslování římskými číslicemi, malými resp. velkými.
l Pokud nezačneme od jedničky, musíme pro vyvolání číslování použít za číslicí tabulátor. Použijeme-li mezeru, k automatickému číslování nedojde.
l Pokud nezačneme od písmene a, resp. A, musíme za písmenem použít tabulátor. Použijeme-li mezeru, k automatickému označení nedojde.
l Předchází-li vytvářenému seznamu jiný seznam a zapíšeme číslici o jednotku větší, resp. další písmeno v abecedě, vyhodnotí procesor, že chceme v číslování pokračovat a na předchozí seznam naváže. Zde použijeme k oddělení mezeru. Mezi seznamy může být i několik odstavců textu. (Platí jen pro Word verze 2000.)
Jsou však situace, kdy nám může automatické číslování vadit. Např. při psaní strukturovaného životopisu. Napíšeme rok či časový interval, odskok provedeme klávesou Tabulátor, zapíšeme činnost a po stisku klávesy Enter máme doplněný rok (nebo interval) o jednotku větší. Vrátíme se zpět a po stisku klávesy Enter to vyjde nastejno. Pomoc je přitom snadná – zrušíme označení položky “Automaticky číslování”.
Na kartě “Při psaní” je též položka “Automaticky odrážky”. Při označené položce máme usnadněné psaní odrážek. Zapíšeme-li zkraje odstavce vybrané znaky, za nimi mezeru nebo tabulátor, změní se po stisku klávesy Enter na odrážky a automaticky se vytvoří další odrážka. Seznam ukončíme opakovaným stiskem klávesy Enter (2x) nebo smazáním poslední odrážky klávesou Backspace. A nyní ke znakům: * (hvězdička) se změní na Ÿ (puntík), > na Ø, – (pomlčka) bude zachovaná, — (dvě pomlčky) vytvoří n a písmeno “o” následované tabulátorem vytvoří Ÿ. Jednořádkovou tabulku vytvoříme snadno zápisem série pomlček (rovnítek či podtržítek) a znamének plus, kde každá dvojice znamének plus odpovídá jednomu sloupci. Po stisku klávesy Enter se automaticky vytvoří tabulka. Orientačně pro zápis jednoho čísla do tabulky potřebujeme dvě pomlčky. Např.: +——+——+. Automatické vytváření tabulek vypneme příkazem Nástroje|Automa- tické opravy, kde na kartě “Při psaní” zrušíme označení položky “Tabulky”. 
Další sloupce a řád-ky doplníme příkazem Tabulka|Vložit sloupce, Vložit řádky a u verze Wordu 2000 příkazy Tabulka|Vložit|Sloupce nalevo, Sloupce napravo, Řádky nad a Řádky pod.
A ještě k protivným velkým písmenům po tečkách za číslicemi ve větě. To souvisí s položkou “Velká písmena na začátku vět” na kartě “Opravy” po zadání příkazu Nástroje|Automatické opravy. Zrušme označení položky a je po problému. No, začátek vět musíme kontrolovat již sami.
Perlička na závěr. Když se na Vás bude někdo vytahovat, tak mu udělejte malou zlomyslnost. Ve Wordu zadejte příkaz Nástroje|Automatické opravy a na kartě “Opravy” do políčka “Nahrazovat” zapište 1 a do políčka “za:” napište “Nazdar Šmoulo!. Či jinou vtipnou sentenci. Zápis potvrdíme stiskem tlačítka “Přidat”. Nyní, když ve Wordu, ale i v Excelu neboť jsou náhrady společné, napíšete 1 zobrazí se ona sentence. A teď ať se “vejtaha” ukáže! Nežádoucí náhradu odstraníme tak, že ji na kartě “Opravy” vybereme a stiskneme tlačítko “Odstranit”.
Většinu těchto možností poskytuje i Word 95 (resp. jeho původní označení v. 7), i když se v dialogových oknech tyto možnosti nenastavují. V této verzi nelze vytvářet tabulky zápisem znaků.
Milan Brož

Control Panel 3.1
Pěkné nové logo
Pěkné firemní logo, které se zobrazuje při startu, je nedílnou součástí každého slušného operačního systému. Control Panel verze 3.x (CP) není samozřejmě žádnou výjimkou. Pokud však pracujete s CP intenzivně (neustále opakovaný pohled na jeden obrázek není příliš vzrušující), může vás zobrazované logo začít rozčilovat. Přitom každý uživatel může snadno donutit svůj CP, aby začal zobrazovat téměř libovolný zajímavý obrázek jako logo. Stačí dodržet následující postup:
1. Firemní logo je uloženo jako obrázek v souboru CPLOGO.LGO, který je umístěn v adresáři C:\CP. Systém CP však grafický formát LGO vůbec nezná. Musíme si tedy uvědomit, že za příponou LGO se skrývá jiný grafický formát – InView icon formát (*.ICO).
2. Původní soubor CPLOGO.LGO přejmenujeme na CPLOGO.LXX.
3. Nyní si vybereme svůj oblíbený obrázek v grafickém formátu PCX, GIF, TIF, BMP, SCR, IMG (InView), JPG, PNG, WPG, TGA, CUT, MAC nebo XBM. Fyzická velikost budoucího loga však musí odpovídat grafickému rozlišení, které v rámci CP používáme. Jestliže používáme grafický režim 800 x 600 bodů, maximální rozumná velikost loga je asi 570 x 400 bodů.
4. Vybraný obrázek v CP načteme do pomocné aplikace Obrázek. Ověříme si velikost obrázku a jeho neporušenost. Funkcí Uložit jako (horká klávesa Ctrl+A) aktivujeme dialogové okno. Zde zvolíme typ souboru – InView icon formát.
5. Následně se objeví dialog – Uložení obrázků. Zde nastavíme režim 256 barev a ponecháme původní velikost obrázku *.ICO (ikony).
6. Po uložení obrázku ukončíme prostředí CP a v libovolném souborovém manažeru přejmenujeme právě vytvořený obrázek na CPLOGO.LGO.
7. Nyní se při startu CP bude vždy zobrazovat naše pěkné nové logo.
Tento trik perfektně funguje i v systému CP 3.0.

Merlin
Seznam definovaných tiskáren
Mezi nejdůležitější vlastnosti každého OS nepochybně patří schopnost kvalitního tisku dokumentů na drtivé většině dnes používaných inkoustových a laserových tiskáren. Prakticky každý OS nabízí svým uživatelům grafické nástroje, které umí zobrazit kompletní seznam aktuálně připojených tiskáren s komfortními možnostmi jejich nastavení. Do horší situace se ovšem dostane uživatel, který potřebuje získat seznam tiskáren v rámci celoobrázkové textové relace. Proto vás možná potěší následující REXX program TISKARNA.CMD, který vypíše všechny tiskárny definované v systému. U každé tiskárny navíc zobrazí port, frontu a ovladač tiskárny.
Program je nutné vytvářet v textovém editoru, který podporuje čisté ASCII 
(např. Systémový editor EPM). Ve všech programech vytvořených v jazyku REXX musí být na prvním místě komentář začínající znaky “/*”, takže neodstraňujte úvodní komentáře. V novém prostředí Object REXX funguje program bez problémů.

/* TISKARNA.CMD */
/* Autor: Michal Pohořelský */
/* Vytvořeno pro systém OS/2 Merlin 4.0 */
/* Program v textové relaci vypíše seznam
 všech tiskáren definovaných v systému. */
/* Aktivuji knihovnu funkcí REXXUTIL */

IF RxFuncQuery(“SysLoadFuncs”) THEN
DO
CALL RxFuncAdd “SysLoadFuncs”, “RexxUtil”, “SysLoadFuncs”
CALL SysLoadFuncs
END
/* ———————————————— */
CALL SysCls
CALL SysIni “BOTH”,”PM_SPOOLER_ 
PRINTER”,”ALL:”,”printers”
PARSE VALUE SysIni(“BOTH”,”PM_ 
SPOOLER”,”PRINTER”) WITH default “;”

default = STRIP(default)
maxdelka = 8

DO i = 1 TO printers.0
hodnota = printers.i
PARSE VALUE SysIni(“BOTH”,”PM_ SPOOLER_PRINTER_DESCR”,hodnota),
WITH printerd.val “;”
printerd.val = SPACE(TRANSLATE (printerd.val,” “,”0d0a”x))
IF hodnota == default THEN
printerd.val = printerd.val “[default]”
maxdelka = MAX(maxdelka,LENGTH(printerd.val))
END

hlavicka = “Jmeno”||COPIES(“ “,maxdelka-4) ||,
“Port	Fronta Ovladac tiskarny”

SAY hlavicka
SAY COPIES(“-”, LENGTH(hlavicka))

DO i = 1 TO printers.0
hodnota = printers.i
PARSE VALUE SysIni(“BOTH”,”PM_ SPOOLER_PRINTER”, hodnota),
WITH port “;” driver “;” Queue “;”
SAY LEFT(printerd.val,maxdelka) LEFT(strip(port),8),
LEFT(STRIP(queue),8) STRIP(driver)
END
EXIT 0

Manipulace s adresáři
Uživatelé operačního systému třídy DOS (MS-DOS, PC-DOS, Novell DOS) si již dlouho mohou přejmenovat libovolný soubor (soubory) pomocí všeobecně známého interního příkazu – RENAME. Přestože tento příkaz byl již samozřejmou součástí systému MS-DOS 3.0, který byl aktuální v roce 1985, dodnes se při jeho použití uživatelé musí smiřovat s jedním nedostatkem. Práce se soubory je sice jednoduchá, ale s přejmenováním adresářů je to výrazně horší. Název adresáře je prostě “nedotknutelný”.
Uživatelé OS/2 jsou ovšem ve výhodě. V rámci textové DOS relace může uživatel použít u příkazu RENAME nedokumentovaný parametr

RENAME /S,

který donutí příkaz přejmenovat libovolný adresář. Příkaz lze uvedeným způsobem používat v OS/2 Warp 3.0 i v OS/2 Merlin 4.0. V textové relaci OS/2 uvedený parametr nefunguje, protože přejmenovávat adresáře zde patří mezi samozřejmé schopnosti identického příkazu.

Přepínání mezi aplikacemi
Mezi méně viditelné, ale přesto velmi příjemné novinky systému OS/2 Merlin patří přepínání programů pomocí klávesové zkratky Alt+Tab, kterou dobře znají uživatelé Windows. Díky tomu lze snadněji přejít z 16bitových Windows do plně 32bitového prostředí OS/2. Přepínání programů pomocí Alt+Tab však bohužel funguje pouze v grafickém prostředí. Uživatelé textových aplikací (OS/2 i DOS) tedy mají smůlu.
Naštěstí však existuje freewarový prográmek LSwitcher  verze 1.0, který umí uvedené omezení jednoduše obejít. Stačí umístit soubor LSWITCH.EXE do složky Spustit při startu, upravit ve stejném duchu systémový DOS soubor AUTOEXEC.BAT a ukončit práci systému. Po novém startu můžeme vesele používat zkratku Alt+Tab v jakékoliv situaci. Jestliže stiskneme klávesu Shift současně s Alt+Tab, přepínání programů bude probíhat v obráceném pořadí. Program LSwitcher je možné s menším komfortem využívat i v OS/2 Warp 3.0. V případě potřeby lze LSwitcher snadno deaktivovat současným stisknutím Ctrl+Alt+U.

Grafický režim systému
Nastavení vhodného grafického rozlišení, které optimálně využívá schopností monitoru i grafické karty a zároveň je ergonomické, patří mezi základní starosti každého uživatele v libovolném grafickém operačním systému. Většina systémů včetně OS/2 přitom nabízí komfortní nástroje umožňující optimální volbu grafického režimu. Ve výrazně horší situaci se však ocitne uživatel, který potřebuje v rámci textové relace zjistit nastavené grafické rozlišení. Kromě toho získaná informace o grafickém rozlišení může být zkreslená, protože nastavené hodnoty nemusí vždy odpovídat aktuálnímu režimu.
Proto jsem vytvořil následující REXX program GRAFIKA2.CMD, který se s tímto problémem dokáže kompletně vypořádat. Program je nutné vytvářet v textovém editoru, který podporuje čisté ASCII (např. Systémový editor EPM). Ve všech programech vytvořených v jazyku REXX musí být na prvním místě komentář začínající znaky “/*”, takže neodstraňujte úvodní komentáře. V novém prostředí Object REXX funguje program bez problémů.

/* GRAFIKA2.CMD */
/* Autor: Michal Pohořelský */
/* Vytvořeno pro systém OS/2 Merlin 4.0 */
/* Program na obrazovku vypíše aktuální grafické
rozlišení systému. */
/* Aktivuji knihovnu funkcí REXXUTIL */

IF RxFuncQuery(“SysLoadFuncs”)  THEN
DO
CALL RxFuncAdd “SysLoadFuncs”, “RexxUtil”, “SysLoadFuncs”
CALL SysLoadFuncs
END
/* ———————————————— */
/* Získávám systémové rozlišení */
PARSE VALUE GrafickeRozliseniSys() with XR YR PocetBarev ZGrRozliseni
/* Zobrazuji aktuální grafický režim */
CALL SysCls
SAY “ “;SAY “ “
SAY “ System nyni pracuje v grafickem rozliseni: “ ||,
XR || “x” || YR || “ s ” || PocetBarev || “ barvami”
/* Zobrazuji varování o platnosti zobrazených údajů */
IF ZGrRozliseni = 1 THEN
DO
SAY “ “
SAY “ POZOR ! Uvedene rozliseni neni platne, protoze nebyl proveden”
SAY “ novy start systemu !”
SAY “ Ukoncete, prosim, cinnost vsech aplikaci. Potom ukoncete praci”
SAY “ systemu a stisknete RESET.”
SAY “ Po novem spusteni zacne system pouzivat zobrazene rozliseni !”
END
EXIT 0

/* Hlavní procedura programu */
GrafickeRozliseniSys: PROCEDURE
PARSE VALUE 0 0 0 0 WITH XHodnota YHodnota PocetBarev ZmenaPlatnosti
/* Instaluji lokální error handler */
SIGNAL ON SYNTAX NAME InterniChybaObrazovky
/* Načítám binární hodnoty grafického rozlišení */
HodnotaEntryInBin = SysIni( “USER” ,,
“PM_DISPLAYDRIVERS” ,,
“DEFAULTSYSTEMRESOLUTION” )
/* Ověřuji aktivní platnost nastaveného graf. rozlišení */
ZGrRozliseni = SysIni( “USER” ,,
“PM_DISPLAYDRIVERS” ,,
“RESOLUTION_CHANGED” )

IF ZGrRozliseni = “1” || “00”x then
ZGrRozliseni = 1
ELSE
ZGrRozliseni = 0

/* Konvertuji binární hodnoty na HEX hodnoty */
HodnotaEntryInHex = c2x( HodnotaEntryInBin )
PARSE VAR HodnotaEntryInHex 1 XHodnota,
9 YHodnota,
17 PocetBarev,
25 NeznamaHod1,
33 NeznamaHod2

/* Konvertuji hexadecimální hodnoty na normální */
XHodnota = x2d( LSB_MSB( XHodnota ))
YHodnota = x2d( LSB_MSB( YHodnota ))
PocetBarev = x2d( LSB_MSB( PocetBarev ))
/* Nepovedlo se získat potřebné údaje */
NeznamaHod1 = x2d( LSB_MSB( NeznamaHod1 ))
NeznamaHod2 = x2d( LSB_MSB( NeznamaHod2 ))
/* Následující kód se aktivuje při libovolné chybě */

InterniChybaObrazovky:
RETURN XHodnota YHodnota PocetBarev ZGrRozliseni

LSB_MSB: PROCEDURE
RETURN strip( translate( “12345678”, arg(1), “78563412” ))

Přesměrování diskových operací
Manipulacím s logickými disky se občas nevyhne žádný uživatel moderního počítače. Uživatelé operačního systému 
OS/2 a starších verzí systému MS-DOS (verze 3.2, 3.3, 4.01 a 5.0) mají k dispozici zajímavý příkaz ASSIGN. Tento DOS příkaz slouží k přesměrování operací z určeného diskového zařízení na jiné diskové zařízení tak, že přiřadí písmeno jednotky jiné jednotce. Příkaz rovněž skryje skutečný typ zařízení před příkazy, které pracují s aktuálními infor- macemi o diskových jednotkách. Přestože je ASSIGN podrobně popsán v grafické nápovědě systému OS/2 Warp i OS/2 Merlin, nenajdete v ní informace o nedokumentovaném parametru:

ASSIGN /S

Uvedený parametr umí zobrazit aktuální aktivitu příkazu (S = STATUS) v textové relaci. Příkaz lze uvedeným způsobem používat v OS/2 Warp 3.0 i v OS/2 Merlin 4.0.

Editor KLASIK v prostředí WPS
V současné době pracuje většina textových editorů v grafickém prostředí Windows, OS/2 nebo XWindow, které nepředstavuje pro procesor Pentium významnou zátěž. Značná část zbylých editorů pracuje v grafickém režimu pod systémem DOS. Tyto zbylé textové editory mohou být samozřejmě také spouštěny z textové DOS relace pod systémem OS/2 Merlin a není přitom důležité nastavení češtiny.
Používáme-li český textový editor KLASIK verze 3.0, který normálně pracuje v režimu VGA, můžeme ovšem narazit na fatální problémy. V editoru KLASIK můžeme v menu Aplikace zvolit funkci Nastavení systému, která obsahuje subfunkci Obrazovka. Když v rámci subfunkce Obrazovka nastavíme režim VESA VBE (800 x 600 s 16 barvami, 640 x 400 s 256 barvami, 640 x 480 s 256 barvami nebo 800 x 600 s 256 barvami), přikážeme sice editoru pracovat od příštího spuštění v definovaném grafickém rozlišení, ale tím si zároveň značně zkomplikujeme život. KLASIK pracující v režimu VESA VBE totiž nesnáší přepínání úloh pomocí Seznamu oken ve WPS přes známou zkratku kláves CTRL+ESC. Přepnutí do WPS pracuje bez problémů, ale při návratu do editoru KLASIK dojde k jeho “zatuhnutí” a jedinou možností je násilné ukončení DOS relace s rizikem, že otevřený textový soubor bude poškozen. Přitom v režimu VGA se KLASIK chová zcela korektně. Proto doporučuji používat KLASIK v rámci OS/2 (Merlin či Warp) pouze ve standardním režimu VGA.
Michal Pohořelský

Borland C++ Builder 4:
Zpětná kompatibilita
V naší recenzi Borland C++ Builderu 4 (Chip 4/99) jste si mohli všimnout poznámky o tom, že knihovna VCL verze 4.0 není plně kompatibilní s knihovnou VCL 3.0. Podívejme se na rozdíly mezi nimi podrobněji. Přitom budeme hovořit o přenosu projektů z C++ Builderu 3 do C++ Builderu 4; přenos opačným směrem bude spíše vzácností.

Nové vlastnosti
První změna spočívá v tom, že komponenty v nové verzi mohou mít některé nové vlastnosti (property) — můžeme např. definovat kotvy (vlastnost Anchors), můžeme předepsat maximální nebo minimální velikost (vlastnost Constraints) atd.
Nové vlastnosti ovšem nebrání přenosu projektu z verze 3.0 do verze 4.0, neboť implicitní hodnoty nových vlastností jsou takové, že se komponenty chovají stejně jako v předchozí verzi.

Vytváření oken
Při přenosu projektů z verze 3 do verze 4 narazíme na podivné chování oken při vytváření – přesněji na změněné pořadí volání konstruktoru, resp. destruktoru okna a vzniku událostí OnCreate, resp. OnDestroy. Rozdíl v chování obou verzí si nejsnáze předvedeme na jednoduchém programu. Vytvoříme nový projekt volbou File | New Application; souborům i formuláři ponecháme pro jednoduchost jména, která pro ně navrhne prostředí. Pak otevřeme hlavičkový soubor Unit1.h a do definice třídy okna doplníme deklaraci destruktoru
virtual __fastcall TForm1();
V inspektoru objektů přejdeme na kartu Events (události) a vytvoříme handlery pro události OnCreate a OnDestroy. Konstruktor, destruktor a oba handlery budou mít jediný úkol 
– vypsat zprávu o tom, že se tato funkce volá:
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Application->MessageBox(“Konstruktor TForm1”, “Právě teď”, MB_OK);
}

void __fastcall TForm1::FormCreate(TObject *Sender)
{
Application->MessageBox(“OnCreate”, “Právě teď”, MB_OK);
}

__fastcall TForm1::~TForm1()
{
Application->MessageBox(“Destruktor TForm1”, “Právě teď”, MB_OK);
}

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
Application->MessageBox(“OnDestroy”, “Právě teď”, MB_OK); 
}

Přeložíme-li tento program v C++ Builderu 3.0, objeví se při spuštění zprávy v pořadí 

Konstruktor TForm1
OnCreate

a při ukončení

OnDestroy
Destruktor TForm1

Jestliže tento projekt přeneseme do C++ Builderu 4.0, přeložíme ho a spustíme, objeví se při spuštění zprávy v pořadí 

OnCreate
Konstruktor TForm1

a při ukončení

Destruktor TForm1 
OnDestroy

Tato změna může přinést nepříjemné potíže: Některé programy, vytvořené ve verzi 3, sice bez problémů přeloží i v C++ Builderu verze 4, avšak po spuštění ohlásí např. porušení ochrany paměti, neboť se pokusí pracovat s komponentami, které ještě nebyly vytvořeny.
Řešení je jednoduché. Třída okna obsahuje vlastnost OldCreateOrder typu bool, která určuje, kdy nastane událost OnCreate, resp. OnDestroy. Tato vlastnost má zajišťovat zpětnou kompatibilitu s C++ Builderem verze 1, z jakýchsi záhadných důvodů se však nastavuje na true při přenosu projektu z verze 3 do verze 4. Nezbývá tedy, než změnit ji ručně. 

Metody a funkce
Další změna, o které budeme hovořit, se týká nových parametrů u několika metod a globálních funkcí. Následující tabulka ukazuje jejich přehled.

TControl::BeginDrag
TFieldDef::CreateField
TClientDataSet::AddIndex
TClientDataSet::CloneCursor
TClientDataSet::LoadFromFile
TClientDataSet::SaveToFile
TTable::AddIndex
DatabaseError
DatabaseErrorFmt
TIMemoryStream
TFieldDef::TFieldDef

Tyto změny mohou způsobit, že projekt vytvořený v předchozí verzi nepůjde přeložit. Nezbude tedy nic jiného, než vyhledat chyby a doplnit nové parametry.

Vlastnost Fields
Poslední změna, která může způsobit problémy, se týká přístupu k jednotlivým polím datové množiny pomocí vlastnosti Fields. V předchozí verzi měla třída TDataSet (a tedy i třídy od ní odvozené, např. TTable, TQuery a další) vlastnost Fields, která představovala pole databázových sloupců. V současné verzi je vlastnost Fields objekt typu TFie- lds, který má mimo jiné vlastnost Fields představující pole databázových sloupců.
To znamená, že např. příkaz

String jmeno = Dotaz->Fields[0]->FieldName;

který fungoval v C++ Builderu 3, musíme změnit na 

String jmeno = Dotaz ->Fields->Fields[0]->FieldName;

Visual C++ 5.0 a 6.0:
Virtuálně děděný operátor přetypování
V překladačích Microsoft Visual C++ 5.0 a 6.0 se setkáme s následující chybou. Představte si, že ve třídě A definujeme jako metodu operátor přetypování např. na typ int, tedy metodu A::operator int(). Jestliže tuto třídu použijeme jako společného předka a odvodíme dva virtuální potomky, např. třídy B a C, a od nich pak společného potomka, třídu D, pak překladač nedokáže zděděný operátor přetypování použít pro instanci třídy D. Pokud vám to připadá komplikované, podívejte se na příklad:

class A // Společný předek
{
public:
operator int(){ return 1; }
int f() {return 1;}
};
// Virtuální potomci B a C
class B: public virtual A
{};
class C: public virtual A
{};
// Společný potomek
class D: public B, public C
{};
int main()
{
D d, e, f;
int i = e;	// Zde překladač 
// ohlásí chybu
return 0;
}

Při překladu příkazu
int i = e;
ve funkci main() bude překladač hledat způsob, jak převést instanci typu D na hodnotu typu int. Takovou cestu představuje právě funkce A::operator int() zděděná po třídě A. Třída D ji sice zdědí dvěma cestami, ale pouze jednou, neboť A je virtuální předek tříd B a C, takže instance třídy D obsahuje jediný podobjekt třídy A. To znamená, že hlášení překladače o nejednoznačnosti přetypovacího operátoru je chybné. Ostatně pro jiné funkce tento problém nenastane – o tom se snadno přesvědčíme, jestliže do funkce main() přidáme příkaz
i = e.f();
Pokud se vám zdá, že jde o nepravděpodobnou a nepoužívanou konstrukci, pak se podívejte na následující příklad, který najdete ve většině běžných učebnic C++:

#include <fstream>
using namespace std;
void main()
{
fstream F(“data.dta”, ios::in);
if(F)	// Zde opět ohlásí 
// překladač chybu
{/* ...použijeme F ... */
}
}

V podmínce příkazu if jsme zapsali identifikátor datového proudu. To by mělo být v pořádku, neboť třída fstream obsahuje operátor přetypování na void*, který vrací 0, pokud se nepodaří poslední operace s proudem – zde např. otevření souboru. Jde tedy o jednoduchý nástroj pro test stavu proudu. Tento operátor je definován ve třídě ios, odkud jej zdědí dva virtuální potomci, třídy istream a ostream. Třída fstream je pak jejich společným potomkem. I zde ovšem překladač Visual C++ 5.0 a 6.0 ohlásí, že nedokáže jednoznačně určit, který operátor použít, i když má jen jeden.
Poznamenejme, že tento problém se neobjevuje ve všech situacích. Například jiný běžný programátorský obrat, používaný pro čtení ze souboru, 

fstream F(“data.dta”, ios::in);
int i; 
while(F >> i)
Zpracuj(i);

se přeloží bez problémů, i když vlastně znamená totéž. Výsledkem (hodnotou) operace F >> i je proud F po ukončení čtení, a ten se zde implicitně konvertuje na pomocí funkce operator void*() na hodnotu, která ukazuje, zda se čtení podařilo.
Miroslav Virius