Hilfe zu Pascal (Delphi)

Knochenkeule

Hausbruder
Moin, moin.

Ich habe gerade in der Schule eine Aufgabe bekommen. Das Thema ist Kryptologie.
Dazu sollen wir in Delphi ein Programm schreiben.

Meine Verfahren ist das Blockchiffrierverfahren oder auch Transposition.

Ich habe bereits ein Programm, das mit einem Verschiebungsverfahren arbeitet. Dies soll auf das Blockchiffrierverfahren umgestellt werden.
Der Quelltext ist unten in einem Spoiler, die (meiner Meinung nach wichtigen) Bereiche habe ich farblich markiert.

Die Aufgabe habe ich hier noch einmal:
Ersetzen sie das im Programm benutzte Verfahren durch ein Versetzungsverfahren: das Blockchiffrierverfahren. Der zu verschlüsselnde Text wird als Block mit vorgegebener Breite aufgeschrieben. Danach wird der Text spaltenweise als Geheimtext ausgegeben. Als Beispiel wählen wir: "Delphi hat sich im Unterricht bewährt!" Als Blockbreite wird "9" gewählt.

Wir schreiben den Text als Block...

Delphi h
at sich i
m Unterri
cht bewäh
rt!

...und erhalten als Geheimtext ...

Damcret htl Ut!psn hitb icee hrw rä hiih

Realisieren sie das Verfahren.

Theoretisch habe ich das Verfahren verstanden, nur die Umsetzung ist das Problem.

Mein bisheriges Programm läuft mit einem Menu, in dem man Verschlüsseln und Entschlüsseln sowie einen Schlüssel eingeben kann.
(Der Schlüssel soll beim Blockchiffrierverfahren dann für die Blockbreite verwendet werden.)

Es gibt zwei Memo-Felder. In das eine gibt man den Klartext ein, klickt im Menu auf verschlüsseln und erhält dann den Geheimtext. (Ein Screen kann ich auf Wunsch machen.)

Speicher- und Ladefunktionen sind auch mit enthalten, das ist aber eher nebensächlich.

Wäre echt super, wenn mir da jemand helfen kann, am besten mit Erklärung, ich wills auch verstehen^^

Hier ist noch der Quelltext:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, Menus, StdCtrls;

type
TForm1 = class(TForm)
SaveDialog1: TSaveDialog;
OpenDialog1: TOpenDialog;
MainMenu1: TMainMenu;
Datei1: TMenuItem;
Kodieren1: TMenuItem;
ffnen1: TMenuItem;
Speichern1: TMenuItem;
Ende1: TMenuItem;
Verschlsseln1: TMenuItem;
Entschlsseln1: TMenuItem;
Codeworteingeben1: TMenuItem;
Panel1: TPanel;
Panel2: TPanel;
Label1: TLabel;
Memo1: TMemo;
Panel3: TPanel;
Label2: TLabel;
Memo2: TMemo;
SpeichernGeheimtext1: TMenuItem;
Ende2: TMenuItem;
procedure ffnen1Click(Sender: TObject);
procedure Ende1Click(Sender: TObject);
procedure Speichern1Click(Sender: TObject);
procedure Ende2Click(Sender: TObject);
procedure SpeichernGeheimtext1Click(Sender: TObject);
procedure Verschlsseln1Click(Sender: TObject);
procedure Codeworteingeben1Click(Sender: TObject);
procedure Entschlsseln1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1: TForm1;
KTda: boolean;
GTda: boolean;
codewort: string;

implementation

{$R *.DFM}


procedure TForm1.ffnen1Click(Sender: TObject); //Klartext öffnen
begin
if OpenDialog1.Execute then
begin
Memo1.Lines.LoadFromFile(Opendialog1.Filename);
KTda:=true;
end
end;

procedure TForm1.Ende1Click(Sender: TObject); //Geheimtext öffnen
begin
if OpenDialog1.Execute then
begin
Memo2.Lines.LoadFromFile(Opendialog1.Filename);
KTda:=true;
end
end;

procedure TForm1.Speichern1Click(Sender: TObject); //Klartext speichern
begin
if SaveDialog1.Execute then
Memo1.Lines.SaveToFile(SaveDialog1.Filename);
end;

procedure TForm1.Ende2Click(Sender: TObject); //Programm beenden
begin
halt
end;

procedure TForm1.SpeichernGeheimtext1Click(Sender: TObject); //Geheimtext speichern
begin
if SaveDialog1.Execute then
Memo2.Lines.SaveToFile(SaveDialog1.Filename);
end;

procedure HoleCodewort; //Prozedur Codewort eingeben
begin
Codewort := Inputbox('Eingabe des Hauptschlüssels:','Geben sie das Geheimwort ein.','');
end;

procedure VerschluesseleKlartext; //Prozedur Klartext verschlüsseln
var s,g: String;
i,n,k,verschiebung: integer;
begin
if length(Codewort)=0 then HoleCodewort;
if length(Codewort)=0 then exit;
verschiebung := ord(Codewort[1]) mod 20;
for n := 0 to Form1.Memo1.Lines.Count do
begin
s := Form1.Memo1.Lines[n];
g := '';
for i := 1 to length(s) do
begin
k := (ord(s)+verschiebung) mod 256;
g := g + chr(k);
end;
Form1.Memo2.Lines.Add(g)
end;
end;


procedure TForm1.Verschlsseln1Click(Sender: TObject); //Klartext verschlüsseln Button
begin
KTda := Memo1.Lines.Count > 0;
if KTda then
begin
Memo2.Lines.clear;
GTda := false;
VerschluesseleKlartext;
end
else ShowMessage('Es gibt nichts zum Verschlüsseln.')
end;

procedure TForm1.Codeworteingeben1Click(Sender: TObject); //Codewort eingeben Button
begin
HoleCodewort;
end;

procedure EntschluesselseGeheimtext; //Prozedur Geheimtext entschlüsseln
var s,g: String;
i,n,k,verschiebung: integer;
begin
if length(Codewort)=0 then HoleCodewort;
if length(Codewort)=0 then exit;
verschiebung := ord(Codewort[1]) mod 20;
for n := 0 to Form1.Memo2.Lines.Count do
begin
s := Form1.Memo2.Lines[n];
g := '';
for i := 1 to length(s) do
begin
k := (ord(s)-verschiebung) mod 256;
g := g + chr(k);
end;
Form1.Memo1.Lines.Add(g)
end;
end;


procedure TForm1.Entschlsseln1Click(Sender: TObject); //Geheimtext Entschlüsseln Button
begin
GTda := Memo2.Lines.Count > 0;
if GTda then
begin
Memo1.Lines.clear;
KTda := false;
EntschluesselseGeheimtext;
end
else ShowMessage('Es gibt nichts zum Entschlüsseln.')
end;

Initialization
GTda:=false;
KTda:=false;
codewort:='';

end.
 
Leider kenn ich mich mit Delphi nicht aus, daher versuch ich es mal allgemein:

Wenn der zu kodierende Text und der Ergebnistext in einer 1 Dimensionalen Datenstruktur (einem String zum Beispiel) enthalten ist dann kannst du das so machen:

1. Du erstellst einen neuen String mit der selben Länge des Ursprungsstrings.
2. Fängst du beim ersten Zeichen an und kopierst es in den Zielstring.
3. Gehst du so viel Zeichen weiter wie groß deine Blockbreite ist (zum Beispiel 8).
4. Wiederholst du nun das ganze ab 2. (also kopieren und weitergehen) bis du irgendwann über das Ende des Ursprungsstrings hinausgehen würdest. Dabei musst du beachten dass du gleichzeitig auch eine Indexvariable für den Zielstring hast der immer um 1 weiterläuft, damit nicht alles ins erste Zeichen kopiert wird.
5. Setzt du nun die Startposition auf das 2. Zeichen anstatt wie ganz am Anfang auf das erste Zeiche des Ursprungsstrings und wiederholst das ganze wieder ab dem 2. Zeichen (also kopieren und weitergehen bis zum Ende).
6. Machst du 5. so oft wie deine Blockbreite ist.

In einer C Konsolenanwendung würde das dann zum Beispiel so aussehen, das rote ist die eigentliche Umwandlung und alles was mit // anfängt sind Kommentare damit du grob verstehst was passiert:
Code:
#include <stdio.h>



// Lediglich eine Ausgabefunktion, unwichtig fuer die Verschluesselung.
void blockausgabe(char *string, int breite)
{
    int position = 0;

    while(*string != '\0') {
        putchar(*string);

        string++;
        position++;
        if(position == breite) {
            putchar('\n');
            position = 0;
        }
    }

    if(position != 0)
        putchar('\n');
}



int main(void)
{
    char ursprung[1000];
    char ziel[1000];
    char eingabe[30];
    int laenge;
    int breite;
    int ursprungs_index;
    int ziel_index = 0;
    int startposition;



    //Ermitteln der noetigen Parameter:
    printf("Bitte geben sie den zu verschluesselnden String ein:\n");
    scanf("%999s", ursprung);

    laenge = strlen(ursprung);
    printf("Laenge = %i\n", laenge);

    printf("\nBitte geben sie die Blockbreite an: ");
    do {
        scanf("%29s", eingabe);
        breite = atoi(eingabe);
    } while(breite < 1);

    printf("\nUrsprung als Block:\n");
    blockausgabe(ursprung, breite);



[COLOR="Red"]    //Fuehre die Kopieraktion so oft wie die Blockbreite angibt durch.
    //Beginne dabei immer von einer anderen Position.
    for(startposition = 0; startposition < breite; startposition++) {
        //Fange am Anfang an, beim 1. Durchgang beim 1. Zeichen,
        //beim 2. Durchgang beim 2. Zeichen usw.
        ursprungs_index = startposition;

        //Kopiere jedes Zeichen in Blockbreitenschritten vom Ursprungs-
        //String in den Zielstring bis das Ende erreicht wird.
        while(ursprungs_index < laenge) {
            //Das eigentliche kopieren von Ursprung in Ziel.
            ziel[ziel_index] = ursprung[ursprungs_index];
            //Erhoehe den Zielindex immer um 1.
            ziel_index++
            //Erhoehe den Ursprungsindex immer um die Breite.
            ursprungs_index += breite;
        }
    }[/COLOR]

    //Schliesst den Zielstring mit einer 0 am Ende ab.
    //Setzt somit das Ende sonst wuerden noch zusaetzlich Zeichen
    //ausgegeben werden (Nullterminierte C Strings).
    ziel[ziel_index] = '\0';



    //Ausgabe des Ergebnisses.
    printf("\nZiel als Block:\n");
    blockausgabe(ziel, breite);
    printf("\nZiel als String:\n%s\n", ziel);

    //Warten am Programmende.
    getchar();
    printf("\nEingabetaste druecken um zu beenden.");

    return 0;
}

Wenn du das ganze aber als 2 Dimensionales Feld, Tabelle, Array oder wie auch immer vorliegen hast mit schon der richtigen Blockbreite, dann kannst du beim ausgeben in eine 1 Dimensionale Struktur X und Y einfach vertauschen, so dass du das primär nicht horizontal ausließt sondern eben primär vertikal ausliest.

Hoffe du kannst was damit anfangen.
 
Nicht so wirklich, leider:?

Im Grunde sollte das wohl ganz einfach gehen.
In dem Quelltext von mir sind im Verschlüsselungsteil und im Entschlüsselungsteil zwei verschachtelte for-Schleifen.
Da muss, soweit ich das mitbekommen habe, nur ein bisschen was dran geändert werden.
 
die Blockbreite beträgt ja anscheinend 9, in "Pseudo" Code sollte das ungefähr so aussehen:

Code:
String alt = "Delphi  hat sich im Unterricht bewährt!";
String neu = "";

for(i=0;i<9;i++)
  for(j=0;j<alt.length;j+9)
    neu += alt.charAt(i+j)

hab nicht getestet ... hoffe also mal da is jetzt nicht zuviel falsch dran
 
Wie gesagt, die Blockbreite wird über einen Schlüssel (=variable) bestimmt.
Den Text gibt man in ein Memofeld ein, dann kodiert man (wenn nach Start des Programms noch kein Schlüssel festgelegt wurde, kommt ein Eingabefeld).

Ansonsten sieht mir das eher nach c++ aus oder?
Beispielsweise das +=
In Pascal dürfte das wohl := entsprechen.

Auch bin ich mir nicht sicher, ob deine for-Schleifen so in Pascal hinhauen.
 
Also als kurze Fassung von "a := a + b" -> "a += b" ?

Interessant.
Das ist das Problem daran, dass unser Lehrer uns ein Buch gibt und dann sagt: Macht mal.
:roll:
 
naja statt der festen '9' kannst du auch jede andere Zahl nutzen die du dir von irgendwo einliest

bzgl meinem Code wird in der äußeren Schleife der Block von Anfang bis Ende durchgegangen (im Beispiel also 0 bis 8), in der inneren Schleife werden die Zeilen durchgegangen bis zum Textende

"a += b" ist die verkürzte Form von "a = a+b"
 
  • Like
Reaktionen: Knochenkeule
Hmm, mal sehen, ob ich das bei mir reingewurschtelt kriege^^
So einiges ist ja schon da an Variablen, das sollte eigentlich gehen, muss nur sehen, dass ich die richtig zuordne.

EDIT:
Hmm, da zeigt er mir jetzt eine Fehlermeldung an.
Er mag das mit den Klammern so nicht. Er erwartet nach dem ersten ; hinter for eine ).


Bei mir sieht das so aus:

for (n = 0;n<codewort;n++) do

Beim markierten ist die Meldung.

Übrigens:
Soll das wirklich "=" heißen? Nicht ":=" ?
 
Zuletzt bearbeitet:
Also meines ist C Code der funktioniert SO nicht in Pascal oder Delphi!
Der Pseudocode von Tommy ist auch C ähnlich, außerdem bedeutet Pseudocode dass es nicht unbedingt realer Code irgendeiner Sprache ist sondern eben nur benutzt wird um etwas allgemein in Codeform zu zeigen.
Also als kurze Fassung von "a := a + b" -> "a += b" ?

Interessant.
Das ist das Problem daran, dass unser Lehrer uns ein Buch gibt und dann sagt: Macht mal.
Genau nur bezweifel ich dass das bei Pascal oder Delphi überhaupt funktioniert, ich glaube das ist eine Eigenheit der C Syntax.

Das ganze gibts auch mit anderen Dingen, zum Beispiel:
/=
*=
usw.
Soll das wirklich "=" heißen? Nicht ":=" ?
Ja dieses = würde in Pascal oder Delphi := sein, aber das gesamte konstrukt funktioniert so in Pascal/Delphi nicht!
for (n = 0;n<codewort;n++) do
Das müsste:
for n until codewort do
oder irgendwie so ähnlich aussehen, aber wie gesagt ich kann leider nicht wirklich Pascal/Delphi.
 
Zuletzt bearbeitet von einem Moderator:
Hehe, und ich dachte in den Ferien bin ich das los.. - Ich "arbeite" in der Schule selbst mit Delphi, bin allerdings thematisch ein Jahr hinter dir schätze ich, vorausgesetzt euer Curriculum ähnelt dem meinen (sagt dir das Panelfangspiel was? *g*).

Ich kann dir auch gerade nur eingeschränkt helfen, weil ich Delphi selber nicht besitze und ein bisschen ausprobieren müsste.

Da du aber Ahnung zu haben scheinst frag ich einfach mal:
Wie greife ich auf das i-te Element der l-ten Zeile eines Memofeldes zu? Ich nehme an Memo.Lines[l] funktiniert nicht^^, im Beispiel hab ich es mit Typecasting versucht, kann aber wie gesagt nicht Ausprobieren, ob das auch geht.
Außerdem könnte es sein, dass ich "Append" nicht richtig verwendet hab, lies besser mal durch was ich da zusammengewurschtelt habe.
Und ich habe dir überlassen, wie du die Blockgröße und den Geheimtext behandelst, dir wird da schon was einfallen ;P

Code:
procedure VerschluesseleKlartext;         //Prozedur Klartext verschlüsseln
VAR i,l: Integer; Geheimtext: String;
begin
if Form1.Memo1.Lines.Count>0 then
begin
  Geheimtext:='';
  for i:=1 to Blockgroesse do             // wo auch immer du die Blockgröße hernimmst...
  begin
    for l:=0 to Form1.Memo1.Lines.Count-1 do
      Geheimtext.Append(String(Form1.Memo1.Lines[l])[i]);  // hier bin ich mir unsicher
  end
  {Was auch immer du mit dem Resultat anstellen willst
   im Moment ist Geheimtext noch eine lokale Variable...}
end
else {Kein Klartext vorhanden - Hinweis an den Nutzer o.Ä. empfohlen};
end;

Lies es dir durch und probier es aus, wenn nötig - sag mir dann bescheid, wenn du noch was brauchst, mir tut die Wiederholung auch gut merk ich grad^^
 
  • Like
Reaktionen: Knochenkeule
Hehe, und ich dachte in den Ferien bin ich das los.. - Ich "arbeite" in der Schule selbst mit Delphi, bin allerdings thematisch ein Jahr hinter dir schätze ich, vorausgesetzt euer Curriculum ähnelt dem meinen (sagt dir das Panelfangspiel was? *g*).

Ich kann dir auch gerade nur eingeschränkt helfen, weil ich Delphi selber nicht besitze und ein bisschen ausprobieren müsste.

Da du aber Ahnung zu haben scheinst frag ich einfach mal:
Wie greife ich auf das i-te Element der l-ten Zeile eines Memofeldes zu? Ich nehme an Memo.Lines[l] funktiniert nicht^^, im Beispiel hab ich es mit Typecasting versucht, kann aber wie gesagt nicht Ausprobieren, ob das auch geht.
Außerdem könnte es sein, dass ich "Append" nicht richtig verwendet hab, lies besser mal durch was ich da zusammengewurschtelt habe.
Und ich habe dir überlassen, wie du die Blockgröße und den Geheimtext behandelst, dir wird da schon was einfallen ;P




Hmm, nein, das Panalfangspiel sagt mir nichts.
Vorraus sein dürfte ich dir nicht, ich bin in in der 12. und hab dieses Jahr mit dem LK angefangen.
Ahnung, naja, so würde ich es nicht nennen^^ Interesse, ok, aber eher an anderen Themen der Informatik.

Die Blockgröße kommt durch den Schlüssel und der Geheimtext wird einfach in ein anderes Memofeld geschreiben.

Was deine Frage angeht:
Nicht wirklich eine Ahnung. Ich denke allerdings auch nicht, dass das so geht. Vielleicht irgendwas mit "of", aber wie gesagt, ich hab nicht wirklich eine Ahnung.
Unser Lehrer erklärt leider nicht wirklich was, sondern gibt uns nur Aufgaben, die wir dann selber lösen müssen.
Wer keine Ahnung von Pascal hat (ich^^), der hat Schwierigkeiten.

Vom Aussehen, ist das schonmal nicht schlecht.
Was bewirkt "Append"?
Wir haben zwar Delphi 5.0 bekommen, für schulische Zwecke, allerdings kann ich hier nicht auf die Hilfe zugreifen, das geht nur in der Schule.
 
Ich bin in der 11 und hab auch gerade erst angefangen - allerdings nur als Grundkurs.

Durch "String(Form1.Memo1.Lines[l])" sollte sich die l-te Zeile des Memos wie ein String verhalten, also glaube ich, dass wir einfach in eckigen Klammern den Index des gewünschten Elementes angeben können.
Append erweitert einen String, indem ein oder mehrere Zeichen angehängt werden - stattdessen kannst du auch
Code:
Geheimtext:=Gemheimtext+String(Form1.Memo1.Lines[l])[i]
verwenden, das wäre aber nicht so schön :p
 
  • Like
Reaktionen: Knochenkeule
Also mein Block sieht momentan so aus (Die Variablen sind etwas anders):

Code:
procedure VerschluesseleKlartext;     //Prozedur Klartext verschlüsseln
var s,g,k: String;
    i,n,breite: integer;
begin
if length(Codewort)=0 then HoleCodewort;
if length(Codewort)=0 then exit;
breite := StrToInt(codewort);
for n := 0 to breite do
begin
  s := Form1.Memo1.Lines[n];
  g := '';
  for i := 0 to Form1.Memo1.Lines.Count-1 do
    begin
      g:=g+String(Form1.Memo1.Lines[n])[i];
    end;
  Form1.Memo2.Lines.Add(g)
  end;
end;

Das Programm startet auch, aber wenn ich einen Text eingebe und dann verschlüsseln will, kommt bei mir folgende Fehlermeldung:
Im Projekt Project1.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 004484A9 in Modul 'Project1.exe'. Lesen von Adresse FFFFFFFF'. Prozeß wurde angehalten. Mit einzelnen Anweisungen oder Start fortsetzen.

Damit kann ich leider nicht wirklich was anfangen.
 
Wenn du die Zeile des Memos sowieso einer Variablen zuweist brauchst du kein Typecasting, verwende einfch g:=g+s.
Der Fehler wird dadurch aber vermutlich nicht verursacht.

for n := 0 to breite do
begin
s := Form1.Memo1.Lines[n];
^-- damit rufst du eventuell Zeilen auf, die gar nicht existieren - Die Breite gibt ja nur die Zahl der Zeichen in einer Zeile an.
Wenn du in dieser for-Schleife die Zeichen pro Zeile zählen willst musst du n auch als Index der Buchstaben in einer Zeile verwenden.
 
damit rufst du eventuell Zeilen auf, die gar nicht existieren - Die Breite gibt ja nur die Zahl der Zeichen in einer Zeile an.
Wenn du in dieser for-Schleife die Zeichen pro Zeile zählen willst musst du n auch als Index der Buchstaben in einer Zeile verwenden.

Äh, und wie hat das auszusehen? :oops:
 
Entweder du zählst in der 'äußeren' for-Schleife die Breite, das heißt die Anzahl der Buchstaben pro Zeile, wie ich es in meinem Beispiel getan habe. Dadurch würde das Programm in einer logisch leichter nachvollzeihbaren reihenfolge vorgehen, nämlich Zeile für Zeile, jeweil nur den ersten, im nächsten Durchlauf dann den zweiten usw. Buchstaben betrachtend. Der Nachteil dabei ist, dass für jeden Buchstaben eine ganze Zeile aufgerufen werden müsste - auch wenn man in so einem kleinen Programm nicht auf solche Kleinigkeiten achten muss ist es unschön (und ich will die Schul-PCs nicht überfordern ;)).
Das würde ich ungefähr so regeln:
Code:
procedure VerschluesseleKlartext;
var s,g,k:String; i,n,breite:Integer;
begin
  if length(Codewort)=0 then HoleCodewort;
  if length(Codewort)=0 then exit;           //siehe Kommentare weiter unten ;P
  breite := StrToInt(codewort);
  for i:=0 to breite-1 do
  begin
    g:='';
    for n:=0 to Form1.Memo1.Lines.Count-1 do
      g:=g+String(Form1.Memo1.Lines[n])[i];
    Form1.Memo2.Lines.Add(g);
  end;
end;

Die andere Möglichkeit besteht darin, Zeile für Zeile durch den Klartext zu gehen, dass heißt die 'äußere' for-Schleife Zählt dir Zeilen durch, während die 'innere' sich um die Buchstaben kümmert. Dabei musst du bedenken, dass du zwischen 2 Buchstaben aus einer Zeile Platz für die Buchstaben aus den anderen Zeilen lassen musst - Tommy hat das in 'Pseudocode' umgesetzt:
String alt = "Delphi hat sich im Unterricht bewährt!";
String neu = "";

for(i=0;i<9;i++)
for(j=0;j<alt.length;j+9)
neu += alt.charAt(i+j)

Der Code für Delphi würde ungefähr so aussehen:
Code:
procedure VerschluesseleKlartext;
var s,g,k:String; i,n,breite:Integer;
begin
  if length(Codewort)=0 then HoleCodewort;
  if length(Codewort)=0 then exit;         //Hier evtl noch eine Fehlermeldung an den User^^
  breite StrtoInt(Codewort);               //Dabei musst du sichergehen können, dass der User
  g:='';                                   //  nur Zahlenwerte eingibt, die eine Integer bilden
  for n:=0 to Form1.Memo1.Lines.Count-1 do //  können - insofern ist die Bezeichnung "Codewort"
  begin                                    //  vielleicht ein wenig Missverständlich.
    s:=Form1.Memo1.Lines[n];
    for i:=0 to breite-1 do g[(i*breite+n)]:=s[i];
  end;
end;
Allerdings bin ich mir in dreierlei Hinsicht nicht sicher:
Es kann sein, dass die Sache mit "i*breite+n" Schwachsinn ist, ich hab grad da grad nen Knoten im Kopf.
Zweitens weiß ich nicht, ob du auf Elemente eines Strings zugreifen kann die es gar nicht gibt. Will sagen: wenn g gleich '' gesetzt ist, kann man dann ohne weiteres g[9] verädern? (Ich hab das Gefühl Delphi ist da etwas eigenwillg^^)
Sicherlich kann man das umgehen, allerdings weiß ich nicht wie man Strings oder Arrays einer bestimmten länge Deklariert, und die einzige Möglichkeit, die mir gerade einfällt, klingt dämlich genug, um sie gar nicht erst zu erwähnen ;)
Außerdem wird es dann wieder schwieriger, den Geheimtext Zeilenweise auszugeben, wenn du das geplant hast. In dem Fall tendiere ich zur ersten Variante.


PS: ich bin mir fast sicher dass ich was vergessen hab, Ich bin während dieses Posts mehrfach unterbrochen worden oder hab ganz von selbst den faden verloren und so weiter... Wenn was fehlt oder grundfalsch ist weis mich bitte darauf hin, ich werds beheben. Und geh bloß nicht davon aus dass alles stimmt :B

PPS: Tut mir leid wenn ich dich mit der Typecasting-schreibweise "String(Memo.Lines[n])" verwirrt hab - es geht auch anders, also wenn du typecasting noch nicht kennst musst du es nicht gebrauchen.
Wenn du fragen zu einzelnen Zeilen oder Begriffen hast frag mich ruhig - ich kann wie gesagt nicht garantieren, dass alles richtig ist was ich da zusammenschreibsele.
 
  • Like
Reaktionen: Knochenkeule
Bei der ersten Variante macht er was, allerdings nicht das, was er eigentlich machen soll.

Da steht dann jedes Zeichen untereinander und die Zahl ist auf die Länge des Codeworts beschränkt.
Bei 9 schreibt er mir das:

D
e
l
p
h
i

h

Wenn ich einen höheren Wert für das Codewort eingebe (hab 100 probiert), dann nimmt er die gleiche Schreibweise, allerdings mit allen möglichen Sonderzeichen.
Das liegt wohl daran, weil der Text nur eine bestimmte Menge an Zeichen hat, was darüber hinausgeht, wird in Sonderzeichen dargestellt.

Prüfen kann ich das leider nicht, weil keine Scrollleiste an der Seite erscheint, auch wenn die Feldgröße überschritten wird.

Bei der zweiten Varinate bekomme ich die Fehlermeldung von oben
Im Projekt Project1.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 004484A9 in Modul 'Project1.exe'. Lesen von Adresse FFFFFFFF'. Prozeß wurde angehalten. Mit einzelnen Anweisungen oder Start fortsetzen.
auf die Zeile mit g[(i*breite+n)]:=s[n];

Ohne das [(i*breite+n)] nicht, aber dann kodiert er nicht wirklich was.
Bei dem Text "Delphi hat sich im Unterricht bewährt!" taucht dann nur ein "h" auf.

Und nein, Typecasting hatte ich meines Wissens noch nicht.
 
So, sorry für den Doppelpost, allerdings hauts immer noch nicht hin:?

Mir wills einfach nicht gelingen, das richtig zusammenzuschrauben.

Im Moment sieht der Quelltext so aus, für die Verschlüsselungsprozedur:

Code:
procedure VerschluesseleKlartext;     //Prozedur Klartext verschlüsseln
var s,g: String;
    i,n,breite: integer;
begin
if length(codewort)=0 then HoleCodewort;
if length(codewort)=0 then exit;
for n := 0 to Form1.Memo1.Lines.Count-1 do
s := Form1.Memo1.Lines[n];
breite := StrToInt(codewort);
g:='';
  begin
    for i := 0 to breite-1 do
      begin
        g := g + string(n+breite*i);
      end;
    Form1.Memo2.Lines.Add(g);
  end;
end;

Die Zeile mit g := g ... ist wohl immer noch nicht richtig, mal davon abgesehen, dass ich keine Ahnung habe, ob die so überhaupt Sinn macht.

Akzeptieren tut das Programm das so zwar, aber wenn ich dann einen Text verschlüsseln will, bekomme ich eine Fehlermeldung und es wird mir folgende Zeile markiert:

Code:
procedure TForm1.Verschlsseln1Click(Sender: TObject);          //Klartext verschlüsseln Button
begin
KTda := Memo1.Lines.Count > 0;
if KTda then
  begin
  Memo2.Lines.clear;
  GTda := false;
  [COLOR="Red"]VerschluesseleKlartext;[/COLOR]
  end
else ShowMessage('Es gibt nichts zum Verschlüsseln.')
end;

Es wird kein Syntaxfehler angezeigt, sondern, wenn ich mit der Maus drübergehe, angezeigt, dass die Prozedur ein nicht verfügbarer Wert ist und als andere Meldung, dass "n" nach der for-Schleife undefiniert sein kann.

Da kommt auch wieder die Adressfehler-Meldung.

Langsam tippe ich eigentlich immer nur noch Variationen der selben Sache ein und bis Donnerstag muss das ganze fertig sein.