Entwickler-Ecke

Sonstiges (Delphi) - Cäsar Code


marvin521993 - Mo 22.01.07 20:06
Titel: Cäsar Code
Hi

mein Problem ist folgendes:
Ich habe ein formular mit einem memo drauf und drunter eine combobox, wo man eine zahl von 1 - 25 auswählen kann.
Ich möchte nun erreichen, das der eingegebene memo text beim buttonklick verschlüsselt um soviele zeichen in einem anderen memo erscheint, wie in der combobox ausgewählt worden ist
Kann mir da jemand helfen!


DnC - Mo 22.01.07 20:09

du musst eben jedes Zeichen heraussuchen und im Caesarcode verschlüsseln... müsste doch zu machen sein.

Du kannst dazu am Besten 2 for - Schleifen verwenden, das aktuelle Zeichen mit Ord umwandeln, erhöhen und mit Chr zurückmachen... musst dir nur was einfallen lassen, um am Ende wieder vorne anzufangen, wenn du verstehst...

hoffentlich kommst du damit klar :?


marvin521993 - Mo 22.01.07 20:12

Kannst du mir da vllt ein Quelltext herrichten
sry bin noch nicht so lange mit delphi vertraut
danke


DnC - Mo 22.01.07 20:18

mal sehen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
for a:=0 to Memo1.Count do
begin
  for b:=1 to Length(Memo1.Lines[a]) do
  begin //Die For - Schleifen eben
    Memo2.Lines[a]:=Chr(Ord(Memo1.Lines[a])+Combobox1.ItemIndex+1); //oder so ähnlich
  end;

end;

Kann sein, dass ich mich in den For - Schleifen um eins vertan hab, mach ich oft. Um das Überschreiten der ASCII - Grenze zu vermeiden... lass dir selbst was einfallen. Ich will dir ja nicht den Spaß nehmen.

Zur Erklärung:

Delphi-Quelltext
1:
ord                    

wandelt einen Char in einen Int um, nach dem ASCII - Code, wenn ich mich recht erinnere


Delphi-Quelltext
1:
chr                    

macht das genau andersherum

Der Rest müsste klar sein

So in der Art KÖNNTE es klappen. Ich übernehm keine Garantie!

Edit: ansonsten würd ich einfach die Forensuche empfehlen: Suche in der Entwickler-Ecke CAERSAR


marvin521993 - Mo 22.01.07 20:43

Der hat da irgendein problem mit dem memo1.count da macht der rote balken
gibt es da keine einfache formel die immer jeden buchstaben einzeln um die in der combobox ausgewählten zahl verschlüsselt?


DnC - Mo 22.01.07 20:45


Delphi-Quelltext
1:
Memo1.Lines.Count                    


Sorry.
Müsste aber eig. klar sein...


Marc. - Mo 22.01.07 20:47

user profile iconmarvin521993 hat folgendes geschrieben:
Der hat da irgendein problem mit dem memo1.count da macht der rote balken

Es muss ja auch Memo1.lines.Count heißen ;)

//edit: Ich habe 2min getippt? Oh gott...


marvin521993 - Mo 22.01.07 20:49

Memo2.Lines[a]:=Char(Ord(Memo1.Lines[a])+Combobox1.ItemIndex+1);
In der Zeile macht er auch nen roten balken an der stelle hinter der klammer und vor dem + combobox
sry wie gesagt ich kenn mich noch nicht so gut in delphi aus


DnC - Mo 22.01.07 20:51

erstmal nur chr...

was sagt er denn?


marvin521993 - Mo 22.01.07 20:53

dann ist trotzdem noch an der stelle en fehler


DnC - Mo 22.01.07 20:55

was sagt denn der Compiler?


marvin521993 - Mo 22.01.07 20:58

wenn der compiler diese fehlermeldungen unter der unit sind, dann sagen se:
Inkompatible Typen, deklaration erwartet, aber dateiende gefunden, ';' erwartet aber'.' gefunden


Marc. - Mo 22.01.07 21:00

Fehlermeldung markieren und F1 drücken ;)


marvin521993 - Mo 22.01.07 21:04

Diese Fehlermeldung wird angezeigt, wenn der Compiler zwei kompatible (sehr ähnliche) Typen erwartet, die Typen aber tatsächlich unterschiedlich sind. Dieser Fehler kann in sehr unterschiedlichen Situationen auftreten – beispielsweise, wenn eine Read- oder Write-Klausel in einer Eigenschaft eine Methode enthält, deren Parameterliste nicht mit der Eigenschaft übereinstimmt, oder wenn ein Parameter für eine Standardprozedur oder -methode den falschen Typ hat.

Dieser Fehler kann auch auftreten, wenn in zwei Units jeweils ein Typ mit demselben Namen deklariert wird. Diese Fehlermeldung kann zudem angezeigt werden, wenn eine Prozedur aus einer importierten Unit einen Parameter mit einem gleichnamigen Typ enthält, und eine Variable eines gleichnamigen Typs an die Prozedur übergeben wird.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
unit unit1;
interface
  type
    ExportedType = (alpha, beta, gamma);

implementation
begin
end.

unit unit2;
interface
  type
    ExportedType = (alpha, beta, gamma);

  procedure ExportedProcedure(v : ExportedType);

implementation
  procedure ExportedProcedure(v : ExportedType);
  begin
  end;

begin
end.

program Produce;
uses unit1, unit2;

var
  A: array [0..9of char;
  I: Integer;
  V : ExportedType;
begin
  ExportedProcedure(v);
  I:= Hi(A);
end.


Die Standardfunktion Hi erwartet ein Argument des Typs Integer oder Word, stattdessen wird ein Array verwendet. In dem Aufruf von ExportedProcedure ist V vom Typ unit1.ExportedType, da unit1 vorher in unit2 importiert wurde. Daher tritt ein Fehler auf.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
unit unit1;
interface
  type
    ExportedType = (alpha, beta, gamma);

implementation
begin
end.

unit unit2;
interface
  type
    ExportedType = (alpha, beta, gamma);

  procedure ExportedProcedure(v : ExportedType);

implementation
  procedure ExportedProcedure(v : ExportedType);
  begin
  end;

begin
end.

program Solve;
uses unit1, unit2;
var
  A: array [0..9of char;
  I: Integer;
  V : unit2.ExportedType;
begin
  ExportedProcedure(v);
  I:= High(A);
end.


Eigentlich sollte die Standardfunktion High und nicht Hi verwendet werden. Für den aufruf von ExportedProcedure gibt es zwei alternative Lösungen. Erstens könnten Sie die Reihenfolge der uses-Klausel ändern. Dies könnte aber zu ähnlichen Fehlern führen. Eine robustere Lösung ist, den Typennamen voll mit der Unit, die den gewünschten Typ deklariert, zu qualifizieren, wie es In diesem Beispiel für die Deklaration
von V vorgenommen wurde.



Meinst du Möglicherweise das?

Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt


DnC - Mo 22.01.07 21:06

ich hatte mich geirrt... die Lösung ist etwas komplizierter, etwa so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.Button1Click(Sender: TObject);
var a,b:Integer;
    str:String;
begin
Memo2.Clear;
for a:=0 to Memo1.Lines.Count do
begin
str:='';
  for b:=1 to Length(Memo1.Lines[a]) do
  begin
    str:=str + Chr(Ord(Memo1.Lines.Strings[a][b])+1);//statt der eins das gewünschte
  end;
   Memo2.Lines.Add(str);
end;
end;


Mein Fehler war, dass Ord und Chr nur auf Chars anwendbar sind, nicht auf Strings.
Ich nehme also einen frischen String str:='';
und tue das aktuelle Zeichen (verändert dran) str:=str + Chr(Ord(Memo1.Lines.Strings[a][b])+1);
Das muss ich dann ausgeben Memo2.Lines.Add(str);

den 2. Teil musst du dir immer noch überlegen :wink:


marvin521993 - Mo 22.01.07 21:11

dann ist noch die frage wie ich verhindern kann, das der das leerzeichen auch verschlüsselt.
weil wenn ich ein leerzeichen mach und das verschlüssel wird es immer als ! dargestellt


DnC - Mo 22.01.07 21:13


Delphi-Quelltext
1:
if (not(Memo1.Lines.strings[a][b])=' ')) then [...]                    


ist doch ganz logisch, oder? Immer erst denken, dann fragen!


marvin521993 - Mo 22.01.07 21:16

muss ich die zeile die du mir eben gezeigt hast durch was ersetzen oder einfach unten drunter schreiben?


DnC - Mo 22.01.07 21:18

[edit]nein, im Ernst:

Die Zeile schaut, ob da grad ein Leerzeichen ist. Das verschlüsselst du eben nicht, sondern fügst es einfach so an... sie reicht nicht ganz aus


Delphi-Quelltext
1:
2:
3:
  if (not(Memo1.Lines.strings[a][b]=' ')) then
    str:=str + Chr(Ord(Memo1.Lines.Strings[a][b])+1)
  else str:=str + Memo1.Lines.Strings[a][b];


marvin521993 - Mo 22.01.07 21:23

och mann ich raff dis nich der macht da jetz schon wieder ne fehlermeldung bei dem =
Operator ist auf diesen operandentyp nicht anwendbar


DnC - Mo 22.01.07 21:25

Klammer zuviel. Man kann keinen String mit nem Bool vergleichen, sry, mein Fehler.

Die letzte Version sollte gehen


marvin521993 - Mo 22.01.07 21:29

ok ne fehlermeldung zeigt der jetz nich an aber der macht immer noch dis leerzeichen verschlüsseln


DnC - Mo 22.01.07 21:31

hast du es so hier?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.Button1Click(Sender: TObject);
var a,b:Integer;
    str:String;
begin
Memo2.Clear;
for a:=0 to Memo1.Lines.Count do
begin
str:='';
  for b:=1 to Length(Memo1.Lines[a]) do
  begin //Die For - Schleifen eben
  if (not(Memo1.Lines.strings[a][b]=' ')) then
    str:=str + Chr(Ord(Memo1.Lines.Strings[a][b])+1)
  else str:=str + Memo1.Lines.Strings[a][b];
  end;
   Memo2.Lines.Add(str);
end;
end;


marvin521993 - Mo 22.01.07 21:34

ok ne jetz gehts danke schön
bis jetz macht er zwar immer nur um eins verschlüsseln selbst wenn ich drei in der combobox auswähle
was muss ichn da ändern damit dis richtig funktioniert weist du das?


DnC - Mo 22.01.07 21:38

schau mal... ich hab doch vorhin mal geschrieben, dass man die 1 ersetzen muss... wie krieg ich den Status der Combobox raus?
bzw. wie krieg ich raus, was ich brauche? Antwort: erstmal im Objektinspektor die Eigenschaften durchgehen, ob man was gebrauchen kann.
Du würdest finden: Itemindex!
-1 steht für "keine Auswahl", 0 für das 1., 1 für das 2. und so weiter.
Wenn du mit 1 angefangen hast, musst du also schreiben:

Delphi-Quelltext
1:
Combobox1.Itemindex+1                    

wohin ist klar, oder?


marvin521993 - Mo 22.01.07 21:41

ne sry das weiss ich nicht


DnC - Mo 22.01.07 21:43

statt der 1, natürlich!

bis denne mal, ich mach jetzt aus (Schule-->lernen *gähn*)


marvin521993 - Mo 22.01.07 21:44

ok tschüss


marvin521993 - Mo 22.01.07 21:49

Moment noch kurz eine frage hab ich noch
wenn ich zum beispiel 'delphi forum' verschlüsseln will, dann amcht der dis ja auch normal, wenn ich 1 auswähle

wenn ich aber 2 auswähle, dann nimmt der von '(Delphi=)Efmqij' schreibt der dann nur noch hin: fmqij das heist der nimmt den ersten buchstaben weg


marvin521993 - Mo 22.01.07 21:50

ach ne schuldige hat sich erledigt ich bin halt dumm sry


marvin521993 - Mi 24.01.07 16:06

Und wenn ich jetz machen will das der memo1change gleich den dann ins untere memo mit reinschreibt den verschlüsselten, muss ich doch schreiben:

for i := 1 to length(Memo1.Text) do
begin
Memo2.Text := Memo2.Text + char(ord(Memo1.text[i])+StrToInt(memo1.Text));
end;
end;

aber der macht dann fehler mit exception


Dragonclaw - Mi 24.01.07 16:40

Die Zeile ist ja auch falsch es muss


Delphi-Quelltext
1:
2:
3:
  if not (Memo1.Lines.strings[a][b]=' 'then
    str:=str + Chr(Ord(Memo1.Lines.Strings[a][b])+1)
  else str:=str + Memo1.Lines.Strings[a][b];


heißen.



Delphi-Quelltext
1:
2:
3:
4:
5:
for i := 1 to length(Memo1.Text) do
begin
Memo2.Text := Memo2.Text + char(ord(Memo1.text[i])+StrToInt(memo1.Text));
end;
end;


Hier ist das Problem das StrToInt.. Du hast sehr wahrscheinlich Buchstaben im Memo1 drinstehen, die können nicht in nen Integer umgewandelt werden.


ZeitGeist87 - Mi 24.01.07 16:52

Ich sag nur Forumsuche...

http://www.delphi-forum.de/viewtopic.php?t=68558

LG
Stefan