Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: AnnoZone Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

Santa

Schatzjäger

  • »Santa« ist der Autor dieses Themas

Beiträge: 1 355

Registrierungsdatum: 28. August 2004

  • Nachricht senden

1

Mittwoch, 8. September 2004, 14:32

Problem mit Delphi: Skytale-Dechiffrierer

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:

Zitat


[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

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Santa« (12. September 2004, 16:48)


Santa

Schatzjäger

  • »Santa« ist der Autor dieses Themas

Beiträge: 1 355

Registrierungsdatum: 28. August 2004

  • Nachricht senden

2

Sonntag, 12. September 2004, 16:48

*beitrag editiert* :D

Bomi

Meister der Kleintools

Beiträge: 3 175

Registrierungsdatum: 2. Mai 2003

  • Nachricht senden

3

Montag, 13. September 2004, 05:55

RE: Problem mit Delphi: Skytale-Dechiffrierer

Zitat

Original von Santa

Hab schon ewig nix mehr mit Delphi gemacht (damals hieß das noch "TurboPascal für Windows, dann nochmal Version 2 oder 3 probiert, aber immer wieder bei VB gelandet ;) ) - kann Dir deshalb nur mal so meine Gedanken als Anregung aufschreiben...

Zitat

Quellcode

1
           Done  := ((Inc(IndexB) * ANumber + IndexA) > Length(AText));

Hier ist der Fehler. Der Curser springt direkt hinter das +.

Also ich glaube, das mit dem "Inc()" solltest Du erstmal in eine eigene Anweisung packen, um die boolsche Auswertung etwas zu entzerren - "IndexB" muss ja sowieso bei jedem Durchlauf eins hoch. Bleibt

Inc(IndexB);
Done:= (IndexB * ANumber + IndexA) > Length(AText));

Und da seh ich eine fehlende Klammer (grandiose Formulierung :D). IMHO sollte das dann so aussehen:

Done:= ( (IndexB * ANumber + IndexA) > Length(AText) );
  ATH, Bomi

Contests: 2008 BEC BOC 1602 | 2007 BEC BOC | 2006 BEC BOC | 2005 BEC BOC | 2004 BEC

ANNOTunesANNOToolsMetropolaris, Georgolaris1602-Zeugs1503-SzenarienDieter's 1503-Editor

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Bomi« (13. September 2004, 05:57)


Santa

Schatzjäger

  • »Santa« ist der Autor dieses Themas

Beiträge: 1 355

Registrierungsdatum: 28. August 2004

  • Nachricht senden

4

Montag, 13. September 2004, 13:23

*JUUUCHU!!! ES LÄUFT!!!*

*tausend mal umarm und durch die luft spring*

DANKE!!!
(kann geschlossen werden)

/edit by robinson/ als threadstarter hättest du auch selber schließen können. ;)

closed