Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - memo auslesen (komplett)


mlhk - Do 30.04.09 21:36
Titel: memo auslesen (komplett)
hey,

also mein problem besteht dain das ich den text in einem memo auslesen möchte, allerdings ist nichr nur aus einer zeile sondern aus dem ganzen memo, memo1.text funktionier schon mal bei nur fehlernhaft, memo1.lines.add(1) auch (obwohl das auch nicht die lösung wäre) und mit ner schleife alle durch gehen würd ich gern aber da müsst ich halt auh erstmal de ganze sache für eine line hinbekommmen

danke schon mal im voraus

mfg
max


jaenicke - Do 30.04.09 21:41

Memo1.Text enthält den kompletten Text aller Zeilen. Aber inkl. der Zeilenumbrüche, wenn du es also in einer Zeile irgendwo ausgeben willst, dann klappt das so nicht, meinst du das mit "nur fehlernhaft"?

Zeig doch einmal konkret wie du es versucht hast und sag was dabei nicht klappt.


mlhk - Do 30.04.09 21:44

ja, genau dieses problem stellt sich mir, nur das ich das mit den zeilenumbrüchen nicht wusste, also wie umgeh ich das, kannn ich die suchen und raus löschen oder geht das einfacher


jaenicke - Do 30.04.09 21:59

Wenn du den Text ohne die Zeilenumbrüche brauchst, dann kannst du die so entfernen:

Delphi-Quelltext
1:
DeinTextString := StringReplace(Memo1.Text, #13#10' ', [rfReplaceAll]);                    
Aber dir muss natürlich klar sein, dass dies zur Speicherung z.B. wenig geeignet ist, da die Zeilenumbrüche so natürlich komplett weg sind. (Was du vor hast, hast du ja nicht geschrieben. ;-))


mlhk - Do 30.04.09 22:03

also zum verwendungszweck, ich will damit eine xor verschlüsselung machen und dazu muss ich natürlich den text erstmal in eine variable speichern


jaenicke - Do 30.04.09 22:18

Bei der Verschlüsselung stören doch die Zeilenumbrüche nicht, und in der Variable drin steht ja der ganze Text inkl. der Zeilenumbrüche.

Aber es wäre doch sehr schlecht, wenn du einen Text verschlüsselst und nach der Entschlüsselung plötzlich die Zeilenumbrüche weg wären. ;-)


mlhk - Do 30.04.09 22:22

stimmt schon, aber ich verschlüssel ja jedes zeichen, was das mit den zeilenumbrüchen etwas ungünstig gestaltet


jaenicke - Do 30.04.09 22:25

Ja, du musst doch jedes Zeichen verschlüsseln, dazu zählen auch Leerzeichen, Kommata, Zeilenumbrüche (Zeichen 13 und 10 nacheinander), ... :gruebel:


mlhk - Do 30.04.09 22:26

ich hab mir das ja auch alles so gedacht, aber irgendwie will das bei mirmit dem memo nicht richtig


jaenicke - Do 30.04.09 22:29

Ohne Quelltext kann aber auch niemand etwas dazu sagen warum das nicht klappt. :nixweiss:


mlhk - Do 30.04.09 22:35

ja klar, ich hab da bloss noch paar wirklich große probleme drin, ich schreib den morgen abend rein, okay

tut mir leid, das kommt jetzt komisch aber ich den hier wenigstes aus führbar reinstellen

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

also ich hab hier mal den code

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:
function a (text:string;schlüssel:string) :char ;
var code,key,i :integer;
var ent:char;
begin
  code:= ord (text);
  key:= ord (schlüssel);
  ent:= char (code XOR key);
  a:=ent;
end;

procedure TForm2.Button1Click(Sender: TObject);
var key,V,text : string;
var b,i : integer;
begin
text:= edit4.text;
key:= edit3.text;
b:= length (text);
V:='';
for I := 0 to b do   begin
V:= a (text[i],key);
edit5.Text:=V;
end;
end;
hab jetzt nochmal dereinfach halthalber editfelder benutzt, vom compiler kommt kein porblem, esfunktioniert halt bloss nicht

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


JayEff - Fr 01.05.09 02:27

Also zu allererst mal benenn die Funktionen und Variablen gescheit, da blickt ja niemand mehr durch :shock: Dann könnte man den Code noch ein bisschen formatieren, damit man ihn auch lesen kann ...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
function a(text, key: Char): char;
begin
  Result := Char(Ord(text) xor Ord(key));
end;

procedure TForm2.Button1Click(Sender: TObject);
var 
  V, text: string;
  key: Char;
  i: integer;
begin
  text := Edit4.text;
  key := Edit3.text[1]; //Ich wähle den ersten Buchstaben des Edits, da wir ja sowieso 
                        //nur mit 1 Zeichen als Schlüssel arbeiten können
  V := '';
  for i := 0 to Length(text) do
    V := V + a(text[i], key);

  Edit5.Text := V;
end;

Und schon erkennt man einen Fehler, es ist natürlich unsinnig, dem Edit in der Schleife eine Zuweisung zu machen. Ausserdem wird der Inhalt von V immer wieder überschrieben, statt neuer hinzugefügt.
Richtig wäre die Zeile also V := V + a(text[i], key); und hinter der Schleife dann Edit5.Text := V;
Weiter: Der Compiler wird sich sehr wohl beschweren, bei dem, was du geschrieben hast. Ord akzeptiert nur Chars, du gibst Ord aber einen String. Da knallt's natürlich. Ich hab daher deine funktion "a" ( :roll: ) etwas umgeschrieben... und bei der Gelegenheit auch den Rest vom Code aufgeräumt ;)
Ein weiteres Problem bei der xor-Verschlüsselung: Es können bei der Berechnung Steuerzeichen herauskommen die die Anzeige in einem Edit oder Memo unmöglich machen. Am besten verschlüsselst du direkt in eine Datei.


jaenicke - Fr 01.05.09 02:36

user profile iconJayEff hat folgendes geschrieben Zum zitierten Posting springen:
Ein weiteres Problem bei der xor-Verschlüsselung: Es können bei der Berechnung Steuerzeichen herauskommen die die Anzeige in einem Edit oder Memo unmöglich machen. Am besten verschlüsselst du direkt in eine Datei.
Dazu gibt es hier eine Lösung, man kann das ganze ja noch weiterverarbeiten:
http://www.delphipraxis.net/topic30831.html


mlhk - Fr 01.05.09 13:35

ja das hab ich mir auch schon mal angeschaut aber mein code muss doch auch funktionieren, ich will den halt später noch ausbauen mit nem spezielle konzept un da muss ich das mit den memofeldern vorfallemhinbekommen und wenn noh nicht mal das mit editfelder fuktioniert, aber nun gut ich bräucht halt wirklich noch ne lösng die memofelder

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

ah gut danke, der code geht jetzt sehr gut


mlhk - Sa 02.05.09 16:54

also soweit bi ich jetzt: xor funktioniert aber liefert mir komische zeichen, ich hab jetzt noch eingebau das er nicht nur einen buchstaben sondern ein ganzes wort als schlüssel verwende kann:

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:
function a(text: Char;key:string): char;
begin
  Result := Char(Ord(text) xor Ord(key));
end;

procedure TForm2.Button1Click(Sender: TObject);
var
  V, text: string;
  key: string;
  i,j: integer;
begin
  memo1.Clear;
  text := memo2.text;
  key := edit3.text;
  V := '';
  for i := 0 to Length(text) do
  begin
  for j := 0 to length(key) do
    begin
    V := V+ a(text[i], key[j]);
    Application.ProcessMessages;
    ProgressBar1.Position := i+j;
        ProgressBar1.Update;
    memo1.Text := V;
        end;
      end;
  end;
zudem habe ich noch eine progressbar eingebaut,die im moment zwar auch funktioniert sich aber nicht vollkommen läd

mfg
max

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


JayEff - Sa 02.05.09 17:55

user profile iconmlhk hat folgendes geschrieben Zum zitierten Posting springen:
also soweit bi ich jetzt: xor funktioniert aber liefert mir komische zeichen, ich hab jetzt noch eingebau das er nicht nur einen buchstaben sondern ein ganzes wort als schlüssel verwende kann:
Der Code funktioniert so nicht. Dass xor dir "komische Zeichen" liefert ist ja wohl ganz normal :nixweiss: ist ja eine Verschlüsselung. Ausserdem:

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconJayEff hat folgendes geschrieben Zum zitierten Posting springen:
Ein weiteres Problem bei der xor-Verschlüsselung: Es können bei der Berechnung Steuerzeichen herauskommen die die Anzeige in einem Edit oder Memo unmöglich machen. Am besten verschlüsselst du direkt in eine Datei.
Dazu gibt es hier eine Lösung, man kann das ganze ja noch weiterverarbeiten:
http://www.delphipraxis.net/topic30831.html


Ich hab in einem anderen Topic geschrieben, wie man ein Wort als Schlüssel verwenden kann, ich kopiers mal hier rein:

user profile iconJayEff hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
function crypt(Klartext, Schluessel: Char): Char;
begin
  Result := Char(Ord(Klartext) xor Ord(Schluessel));
end;

var
  Mapdatei: String;
  Key: String;
  i, KeyLength : Integer;
begin
  Key := 'MeinGeheimerSchlüssel';
  KeyLength := Length(Key);
  for i := 1 to Length(Mapdatei) do
    Mapdatei[i] := crypt(Mapdatei[i], Key[(i mod Keylength) + 1]);  //Ent- und Verschlüsseln geht auf die gleiche Art

Zur Erklärung: der Modulo Operator teilt durch KeyLength und gibt den Rest der Teilung zurück, wenn dieser kleiner ist als Keylength. An sonsten teilt er nochmal. Aus 5 mod 3 wird also 2, 100 mod 20 = 0, etc. In unserem Fall nutze ich mod um dafür zu sorgen, dass er nicht versucht, über den rechten oder linken Rand von Key hinaus zugehen. i mod KeyLength sollte Werte zwischen 0 und KeyLength - 1 ausgeben. Darum addiere ich noch eine 1 drauf. Nun verschlüsselt der Algorithmus ganz nach dem Vigenère Schema:

Quelltext
1:
2:
3:
Schlüssel: blablablabl
Klartext : huhu *freu*
Code     : wasauchimme

(Nein, unter Code steht NICHTS was ich ernsthaft verschlüsselt hab :mrgreen: Da war ich zu faul.)


mlhk - Sa 02.05.09 22:25

also nochmal zu komische zeichen, mir ist schon klar das bei der ausgabe dann nicht das gleiche steht wie bei der eingabe aber das

Quelltext
1:
⿜「㋜⿜⿴㋜⾦⾎㊦⾦⾎㊦⾩⾁㊩⾩⾁㊩⿼⿔㋼⿼⿔㋼⾪⾂㊪⾪⾂㊪⾹⾑㊹⾹⾑㊹⾮⾆㊮⾮⾆㊮⾯⾇㊯⾯⾇㊯⾿⾗㊿⾿⾗㊿⾴⾜㊴⾴⾜㊴⾰⾘㊰⾰⾘㊰⼠⼈㈠⼠⼈㈠⾯⾇㊯⾯⾇㊯⾯⾇㊯⾯⾇㊯⾹⾑㊹⾹⾑㊹⾰⾘㊰⾰⾘㊰⾲⾚㊲⾲⾚㊲⾸⾐㊸⾸⾐㊸⾹⾑㊹⾹⾑㊹⾮⾆㊮⾮⾆㊮⿼⿔㋼⿼⿔㋼⾈⾠㊈⾈⾠㊈⾹⾑㊹⾹⾑㊹⾤⾌㊤⾤⾌㊤⾨⾀㊨⾨⾀㊨⿼⿔㋼⿼⿔㋼⿑⿹㋑⿑⿹㋑⿖⿾㋖⿖⿾㋖                    
ist halt irgendwie shcon komisch zudem wenn ich erneut auf start klicke ändert sich dieseausgabe, bis sie nach dreimaligem klicken wieder hier ankommt

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:
ich hab mich jetzt nochmal bemüht meinen code etwas zu strukturieren
function xorfunktion (text: Char;key:string): char;
begin
  Result := Char(Ord(text) xor Ord(key));
end;

procedure TForm2.Button1Click(Sender: TObject);
var
  V, text: string;
  key: string;
  i,j: integer;
begin
    memo1.Clear;
    text := memo2.text;
    key := edit3.text;
    V := '';
  for i := 0 to Length(text) do
      begin
          for j := 0 to length(key) do
            begin
                V := V+ xorfunktion (text[i], key[j]);
                  Application.ProcessMessages;
                  ProgressBar1.Position := i+j;
                  ProgressBar1.Update;
                memo1.Text := V;
                end;
      end;
  end;

und ordentliche funktionisnamen zu vergeben

mir stellt sich halt immer noch das problem mit der progressbar die füllt sich immer nur bis zur hälfte und vorallem das problem mit ord und char weil das ja mit string nicht geht als am liebsten würd ich ja ein memo benutzten aber mir stellt sich halt immer das problem mit edit3.text was ja eigendlich nicht funktioniert

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


JayEff - Sa 02.05.09 22:28

Du hast nur eine einzige Zeile meines Posts durchgelesen, oder? :roll: Ließ ihn mal ganz, vorallem die Stelle, an der ich dir korrekten Code zum Verschlüsseln schon fast Copy-Paste bereit liefere.


mlhk - Sa 02.05.09 22:40

naja als soweit ich das sehe hast du das rekursiv gemacht, das habe ich nicht und hab eich ach eigendlich nicht vor undirgendwie scheint mir als würdest d meine postsnicht ganz durchlesen denn also das von wegen progressbar und memo problem stellt sich bei ganz anders als bei dir


jaenicke - Sa 02.05.09 22:46

user profile iconmlhk hat folgendes geschrieben Zum zitierten Posting springen:
naja als soweit ich das sehe hast du das rekursiv gemacht
Wo? :shock:

user profile iconmlhk hat folgendes geschrieben Zum zitierten Posting springen:
function xorfunktion (text: Char;key:string): char;
begin
Result := Char(Ord(text) xor Ord(key));
end;
user profile iconJayEff hat folgendes geschrieben Zum zitierten Posting springen:
Ord akzeptiert nur Chars, du gibst Ord aber einen String.


mlhk - Sa 02.05.09 22:56

Mapdatei[i] := crypt(Mapdatei[i], rekursiv

ord und char edit3.text ist string ich will ja nciht mit nur einen buchstaben verschlüssen sondern mit einen ganz wort (also nicht edit.text[1] was char wäre) also wie löse ich das, am besten mit memo memo.text wäre auchstring also wie macheich char mit dem ganzen wort?


jaenicke - Sa 02.05.09 23:12

user profile iconmlhk hat folgendes geschrieben Zum zitierten Posting springen:
Mapdatei[i] := crypt(Mapdatei[i], rekursiv
Das ist doch nicht rekursiv, es wird doch nur einmal crypt aufgerufen, darin wird aber nicht erneut crypt aufgerufen. Das wäre Rekursion. :gruebel:

user profile iconmlhk hat folgendes geschrieben Zum zitierten Posting springen:
ord und char edit3.text ist string ich will ja nciht mit nur einen buchstaben verschlüssen sondern mit einen ganz wort
Naja, aber du musst das ja trotzdem zeichenweise machen, egal wie genau...


JayEff - So 03.05.09 03:35

user profile iconmlhk hat folgendes geschrieben Zum zitierten Posting springen:
ich will ja nciht mit nur einen buchstaben verschlüssen sondern mit einen ganz wort
Und immernoch hast du meinen Post nicht durchgelesen :roll:

user profile iconmlhk hat folgendes geschrieben Zum zitierten Posting springen:
von wegen progressbar
:roll: Also ganz copy-paste-fähigen Code liefer ich dir auch nicht, wenn du sowas willst, zahlst du mir Geld dafür. Ich wende hier meine Freizeit auf um Leuten Lösungen zu ihren Problemen anzubieten, nicht um Leuten ihre Programme zu schreiben.

Ich finde, du kriegst es auch selber hin, in die For-Schleife eine Zuweisung für die Progressbar reinzuschreiben und dass die String-Variable Mapdatei natürlich mit deinem Klartext ersetzt werden muss, ist irgendwie selbstverständlich.

Dass ich nirgens Rekursion anwende hat jaenicke schon deutlich gemacht. http://de.wikipedia.org/wiki/Rekursion

Und Last but not Least, ich glaube, du verstehst nicht, was eine polyalphabetische Verschlüsselung ist. Dazu hab ich auch schon was in dem Post geschrieben, den du so konsequent vermeidest zu lesen:

Quelltext
1:
2:
3:
Schlüssel: blablablabl
Klartext : huhu *freu*
Code     : wasauchimme
Hierbei ist das Schlüsselwort "bla". Es wird über den Text gelegt und wiederholt, bis man für jeden Buchstaben des Klartexts einen Schlüsselbuchstaben hat. Nun wird jeder Klartextbuchstabe mit dem dazugehörigen Schlüsselbuchstaben ver-xor-t.
Theoretisch könnte man auch jeden Buchstaben des Klartext mit einem "Wort" verschlüsseln, aber das wäre natürlich unsicherer, da man dann eine monoalphabetische Verschlüsselung vorliegen hat und diese lässt sich über eine simple Häufigkeitsanalyse in 5 Minuten knacken. Bei einer Polyalphabetischen braucht man wenigstens einen hinreichend langen Text und 20 Minuten :roll:


mlhk - So 03.05.09 09:27

das mit dem ord meine ich eben auch, ich weiß jetzt nur nicht wie das machen soll, da ich ja xor mit einen ganzen wort alsschlüssel machen will also edit3.text ist string
edit3.text[1]ist char nur halt nicht das ganz wort (nun de frge wie das geht) zudem schwebte mir eigendlich noch ein memofeld vor (daher auch die Überschrift),


jaenicke - So 03.05.09 09:44

Ja, wie schon mehrfach gesagt musst du das in einer Schleife machen und dabei dir Buchstaben einzeln durchgehen...