e-mail    Debatní kniha    Mapa stránek    Hlavní  
 perličky 
 

Česká klávesnice v prostředí Turbo Vision

Zbyšek Hlinka

Chcete-li mít ovladač české klávesnice zabudován přímo ve svém programu a chcete se vyhnout přesměrovávání vektorů přerušení (což vede občas k různým kolizím), můžete využít následující možnost.

Program je vytvořen v prostředí borlandského Turbo Vision, to však nemění nic na univerzálnosti jeho použití. Podstatné je, aby čtení stisknuté klávesy vycházelo v rámci programu z jedné procedury nebo funkce.

Pracujete-li v Turbo Vision, můžete připojený výpis realizovat pouze tehdy, máte-li i zdrojový kód jednotky DRIVERS.PAS. Jinak je nutno předefinovat proceduru GetKeyEvent přidáním pascalské části a umístit ji tak, aby byla volána místo té původní. Hlavní volání této procedury je v jednotce APP.PAS.

Podstatou je úprava procedury GetKeyEvent, která vrací do programu hodnotu stisknuté klávesy. Assemblerový kód je původní podoba procedury, zbytek je ovladač české klávesnice. Konstanta National indikuje, zda je zapnutá nebo vypnutá česká klávesnice. Pro možnost ovládat stav klávesnice již při startu programu je vhodné tuto konstantu umístit do části interface. Vše ostatní může být v části implementation.

Přepínání se provádí stiskem kláves Alt-pravý Shift (stav přeřazovacích kláves je uložen na adrese 0:417h, viz popis konstant kbXXXX). Funkce NewKey provede přemapování znaku (je vhodné tuto funkci dále vylepšit např. o přepínač qwerty-qwertz atp.) a konstanta IsAltShift hlídá, zda netrvá stisk přepínacích kláves při dalším průchodu procedurou GetKeyEvent (procedura nečeká na stisk klávesy!).

S případnými dotazy se obracejte na adresu: Zbyšek Hlinka, Kryštofova 1016, 149 00 Praha 4, tel. (02) 795 29 56.

const
  National:boolean=false;  {stav CZ klávesnice
                            - vypnuta=false}
const
{ přemapované znaky pro stav National=true }
  CzechKey:array[33..126] of char=
    '1!3457ş908+,=.-é+ěščřžýáí"ů?=:_2ABCDE'+
    'FGHIJKLMNOPQRSTUVWXYZú\)6%`abcdefghijklm'+
    'nopqrstuvwxyz/|(;';

{ háčkované znaky }
  PlusKey:array[67..122] of char=
    'ČĎĚFGHIJKŸMŇÔPQ؊ŮVWXYŽ[\]^_`abč'+
    'ďěfghijkžmňôpqřšůvwxyž';

{ čárkované znaky }
  JerovnoKey:array[65..121] of char=
    'ÁBCDÉFGHÍJKĹMNÓPQŔSTÚVWXÝZ[\]^_`ábc'+
    'défghíjkĺmnópqŕstúvwxý';

  PrevChar:char=#0;  { Obsahuje kód klávesy
                       s diakritikou }
function NewKey(ChCode:word):char;
var
  LoKey:char;
begin
  LoKey:=char(Lo(ChCode));
  if (Hi(ChCode) and $ff)<$36 then { je-li klíč
                                   z main keyboard }
  if National then                 { je-li zapnuta
                                národní klávesnice }
  if LoKey in [#33..#126] then
  begin
    case PrevChar of
    '=':if LoKey in ['A','E','I','L','O','R','U','Y',
            'a','e','i','l','o','r','u','y'] then
          LoKey:=JerovnoKey[byte(LoKey)];
    '+':if LoKey in ['C','D','E','L','N','O','R'..'U','Z',
            'c','d','e','l','n','o','r'..'u','z'] then
          LoKey:=PlusKey[byte(LoKey)];
      '`':case LoKey of
            'A':LoKey:='Ä';
            'O':LoKey:='Ö';
            'U':LoKey:='Ü';
            'a':LoKey:='ä';
            'o':LoKey:='ö';
            'u':LoKey:='ü';
          end;
    end;
    case LoKey of
      '=','+','`':  { čárka, háček, přehláska }
      begin
        PrevChar:=LoKey; NewKey:=#0; 
                    { ano, ulož je do PrevChar }
        Exit;
      end;
      #33..#126:
      begin
        PrevChar:=#0;
        LoKey:=CzechKey[byte(LoKey)];
      end;
      else PrevChar:=#0;
    end;
  end;
  NewKey:=LoKey;
end;

const
  IsAltShift:boolean=false; { testuje stisk
                     kláves Alt-pravý Shift }

procedure GetKeyEvent(var Event: TEvent);
begin
asm
     MOV  AH,1
     INT  16H
     MOV  AX,0
     MOV  BX,AX
     JE   @@1
     MOV  AH,0
     INT  16H
     XCHG AX,BX
     MOV  AX,evKeyDown
@@1: XOR  CX,CX
     MOV  DX,CX
     CALL StoreEvent
end;
  if not IsAltShift and (Mem[Seg0040:$17] and $9=$9) then
    National:=not National;
  IsAltShift:=Mem[Seg0040:$17] and $9=$9; {Alt-pravý Shift}
  if Event.What=evKeyDown then
  begin
    if Event.CharCode>#32 then
    Event.CharCode:=NewKey(Event.KeyCode);
  end;
end;



Pascal - hlavní
Překladače
Vlastní články
Převzaté články
Věci na stáhnutí
Odkazy k tématu
BP7 buglist
Chyba Run-time 200

BASIC