so, jetzt hab ich lang genug gesucht.
ich war in mindestens 10 delphi-foren, um nach hilfe zu suchen. überall hab ich eins auf den deckel bekommen.
ich weiß von ein paar von euch, dass ihr euch mit delphi auskennt. meine frage ist eigentlich sehr simpel für die, die sich auskennen. ich hoffe, ihr reagiert nicht so gestört wie die moderatoren der anderen foren, die wohl nicht mit delphi-newbies umgehen können.
hier mein problem:
Ich arbeite an einem Programm, dass Texte, die mit einer "Skytale" chiffriert wurden, dechiffriert werden.
Nochmal auf deutsch: Die Skytale ist ein uraltes verschlüsslungsverfahren, um nachrichten unlesbar zumachen. Das System ist aber leider nicht unlösbar, deshalb das Programm. Die Skytale funktioniert so: Der "Versender" wickelt einen länglichen Papierstreifen um einen Holzzylinder, der an allen stellen gleich dick ist. Jetzt schreibt er seine Nachricht darauf, allerdings quer über den Stab. Wenn das Papier wieder abgewickelt wird, ist auf dem Zettel nichts als eine (für die meisten Menschen) unbrauchbare Buchstaben/Zeichen-Folge.
Wie die Skytale funktioniert, findet ihr auch
hier.
Also ich hab mich jedenfalls mit dem Programm beschäftigt. Meine Idee dahinter: In ein Memo-Feld gibt man den Text ein, dann in einem SpinEdit-Feld den Abstand zwischen den Buchstaben, dann klickt man auf einen Button und im Memo2-Feld erscheint die Lösung. So erstmal grob vom Aufbau.
Für den Button habe ich die onClick-Aufgabe:
|
Quellcode
|
1
2
3
4
|
procedure TForm1.Button1Click(Sender : TObject);
begin
Memo2.Text := KryptText(Memo1.Text, SpinEdit1.Value);
end;
|
Diese bezieht sich auf die Funktion "KryptText":
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
function KryptText(AText : string; ANumber : Byte) : string;
var
Done : Boolean;
IndexA : Integer;
IndexB : Integer;
begin
Result := '';
if (AText <> '') then //bedingung nur erfüllt, wenn im feld "memo1" text vorhanden ist
begin //beginn der prozedur
for IndexA := 1 to ANumber do //pro vorgang wird +1 hinzugefügt, bis zur größe des abstands
begin
Done := IndexA > Length(AText); //"Done", wenn IndexA größer als die Textlänge ist.
IndexB := 0; //... ansonsten wird IndexB als "0" gesetzt
while not (Done) do //wenn nicht "Done", startet er
begin
Result := Result + AText[IndexB * ANumber + IndexA];
Done := ((Inc(IndexB) * ANumber + IndexA) > Length(AText));
end;
end;
end;
end;
|
ich hab oben ein paar kommentare (vielleicht etwas schwachsinnig)
und hier liegt auch schon mein Problem. Es ist ein Fehler vorhanden, es wird angezeigt:
[Fehler] skyt.pas(46): Operator ist auf diesen Operandentyp nicht anwendbar
das ist die Zeile ganz unten:
|
Quellcode
|
1
|
Done := ((Inc(IndexB) * ANumber + IndexA) > Length(AText));
|
Hier ist der Fehler. Der Curser springt direkt hinter das +.
Ich wollte erreichen, dass das proggi dem IndexB jeweils eins hinzufügt und somit bei Textende abbricht, um dann wieder um eine Stelle verrückt neuzustarten, bis alles so fertig ist.
Es wäre jedenfalls toll, wenn mir jemand sagen könnte, wo das problem liegt.
Da ich kein Delphi-Freak bin, würde ich auch gerne wissen, was ich denn anders machen muss. Im anderen Forum haben die immer nur gesagt: "Das ist falsch, guck in der Hilfe nach", anstatt den richtigen code aufzuschreiben. Ich wäre euch sehr dankbar!
Ganz liebe Grüße,
Santa