Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Delphi] - program szyfrujący tekst.

05 Kwi 2010 10:52 2004 11
  • #1 05 Kwi 2010 10:52
    1254281
    Użytkownik usunął konto  
  • Pomocny post
    #2 05 Kwi 2010 11:12
    arnoldziq
    Moderator Programowanie

    Dodaj jeszcze jedno pole memo, aby można było zobaczyć wynik i sprawdź taki kod:

    Code:
    procedure TForm1.Button1Click(Sender: TObject);
    
    var
    s : ansistring;
    j : integer;
    begin
      memo2.Clear; // czyscimy memo2.
      s := memo1.text; //pobieramy caly teks za jednym razem
      for j := 1 to Length(s) do
       if (s[j]<>#10) and (s[j]<>#13) then //nie kodujemy znakow przejscia do nastepnej linji
           s[j] := chr(ord(s[j]) + 3); //Przesuwamy znak o 3 w tablicy ASCII
      memo2.text := s; //zapisujemy kodowany tekst do memo2
    end;


    A wracając do twojego kodu :
    Code:
    for i := 0 to Memo1.Lines.Count do 
    Zawsze będzie generować błąd. Musisz zobić tak :
    Code:
    for i := 0 to Memo1.Lines.Count-1 do

    Jak masz 1 element, to znajduje się on pod indeksem 0, w wywołując ten kod od 0 do 1, próbujesz przeczytać lines[1] - to powoduje błąd.

    0
  • #3 05 Kwi 2010 11:32
    1254281
    Użytkownik usunął konto  
  • Pomocny post
    #4 05 Kwi 2010 11:32
    akaz_
    Poziom 13  

    Nie programowałem w Delphi tysiąc lat, ale jedna rzecz mnie zastanawia:

    Code:
    s := s[j]


    Jeśli to działa tak jak myślę, to ten string (s) nie ma prawa mieć więcej niż jedną literę właśnie przez tą linijkę kodu.
    Niestety nie mam na czym tego sprawdzić.
    Jeżeli nie trafiłem, powiedz konkretniej co się dzieje, a na pewno coś wymyślimy :)

    EDIT: widzę Arnoldziq rozwiązał Twój problem zanim zdążyłem wysłać posta :)

    0
  • #5 05 Kwi 2010 11:34
    1254281
    Użytkownik usunął konto  
  • Pomocny post
    #6 05 Kwi 2010 11:38
    arnoldziq
    Moderator Programowanie

    Jeżeli koniecznie chcesz przetwarzać każdą linję osobno to zrób tak :

    Code:
    procedure TForm1.Zaszyfruj1Click(Sender: TObject);
    
    var
    s : ansistring;
    i,j : integer;
    begin
      memo2.clear;
      for i := 0 to Memo1.Lines.Count-1 do
       begin // !!!!
        s := memo1.Lines[i];
          for j := 1 to Length(s) do
            s[j] := chr(ord(s[j]) + 3);
       memo2.lines.add(s);
       end; //!!!   
    end;

    Nie zapomnij dodać drugiego pola memo.

    0
  • #7 05 Kwi 2010 11:43
    1254281
    Użytkownik usunął konto  
  • Pomocny post
    #8 05 Kwi 2010 11:44
    arnoldziq
    Moderator Programowanie

    Poprawiłem, begin i end mi się zawieruszył :)
    Jak chcesz podmienić tekst, to zapisuj ten zakodowany teksy nie do memo2 tylko do memo1.

    Code:
    procedure TForm1.Button1Click(Sender: TObject);
    
    var
    s : ansistring;
    i,j : integer;
    begin
       for i := 0 to Memo1.Lines.Count-1 do
       begin // !!!!
        s := memo1.Lines[i];
          for j := 1 to Length(s) do
            s[j] := chr(ord(s[j]) + 3);
       memo1.lines[i] :=s;
       end; //!!!
     end;
    end.

    0
  • #9 05 Kwi 2010 11:47
    1254281
    Użytkownik usunął konto  
  • Pomocny post
    #10 05 Kwi 2010 11:53
    arnoldziq
    Moderator Programowanie

    No to zrób dwie funkcje; kodującą i dekodującą.
    Wywołuj każdą z nich z parametrem, którym jest jedna linia z memo. Zwrócony wynik zapisuj z powrotem w tą samą linię.
    Poprawiony kod masz powyżej ; to samo ale bez dekodowania i osobnych funkcji.

    0
  • #11 05 Kwi 2010 11:55
    1254281
    Użytkownik usunął konto  
  • #12 05 Kwi 2010 12:01
    arnoldziq
    Moderator Programowanie

    Chcesz to zaszyfrować naprawdę "mocno" czy tak, aby nikt tego nie mógł złamać "na papierze"?

    1