Problem - Program do poprawiania błędów ort. i int.

0

Witam, chciałem napisać program do poprawiania błędów ortograficznych i interpunkcyjnych, jednak nie bardzo wiem jak to zrobić.

Wyskrobałem coś takiego:

Procedura klikniecia jakiegokolwiek przycisku:
Jezeli w Memo2.Text (log z KeySpyXP) znajdzie się jakiś wyraz z Memo1.Text, wtedy:
1. przypisz do "dlugosc" liczbe ile jest znakow w Memo1.Text (tam gdzie beda zle napisane slowa)
Dopóki "kasuj" (0) jest mniejsze niż "długosc" (wyrazu zle napisanego) to:
1. Dopisz do "kasuj" +1
2. Kliknij BackSpace
Jeżeli zmazaliśmy już wyraz:
Dopoki dlugosc (zle napisanego wyrazu) jest wieksza niz "przebyta" (0) (potrzebne do napisania nowego wyrazu) to:
1. Dodaj do "przebyta" +1
2.  dopisz do "znak", litere ktora ma zostac wcisnieta (potrzebne do napisania nowego wyrazu)
3. Kliknij na klawiaturze 1 litere... a potem druga.. az napiszesz caly wyraz
Jeżeli napiszesz już cały wyraz to:
Koniec procedury
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  dlugosc: Integer;
  przebyta: Integer;
  znak: Char;
  kasuj: Integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
sleep(2000); // czekaj 2 sek. na danie myszki na notepada (narazie tak testuje... bez KeySpyXP)
dlugosc := Length(Memo1.Text); // przypisz do "dlugosc" liczbe ile jest znakow w Memo1.Text (tam gdzie beda zle napisane slowa)
Label3.Caption := IntToStr(Length(Memo1.Text)); // pomaga mi naprawiać błędy
while (kasuj < dlugosc) do // dopoki kasuj jest mniejsze niz dlugosc (wyrazu zle napisanego) to:
begin
Label1.Caption := 'kasuj < dlugosc'; // pomaga znaleźć błąd
kasuj := kasuj+1; // dopisz do kasuj+1
keybd_event(vk_back, 0, 0, 0); //i kliknij BackSpace... i tak na nowo... az kasuj bedzie miala taka sama wartosc jak dlugosc
end; // czyli zmazalismy wyraz zle napisany
while (dlugosc > przebyta) do // dopoki dlugosc (zle napisanego wyrazu) jest wieksza niz "przebyta" (potrzebne do napisania nowego wyrazu) to:
begin
Label1.Caption := 'dlugosc > przebyta'; // tylko do pomagania poprawić błędy
przebyta := przebyta+1; // dodaj do przebyta+1
znak := Memo1.Text[przebyta]; // dopisz do znak, litere ktora ma zostac wcisnieta (potrzebne do napisania nowego wyrazu)
keybd_event(VkKeyScan(znak), 0, 0, 0); // kliknij na klawiaturze 1 litere... a potem druga.. az napiszesz caly wyraz
keybd_event(VkKeyScan(znak), 0, KEYEVENTF_KEYUP, 0);
end
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
dlugosc := 0; // ustaw "dlugosc" na 0
przebyta := 0; // ustaw "przebyta" na 0
kasuj := 0; // ustaw "kasuj" na 0
end;

end.

To co napisałem może wydawać się niezrozumiałe - ale już taka moja natura ; d
Czego nie wiem jak zrobić?

  1. Jak zrobić, by.... yyy... dajmy na to że mam 3 memo:
    1Memo: Tutaj są logi z KeySpyXP (tego co wystukujemy klawiaturą).
    2Memo: Tutaj są źle napisane wyrazy np.:
muglbym
mugłbym
żekłem
żeklem
zeklem

3Memo: Tutaj są dobrze napisane wyrazy, przy czym w tej samej linijce co źle napisany wyraz np.:

mógłbym
mógłbym
rzekłem
rzekłem
rzekłem

No i teraz tak: Aby znajdywało źle napisany wyraz to już mam... teraz jak zrobić, by po znalezieniu tego źle napisanego wyrazu podmieniało go na dobry z Memo3?

Jeżeli coś nie tak wyjaśniłem to piszcie...

Proszę o pomoc,
Pozdrawiam,
Defozo

0

No trochę niejasno napisałeś, bo najpierw piszesz inną numerację Memo, co ma które zawierać, a poźniej
w ogóle co innego. Także przy założeniu, że Memo1 to cały tekst, w Memo2 są w kolejnych linijkach błędne
wyrazy, a w Memo3 są w tej samej kolejności w osobnych liniach ich odpowiedniki poprawne, którymi masz
zastapić te złe wyrazy w Memo1 tymi poprawnymi z Memo3, to najprościej imo będzie zrobić w ten sposób:

var
  I : integer;
  Str : string;
begin
  Str := '';
  if Memo2.Lines.Count = Memo3.Lines.Count then
   begin
   Str := Memo1.Text;
   for I := 0 to Memo2.Lines.Count -1 do
      begin
      Str := StringReplace(Str, Memo2.Lines[I], Memo3.Lines[I], [rfReplaceAll]);
      end;
   Memo1.Text := Str;
   end;
end;
0

Hmmm... nie do końca to dobrze ująłem...
Pare rzeczy już się dowiedziałem (dzięki olesio) ale jednak to nie o to chodzi:
Wytłumaczcie mi, jak uzyskać która to jest linia, jak używam:

If (pos(Bledne.Text,KeySpy.Text) <> 0) then
begin
{cos tam}
end
Else

pos() - zwraca mi tylko który to jest znak, a nie linia.
Chodzi mi o to, by to coś powiedziało mi na której lini jest "muglbym" w Bledne.Text...
Np. Dzięki pos() wiem już, że jakiś błędny wyraz jest w głównym logu, teraz jak mam się dowiedzieć w której linijce w Bledne.Text znajduje się ten błędny wyraz który został znaleziony (chodzi o to, by później odnaleźć go w Poprawne.Text i "wcisnąć" na klawiaturze tyle ile potrzeba BackSpace i dać poprawny wyraz)?

Aaa... i jeszcze wyjaśnienie:
Tym razem to:
Główny tekst = Memo1 = KeySpy
Błędne wyrazy = Memo2 = Bledne
Poprawne wyrazy = Memo3 = Poprawne

Dzięki za odpowiedź,
Defozo

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