[DELPHI] Znaki regionalne (Ü, ñ ...)

0

Witam mam potrzebę aby w mojej aplikacji mógł łatwo wpisywać znaki regionalne w paru językach (Niemiecki, czeski, hiszpański etc..). Ugryzłem sobie to w taki sposób że mam tablice:

 
  // Przykładowo dla języka niemieckiego
  Znaki_Specjalne[2, 1]    := 'Ä';
  Znaki_Specjalne_SC[2, 1] := 'A+SA';
  Znaki_Specjalne[2, 2]    := 'ä';
  Znaki_Specjalne_SC[2, 2] := 'A+A';
  Znaki_Specjalne[2, 3]    := 'Ö';
  Znaki_Specjalne_SC[2, 3] := 'O+SA';
  Znaki_Specjalne[2, 4]    := 'ö';
  Znaki_Specjalne_SC[2, 4] := 'O+A';
  Znaki_Specjalne[2, 5] := 'Ü';
  Znaki_Specjalne_SC[2, 5] := 'U+SA';
  Znaki_Specjalne[2, 6] := 'ü';
  Znaki_Specjalne_SC[2, 6] := 'U+A';
  Znaki_Specjalne[2, 7] := 'ß';
  Znaki_Specjalne_SC[2, 7] := 'B+A';      
 

Której używam w procedurze:


procedure Tuedytor.Edit12KeyDown(Sender: TObject; var Key: word; Shift: TShiftState);
var
  przycisk, TK: string;
  i,ii,iii:         integer;
  znalazlem : integer;
begin
  przycisk := '';
  znalazlem:=0;
  if ssShift in Shift then przycisk := przycisk + 'S';
  if ssAlt in Shift then  przycisk := przycisk + 'A';
  if ssCtrl in Shift then przycisk := przycisk + 'C';
  Przycisk := char(Key) + '+' + przycisk;
  for i := 1 to 70 do
  begin
    if Znaki_Specjalne_SC[Combobox1.ItemIndex, i] = przycisk then begin
      TK:=Edit12.Text;
      iii:=Edit12.SelStart;
      Insert(Znaki_Specjalne[Combobox1.ItemIndex, i], TK, Edit12.SelStart+1);
      Edit12.Text := TK;
      Edit12.SelStart:=iii+1;
      znalazlem:=1;
    end;
  end;
  if znalazlem = 1 then Key:=0;
end;        

Wszystko generalnie działa ale niestety tylko generalnie ponieważ gdy postawię obok siebie np 2 razy Ü to poprzedzający zamienia się na znak zapytania

Ma może któryś z szanownych kolegów jakiś pomysł dlaczego tak się dzieje? Zapewne sprawa idzie o jakiś problem z kodowaniem bo ów znaki specjalne zajmują więcej niż 1 char i gdy są obok siebie to koniec pierwszego znaku reaguje z początkiem następnego

Proszę o pomoc jak temu zaradzić

Ps. kiedy skopiuje jeden znak i wklejam do kilka razy to nic się takiego nie dzieje :/

0

Zastanów się, czy takie kombinowanie jest w ogóle potrzebne. Być może wystarczy odpowiedni układ klawiatury? Np. bardzo wygodny układ Grzegorza Jagodzińskiego:
http://grzegorj.w.interia.pl/keyboard/indexpl.html#autor.

0

Niestety jest to potrzebne :( w takiej formie jak napisałem

0

Witam,
Problem rozwiązany:
(Może trochę przekombinowane ale działa super)

 
function Wstawiaj_znaki_specjalne(Kontrolka: TEdit; Key: word; Shift: TShiftState; index_jezyka: integer): TZwrot_znaki_specjalne;
const
  Polskie_znaki: array[0..17] of string = ('Ą', 'Ć', 'Ę', 'Ł', 'Ń', 'Ó', 'Ś', 'Ź', 'Ż', 'ą', 'ć', 'ę', 'ł', 'ń', 'ó', 'ś', 'ź', 'ż');
var
  przycisk, buff, wynik: string;
  i, ii, jest_specjalny, prawdziwa_pozycja, poz_kursora, znalazlem: integer;
begin
  przycisk := '';
  wynik := '';
  znalazlem := 0;
  prawdziwa_pozycja := 0;
  buff := Kontrolka.Text;

  if ssShift in Shift then
    przycisk := przycisk + 'S';
  if ssAlt in Shift then
    przycisk := przycisk + 'A';
  if ssCtrl in Shift then
    przycisk := przycisk + 'C';

  Przycisk := char(Key) + '+' + przycisk;
  poz_kursora := Kontrolka.SelStart;

  for i := 1 to 7 do
  begin
    if Znaki_Specjalne_SC[index_jezyka, i] = przycisk then
    begin
      if Kontrolka.SelStart = 0 then
      begin
        Kontrolka.Text := Znaki_Specjalne[index_jezyka, i] + Kontrolka.Text;
        poz_kursora := 1;
        key:=0;
      end
      else
      begin
        repeat
          jest_specjalny := 0;
          for ii := 1 to 7 do
          begin
            if Znaki_Specjalne[index_jezyka, ii] = Copy(buff, 1, 2) then
            begin
              jest_specjalny := 1;
              break;
            end;
          end;
          for ii := 0 to 17 do
          begin
            if Polskie_znaki[ii] = Copy(buff, 1, 2) then
            begin
              jest_specjalny := 1;
              break;
            end;
          end;
          if jest_specjalny = 0 then
          begin
            wynik := wynik + Copy(buff, 1, 1);
            Delete(buff, 1, 1);
          end
          else
          begin
            wynik := wynik + Copy(buff, 1, 2);
            Delete(buff, 1, 2);
          end;
          Inc(prawdziwa_pozycja);
        until prawdziwa_pozycja = Kontrolka.SelStart;
        wynik := wynik + Znaki_Specjalne[index_jezyka, i] + buff;
        Kontrolka.Text := wynik;
        Inc(znalazlem);
        break;
      end;
    end;
  end;
  if znalazlem = 1 then
  begin
    Key := 0;
    Result.Pozycja_kursora := poz_kursora + 1;
  end
  else
    Result.Pozycja_kursora := poz_kursora;
  Result.Key := Key;
end;

// rekord wyniku funkcji 

  TZwrot_znaki_specjalne = record
    Pozycja_kursora : integer;
    Key             : integer;
  end;   

// Użycie          

procedure Tuedytor.Edit12KeyDown(Sender: TObject; var Key: word; Shift: TShiftState);
var
  Zwrot: TZwrot_znaki_specjalne;
begin
  Zwrot := Wstawiaj_znaki_specjalne(Edit12, Key, Shift, 2);
  Edit12.SelStart := Zwrot.Pozycja_kursora;
  Key := Zwrot.Key;
end;    
                                           
 

Postanowiłem wrzucić bo może komuś się przyda...
ps. Pisane pod Lazarusem, ale w Delphi powinno działać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1