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 Memo2.Lines[a]:=Chr(Ord(Memo1.Lines[a])+Combobox1.ItemIndex+1); 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:
wandelt einen Char in einen Int um, nach dem ASCII - Code, wenn ich mich recht erinnere
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:
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
Sorry.
Müsste aber eig. klar sein...
Marc. - Mo 22.01.07 20:47
marvin521993 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..9] of 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..9] of 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
Gausi: 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); 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 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:
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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!