Delphi 7 zamiana znaków diakrytycznych na ich zamiennik

0

Witam. Mam problem z delphi. Mam wykonać program który :
wczytuje plik txt (zrobione)
wczytuje zawartość do Memo1(zrobione)
i teraz schody ... Po kliknięciu w button zawartość Memo1 ma zostać "przepisana" do Memo2 tyle że już bez polskich znaków. Tak wiem na tym forum jest niby zamiana ale owy gotowiec nie trybi pewno źlę coś robię. i nie wiem jak sobie z tym poradzić; liczę na pomoc. Pozdrawiam

0

Pętla "for" + if'y.
For - od 1 do LenGth(Memo1.Text)
If'y - if (Memo1.Text[i] = 'ą') Then Memo2.Text := Memo2.Text + 'a' else
if (Memo1.Text[i] = 'ę') Then Memo2.Text := Memo2.Text + 'e' // i tak dalej, a w ostatnim:
else Memo2.Text := Memo2.Text + Memo1.Text[i];
Jednak wg.mnie, to najgorszy z możliwych sposobów (może jest jakiś na kodach ASCII ?).

0

To takie trochę na piechotkę .... coś z mniejszą linią kodu ?

0

Najprościej to tak, chociaż nie powinno się zakładać sztywno wyglądu polskich znaków, ale przy standardowym programie i kodowaniu jeżeli w Memo1 masz widoczne polskie znaki to tak będzie najszybciej, bo w gre wchodzi zmiana pojedynczych znaków, ale przy wyrazach czy zdaniach chyba najłatwiej było by wywołać StringReplace, na przykład w pętli. I coś widzę u Patryka27 "spadek formy", bo proponuje takie rozwiązania - jak to bodajże pisze Azarien, "za które powinni rozstrzeliwać" zamiast masy if'ów zaproponować najprostszy sposób :)

const
  PL_Chars = ('ąćęłńóśżźĄĆĘŁŃÓŚŻŹ');
  Non_PL_Chars = ('acelnoszzACELNOSZZ');
var
  S : string;
  I, X : integer;
begin
  S := Memo1.Text;
  for I := 1 to Length(S) do
  begin
    X := Pos(S[I], PL_Chars);
    if X > 0 then
      S[I] := Non_PL_Chars[X];
  end;
  Memo2.Text := S;
end;
0

Dzięki wielkie :) Skrzynka Piwa leci :) a mógłbyś mi jeszcze pomóc z ostatnią rzeczą której nie potrafię dokonać mianowicie w polu Edit ma się pojawić [liczba] zmienionych znaków. był by to duży problem ;)?

0

Skrzynką piwa nie pogardze za taki kod, to co podać adres czy żeby zaoszczędzić na kurierze to numer konta? ;) I to nieduży problem taki kod (przynajmniej dla mnie), ale problemem jest trochę to, że nie kombinujesz za bardzo sam z tak łatwym kodem, do którego jak widać wystarczy dodać jedną zmienną. Proponuje poświęcić trochę czasu i poczytać kompendium Delphi na stronie 4programmers, bo słabo to widze jak z każdą nową w miarę banalną rzeczą będziesz chciał pytać na forum o kod. Wiesz, ja chętnie pomagam, ale fajnie by było jakbys się przy okazji też coś nauczył i potrafil później samodzielnie zaprogramować to co sobie zaplanujesz.

const
  PL_Chars = ('ąćęłńóśżźĄĆĘŁŃÓŚŻŹ');
  Non_PL_Chars = ('acelnoszzACELNOSZZ');
var
  S : string;
  I, X, Cnt : integer;
begin
  Cnt := 0;
  S := Memo1.Text;
  for I := 1 to Length(S) do
  begin
    X := Pos(S[I], PL_Chars);
    if X > 0 then
    begin
      Cnt := Cnt + 1;
      S[I] := Non_PL_Chars[X];
    end;
  end;
  Memo2.Text := S;
  Edit1.Text := IntToStr(Cnt);
end;
0

olesio, do samej zamiany literek wystarczyłby kod pod komentarzem (//potem zamieniamy):

const
  Pl_Chars      = ('ąćęłńóśżźĄĆĘŁŃÓŚŻŹ');
  Non_PL_Chars  = ('acelnoszzACELNOSZZ');
var
  x : integer;
  c : integer;
begin
  //najpierw liczymy
  for x := 1 to Length(Memo1.Text) do
    if Pos(Memo1.Text[x], Pl_Chars) > 0 then
      Inc(c);

  //potem zamieniamy
  for x := 1 to Length(PL_Chars) do
    Memo2.Text := StringReplace(Memo1.Text, Pl_Chars[x],  Non_Pl_Chars[x], [rfReplaceAll]);

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