![]() |
Eigene kleine Verschlüsslung
Hey Leute ich wollte mir eine eigene, kleine Verschlüsslung von Datein schreiben.
Ich habe bis jetzt das:
Delphi-Quellcode:
Mir sagt Delphi "[Fehler] Unit1.pas(73): Der linken Seite kann nichts zugewiesen werden" aber wieso ?
for i := 0 to Memo1.Lines.Count -1 do
begin Edit2.text:=Memo1.lines[i]; j:=length(Edit2.text); For h := 1 to j do If Edit2.text[h]='A' Then Edit2.text[h]:='B' Else If Edit2.text[h]='B' Then Edit2.text[h]:='C' Else If Edit2.text[h]='C' Then Edit2.text[h]:='D' Else If Edit2.text[h]='D' Then Edit2.text[h]:='E' Else If Edit2.text[h]='E' Then Edit2.text[h]:='F' Else If Edit2.text[h]='F' Then Edit2.text[h]:='G' Else If Edit2.text[h]='G' Then Edit2.text[h]:='H' Else If Edit2.text[h]='H' Then Edit2.text[h]:='I' Else If Edit2.text[h]='I' Then Edit2.text[h]:='J' Else If Edit2.text[h]='J' Then Edit2.text[h]:='K' Else If Edit2.text[h]='K' Then Edit2.text[h]:='L' Else If Edit2.text[h]='L' Then Edit2.text[h]:='M' Else If Edit2.text[h]='M' Then Edit2.text[h]:='N' Else If Edit2.text[h]='N' Then Edit2.text[h]:='O' Else If Edit2.text[h]='O' Then Edit2.text[h]:='P' Else If Edit2.text[h]='P' Then Edit2.text[h]:='Q' Else If Edit2.text[h]='Q' Then Edit2.text[h]:='R' Else If Edit2.text[h]='R' Then Edit2.text[h]:='S' Else If Edit2.text[h]='S' Then Edit2.text[h]:='T' Else If Edit2.text[h]='T' Then Edit2.text[h]:='U' Else If Edit2.text[h]='U' Then Edit2.text[h]:='V' Else If Edit2.text[h]='V' Then Edit2.text[h]:='W' Else If Edit2.text[h]='W' Then Edit2.text[h]:='X' Else If Edit2.text[h]='X' Then Edit2.text[h]:='Y' Else If Edit2.text[h]='Y' Then Edit2.text[h]:='Z' Else If Edit2.text[h]='Z' Then Edit2.text[h]:='A' Else If Edit2.text[h]='a' Then Edit2.text[h]:='b' Else If Edit2.text[h]='b' Then Edit2.text[h]:='c' Else If Edit2.text[h]='c' Then Edit2.text[h]:='d' Else If Edit2.text[h]='d' Then Edit2.text[h]:='e' Else If Edit2.text[h]='e' Then Edit2.text[h]:='f' Else If Edit2.text[h]='f' Then Edit2.text[h]:='g' Else If Edit2.text[h]='g' Then Edit2.text[h]:='h' Else If Edit2.text[h]='h' Then Edit2.text[h]:='i' Else If Edit2.text[h]='i' Then Edit2.text[h]:='j' Else If Edit2.text[h]='j' Then Edit2.text[h]:='k' Else If Edit2.text[h]='k' Then Edit2.text[h]:='l' Else If Edit2.text[h]='l' Then Edit2.text[h]:='m' Else If Edit2.text[h]='m' Then Edit2.text[h]:='n' Else If Edit2.text[h]='n' Then Edit2.text[h]:='o' Else If Edit2.text[h]='o' Then Edit2.text[h]:='p' Else If Edit2.text[h]='p' Then Edit2.text[h]:='q' Else If Edit2.text[h]='q' Then Edit2.text[h]:='r' Else If Edit2.text[h]='r' Then Edit2.text[h]:='s' Else If Edit2.text[h]='s' Then Edit2.text[h]:='t' Else If Edit2.text[h]='t' Then Edit2.text[h]:='u' Else If Edit2.text[h]='u' Then Edit2.text[h]:='v' Else If Edit2.text[h]='v' Then Edit2.text[h]:='w' Else If Edit2.text[h]='w' Then Edit2.text[h]:='x' Else If Edit2.text[h]='x' Then Edit2.text[h]:='y' Else If Edit2.text[h]='y' Then Edit2.text[h]:='z' Else If Edit2.text[h]='z' Then Edit2.text[h]:='a'; |
AW: Eigene kleine Verschlüsslung
Die ganzen IF-Dinger kannst Du Dir sparen, wenn Du dir mal
![]() ![]()
Delphi-Quellcode:
i : integer;
ascii : integer; Text1 : String; Text2 : String; [...] Text2 := '': for i := 1 to Length(Text1) do Text2 := Text2 + Chr(Ord(Text1[i])+1); // Sonderfall "z" nicht berücksichtigt, nur ein Denkanstoß... [...] |
AW: Eigene kleine Verschlüsslung
Von andern Fragen, die mir bei diesem Code in den Sinn kommen, einmal abgesehen:
Was hat Dich motiviert, ein Edit-Feld als Zwischenspeicher zu verwenden? Eine lokale Variable vom Typ "String" wäre vermutlich besser geeignet und würde den von Dir beschriebenen Fehler vermutich gar nicht erst entstehen lassen. Noch ein Hinweis. Schaue Dir mal die Funktionen " ![]() ![]() //Edit: Mist, zu langsam. ;-) |
AW: Eigene kleine Verschlüsslung
Das ist das aber wieder etwas das ich nicht ganz verstehe. Ich möchte es gerne so schaffen
|
AW: Eigene kleine Verschlüsslung
Meinetwegen. :roll:
"Text" ist eine String-Property vom Edit-Feld und auf diese kannst Du nicht per Zeichen-Index schreibend zugreifen. Um eine String-Variable wirst Du nicht umhinkommen, auch wenn es Dir nicht sonderlich gefallen sollte. |
AW: Eigene kleine Verschlüsslung
Ich hab mir Chr() und Ord() mal angeguckt. Habe es glaube ich schon zu ca. 50% verstanden ;D
Sieht bei mir jetzt so aus
Delphi-Quellcode:
aber man bekommt beim Durchführen einen Zugriffsfehler bei "If (Text2<>'Z') and (Text2[h]<>'z') Then Text2:=Text2 + Chr(Ord(Text1[i])+1) Else"
procedure TForm1.Button2Click(Sender: TObject);
var i,h,j,k:integer; Text1: String; Text2: String; begin If Edit1.text<>'Keine Datei ausgewählt' Then DateiKopieren(PChar(OpenDialog1.FileName),GetTempDir + 'Premaider.txt',true); Memo1.lines.loadfromfile(GetTempDir + 'Premaider.txt'); for i := 0 to Memo1.Lines.Count -1 do begin Text2:=''; j:=length(Memo1.lines[i]); Text1:=Memo1.lines[i]; For h := 1 to j do If (Text2<>'Z') and (Text2[h]<>'z') Then Text2:=Text2 + Chr(Ord(Text1[i])+1) Else If Text2[h]='Z' Then Text2[h]:='A'; If Text2[h]='z' Then Text2[h]:='a'; end; end; |
AW: Eigene kleine Verschlüsslung
Schaue Dir an, wann Du auf die wievielte Stelle eines Strings zugreifen möchtest und ob der String dann diese Länge auch schon hat. Wenn Dein String z.B. die Zeichenfolge "Hallo" enthält, darfst Du nur auf die Positionen 1 bis 5 zugreifen. Alles andere provoziert den von Dir beobachteten Fehler.
|
AW: Eigene kleine Verschlüsslung
Fehler
|
AW: Eigene kleine Verschlüsslung
Zitat:
|
AW: Eigene kleine Verschlüsslung
TEdit.Text ist ein Property.
Property kann man entweder nur komplett auslesen oder beschreiben. (nur Objekte sind indirekt eine Ausnahme, wobei das eigentlich Zeiger sind und auch hier der Zeiger nur koplett befüllt werden kann, aber das referenzierte Objekt natürlich eigenständig ist) Edit2.Text[h] liest praktisch das Property i eine temporäre Stringvariable aus und [h] graift dann auf ein Zeichen in der Kopie zu. Lösung: Vorher .Text in eine eigene Stringvariable auslesen/kopieren, dort bearbeiten und dann am Ende komplett zurückschreiben. Bei
Delphi-Quellcode:
geben sogar uralte Delphis eine Fehlermeldung zurück, so wie du es bekommen hast, denn ein Teil-Property ist eben nicht beschreibbar.
Edit2.Text[h]
Bei Records, als Property gab es lange Zeit ein Problem, wo der Compiler früher keine Fehlermeldung ausgab und den Schreibzugriff auf die Kopie ohne Fehlermeldung zuließ, nur daß diese Änderungen eben nie im Property angekommen sind. (das hat man inzwüschen zum Glück behoben) PS: viele gleiche IFs = ein CASE Wobei ja schon angemerkt wurde, daß es hier eine regelmäßige Gesetzmäßigkeit gibt, welche man mathematisch ausnutzen kann. Aber das die Groß- und Kleinbuchstaben ordinal nicht direkt zusamenhängen, womit man es nicht zusammenhängend berechnen kann. Ein CASE über die 4 Teilbereichen ("A" bis "Y", "Z", "a" bis "y" und "z") unterteilen und jeweils eine Berechnugn dafür. :zwinker: Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz