logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Delphi] Delphi: Automatyczna zamiana znaków w pliku tekstowym z użyciem Replace i RichEdit

Mivan 13 Maj 2010 01:24 5321 10
REKLAMA
  • #1 8069374
    Mivan
    Poziom 9  
    Posty: 40
    Ocena: 1
    Witam. Chciałbym zrobić automatyczny Replace, żeby zamieniał automatycznie litery na zamienniki. Mogło by to działać w ten sposób:

    RichEdit1.Lines.SaveToFile('aa.txt'); // to co wpiszę w RichEdit1 po kilknięciu w przycisk zapisuje do pliku aa.txt
    << formułka dla ReplaceDialog by podmieniał w aa.txt np. ze stringów 'a' na 'b', 'c' na 'd' etc. >>
    RichEdit2.Lines.LoadFromFile('aa.txt'); // wkleja zmieniony tekst do RichEdit2

    Pomóżcie, pls!
  • REKLAMA
  • #2 8069861
    arnoldziq
    VIP Zasłużony dla elektroda
    Posty: 5376
    Pomógł: 789
    Ocena: 300
    Mętne to trochę.
    Chcesz używać do tego standardowego ReplaceDialog, czy po prostu chcesz zamieniać w tekście jedne litery na inne w z góry ustalony sposób?
    Z tego co napisałeś, wynika, że nie potrzebujesz żadnych operacji na plikach a jedynie zrobić jakąś formę prostego szyfrowania, przesuwając ASCII znaków o jeden w górę (a->b, b->c, c->d, itd).
    Możesz to spokojnie zrobić wczytując plik do dowolnej kontrolki np. TMemo, pozmieniać tekst i zapisać go tą samą metodą.
  • #3 8070133
    lanky
    Poziom 17  
    Posty: 149
    Pomógł: 27
    Ocena: 7
    Ta procka ci zamieni od razu tekst z Rich1 do Rich2 {z "a" na "b"} itp
    
    var  
    Old,New: string;
    i: integer;
    Ch: Char;
    begin
    Old:= RichEdit1.Text;
    for i:= 1 to Length(Old) do
    begin
      Ch:= old[i];
      inc(Ch);
      new:= new+ Ch;
    end;
    RichEdit2.Text:= new;
    end;
    
  • REKLAMA
  • #4 8070972
    Mivan
    Poziom 9  
    Posty: 40
    Ocena: 1
    Sorki, źle się wyraziłem. Nie chcę zmieniać znaków o jeden dalej, tylko na różne inne, tylko chcę uzyskać coś takiego, żeby nie wyświetlało się okienko od Replace i nie pytało jaki znak zamienić na co, tylko żeby po kliknięciu buttona po prostu zamieniło dany znak z np. RichEdit1 i pokazało go w RichEdit2 (Tudzież Memo).

    Jestem początkujacym programistą i po prostu nic innego mi do głowy nie przyszło niż użycie Replace Dialog do podmiany literek. Uczę się programowania wymyślając różne śmieszne programy, ten będzie "szyfrował" literki (podmieniał na inne). Bardziej tu chodzi, żeby zdobyć doświadczenie, dlatego nie robię tego XORem etc.

    A więc z braku doswiadczenia, pomyslalem ze wszystko sie bedzie robic recznie. Napisalem stałe, że 'a' to będzie np. 'd' i myslalem ze bedzie dało radę to "szyfrować" za pomocą podmiany, bo na początku to mi działało na 1 literce "ręcznie"

    if Edit1.Text='b' then Memo1.Lines.Add(b);

    z czego b to był string w stałych.
  • #5 8071073
    arnoldziq
    VIP Zasłużony dla elektroda
    Posty: 5376
    Pomógł: 789
    Ocena: 300
    Metoda szyfrowania poprzez zamianę jest bardzo prosta do zrealizowania.
    Tworzysz na formie 3 komponenty :
    1. Edit1 - zawiera literkę którą chcesz zmienić.
    2. Edit2 - zawiera literkę na która chcesz zmienić.
    3. Memo1 - zawiera tekst na którym operujesz.

    Cały tekst można przerobić, właściwie, jedną komendą:
    memo1.text:=StringReplace(memo1.text,edit1.text,edit2.text,[rfReplaceAll]);


    Musisz jednak uważać z tego typu transformacjami. Aby móc to potem odkodować trzeba zachować odpowiednią kolejność kodowania i dekodowania, oraz trzeba uważać aby nie następowały po sobie np. takie kombinacje. a->s , s->b. Nie będziesz miał, w takim przypadku, najmniejszej szansy na odkodowanie tekstu z powrotem.

    Jeżeli chcesz się pobawić w proste kodowanie tekstu, to pomyśl nad przeprowadzaniem operacji matematycznych na kodach ASCII poszczególnych znaków w tekście.
  • REKLAMA
  • #6 8071096
    Mivan
    Poziom 9  
    Posty: 40
    Ocena: 1
    Dzieki wielkie, mam nadzieję, że to ogarnę.

    Mój poprzedni "szyfrer" cyferek kodował, można powiedzieć, matematycznie.

    Składał się z 3 części: długość_liczba zaszyfrowana_koniec(zero)
    i liczba zaszyfrowana była podnoszona do 3 potegi, a długość to była długość liczby. np. 11 = 213310, ale nie umiałem robić odszyfrowywania, więc zmieniłem koncepcję.

    Ok idę próbować, jeszcze raz dzięki.
  • #7 8071151
    arnoldziq
    VIP Zasłużony dla elektroda
    Posty: 5376
    Pomógł: 789
    Ocena: 300
    :)
    Rychło w czas (ta zmiana koncepcji).
    Zakodować to można bardzo prosto w ten twój sposób, ale rozkodowanie nie jest możliwe, niestety.
    Zainteresuj się może tą stroną, są tam opisy kilku bardzo prostych metod szyfrowania.
    W sam raz na początek.
    Co prawda w/w strona operuje raczej C++, ale same opisy algorytmów mogą Cię zainteresować.
  • REKLAMA
  • #8 8072813
    Mivan
    Poziom 9  
    Posty: 40
    Ocena: 1
    Wypas stronka :D Szczególnie mi się podoba szyfrowanie na kwadracie :D Genialne w swojej prostocie :D

    A co do StringReplace, mogę zrobić powiedzmy:
    richedit2.Text:=StringReplace(memo1.Text, baza_literek_a-z , baza_literek_na_które_zostaną_podmienione, [rfReplaceAll]);
    ?
    Tak to by podmieniało od razu wszystkie litery w tekście, a nie tylko jedną?
  • #9 8073818
    arnoldziq
    VIP Zasłużony dla elektroda
    Posty: 5376
    Pomógł: 789
    Ocena: 300
    Mivan napisał:
    A co do StringReplace, mogę zrobić powiedzmy:
    richedit2.Text:=StringReplace(memo1.Text, baza_literek_a-z , baza_literek_na_które_zostaną_podmienione, [rfReplaceAll]);
    ?
    Tak to by podmieniało od razu wszystkie litery w tekście, a nie tylko jedną?


    Niestety nie.
    Nie ma tak łatwo. StringReplace może zmienić wszystkie ciągi znaków na inne, wiele razy w tym samym tekście, ale ciąg startowy i wynikowy musi być ustalony.
    Możesz się zainteresować mało znaną funkcją WrapText :
    function WrapText ( const SourceString, BreakString  : string; BreakSet  : TSysCharSet; MaxColumnSize  : Integer ) : string;
    Działa ona podobnie jak opisana przez Ciebie, ale podstawia tylko jeden, podany, ciąg znaków w miejsce szukanego.

    Procedurę, która robiłaby to dokładnie w opisany przez Ciebie sposób trzeba napisać samodzielnie.
  • #10 8075435
    Mivan
    Poziom 9  
    Posty: 40
    Ocena: 1
    Ok, dzieki wielkie :D Pokombinuję, może mi wyjdzie :D
  • #11 8347076
    perszeron
    Poziom 21  
    Posty: 521
    Pomógł: 33
    Ocena: 108
    var
     Dlugosc, i: Integer;
     Znak: Char;
     zm: String;
      klucz:integer;
    
    begin
    klucz:=strtoint(edit1.Text);
    zm:= memo1.text;
    Dlugosc :=Length(memo1.text);
    for i :=1 to Dlugosc do
     begin
      znak :=zm[i];
      znak :=Chr(Ord(znak) xor klucz);
      zm[i] :=Znak;
     end;
    memo2.text:=zm;
    end;
    
    
    
    //Koduje i dekoduje txt wedle klucza który wpisujesz w edit1.Text
    Proszę pamiętać o używaniu znaczników code. - arnoldziq

Podsumowanie tematu

✨ Użytkownik poszukiwał sposobu na automatyczną zamianę liter w tekście w Delphi, aby po kliknięciu przycisku tekst z RichEdit1 był zamieniany na inny w RichEdit2 bez użycia okna dialogowego Replace. Odpowiedzi sugerowały różne metody, w tym prostą zamianę znaków przy użyciu pętli oraz funkcji StringReplace. Użytkownik chciał uniknąć skomplikowanych metod szyfrowania, skupiając się na prostych zamianach liter. Wskazano również na konieczność zachowania odpowiedniej kolejności zamian, aby umożliwić późniejsze odszyfrowanie tekstu. Ostatecznie, użytkownik rozważał użycie XOR do kodowania i dekodowania tekstu według klucza.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA