Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Buchstaben in Edit verändern !?


einfach112 - Mo 16.11.09 23:39
Titel: Buchstaben in Edit verändern !?
Hallo ! ich suche nach einer möglichkeit einen Text der in einem Editfeld steht nach einem Button klick zu ändern und zwar folgend....

edit1.text='Hallo'

TForm1.Button1Click(Sender: TObject);
begin....
und jetzt kommt die frage ! wie kann eine eine Kette von Zeichen/Zahlen/sonderzeichen vorgeben die in einer festen zweiten kette verändert werden !

also ich würde gerne Sagen ....

(abcdefghijklmnopqrstuvwxyz1234567890-.,;:_ABCDEFGHIJKLMNOPRRSTUVWXYZ)
(d,;efghRSijXYZtuyz2314KPB5678vw-._AMNOG:klmnabcpsVWHIFJCDEqroLRTUx90)

wenn eines der in den Klammern stehende zeichen kommt der ersetze dieses mit dem zeichen das in klammer 2 an der gleichen stelle kommt .....
das würde hier in diesem beispiel hier heissen :
Hallo =
VdXXt
Ich möchte keine codierung im Sinne von rot13 oder sonstige Codierungsarten ! nur diese wie oben vorgegeben ! ?

kann mir da jemand weiter helfen !?
(es werden nur kurze wörter geändert bis maximal 30 zeichen .... das heisst es währe auch kein problem wenns länger dauern würde ..... ist halt nicht viel text ......
Bin wie immer über hilfe sehr DANKBAR !
mfg
einfach112


Moderiert von user profile iconNarses: Topic aus Dateizugriff verschoben am Mo 23.11.2009 um 09:30


Chemiker - Di 17.11.09 00:11

Hallo,

nur mal so als Idee. Wenn Du 2 Arrays anlegst für die beiden Zeichenfolgen in der gleichen Reihenfolgen und dann mit dem Index der erste auf dem zweiten Array zugreifst.

Zuvor den original String zerlegen Index suchen und dann mit dem Index in dem zweiten Array den String neu zusammensetzen.

Bis bald Chemiker


der organist - Di 17.11.09 14:16

StringReplace? EInfach mal so in den Raum geworfen....und die beiden Arrays dafür natürlich


elundril - Di 17.11.09 16:02

das blöde in diesem fall bei einem stringreplace ist, wie merkst du dir die schon ersetzten zeichen? Demnach wäre mMn das beste den String Sequenziel durchlaufen zu lassen und jedes Zeichen einzeln zu ersetzen. hat zwar ne blöde laufzeit aber mit fällt grad nix besseres ein.


der organist - Di 17.11.09 17:06

naja, kannst ja jedes Zeichen mit ner for-schleife durchgehen und ändern, wenn nötig. Da is es doch nich nötig, zu wissen, welches du schon geändert hast, du gehst doch sowieso jedes genau einmal durch...


elundril - Di 17.11.09 17:12

schau mal:

du änderst f auf g zum beispiel. dann wenn du g auf s ändern willst, nimmst du ja die ursprünglichen fs auch wieder mit. das heißt du hast dann f -> g -> s. anders gesagt, dir gehen einige zeichen verloren.

und stringreplace ersetzt nun mal alle vorkommen von g in einem text, egal ob die vorher f waren oder nicht.

lg elundril


einfach112 - Do 19.11.09 00:46

Hallo !
Danke für euren vielen antworten und Ideen .....

Chemiker...
das hört sich gut an was du schreibst .... leider fehlt mir dazu etwas das hintergrundwissen .... könntest du mir vieleicht ansatzweise etwas quellcode liefern ! ?

Währe sehr nett von dir !
thx schonmal im voraus !
mfg
einfach112


Chemiker - Do 19.11.09 23:34

Hallo einfach112,

einfach112 hat folgendes geschrieben:
das hört sich gut an was du schreibst .... leider fehlt mir dazu etwas das hintergrundwissen .... könntest du mir vieleicht ansatzweise etwas quellcode liefern ! ?


Es ist ein einfache Umsetzung und nicht auf Geschwindigkeit getrimmt sollte aber funktionieren.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
function CodeErstellen(sOrignal, sCode, sText: String): String;
var
  iz: integer;
  iz1: integer;
  chCode: Char;
begin
  for iz := 1 to length(sText) do
  begin
    iz1:=0;
    for chCode in sOrignal do
    begin
      inc(iz1);
      if chCode=sText[iz] then
      begin
        Result:= Result+ sCode[iz1];
      end;
    end;
  end;
end;

Und so wird die Funktion aufgerufen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Button1Click(Sender: TObject);
var
  strOrignal: String;
  strCode, strO: String;
  strOriginalText: String;
begin
  strOrignal:=('abcdefghijklmnopqrstuvwxyz1234567890-.,;:_ABCDEFGHIJKLMNOPRRSTUVWXYZ');
  strCode:=   ('d,;efghRSijXYZtuyz2314KPB5678vw-._AMNOG:klmnabcpsVWHIFJCDEqroLRTUx90');
  Edit1.Text:= CodeErstellen(strOrignal, strCode, Edit1.Text);
end;

Bis bald Chemiker


einfach112 - So 22.11.09 01:36

Hallo ! Danke für deine tolle antwort....Nur leider bekomme ich beim compilieren folgende fehlermeldung :


[Fehler] Unit1.pas(43): Operator ist auf diesen Operandentyp nicht anwendbar
das ist folgende zeile der function :
for chCode in sOrignal do


was nun !?
mfg
einfach112


DaRkFiRe - So 22.11.09 02:28

Damit das Problem aufgenommen und verstanden werden kann, hier mal kein Source zum Copy&Paste-Vergewaltigen, sondern eine Beschreibung zur Problemlösung:

Q ... Quell-String (lies: zu verschlüsselnde Eingabe)
R ... Ziel-String (lies: verschlüsselte Ausgabe)
V ... Hilfsvektor mit 256 Elementen vom Typ Byte
K1 ... Quell-Schlüssel (hier: strOriginal)
K2 ... Ziel-Schlüssel (hier: strCode)
Ai ... ASCII Code von K1 an der Stelle i (mittels 'Ord'-Funktion)
Bi ... ASCII Code von K2 an der Stelle i (dito)
Qj ... ASCII Code von Q an der Stelle j (dito)
i ... Iterator-Variable
j ... Iterator-Variable
n ... Länge von K1 (bzw. K2 da |K1|=|K2| - die Längen sind identisch)
m ... Länge von Q

Relation im Hilfsvektor aufbauen

für alle i=1..n
V[Ai] = Bi

Relation benutzen, um Ziel-String zu erzeugen

für alle j=1..m
R = R + V[Qj]

V[Qj] ist nur für Zeichen Qj definiert, die in K1 vorkommen.

Es ist ratsam, den Hilfsvektor vor der Relationsbildung zu initialisieren (beispielsweise mit Leerzeichen).

Das o.g. Prinzip ähnelt einer S-Box, mit dem Unterschied, dass S-Boxen bijektiv (also eineindeutig sind).


einfach112 - So 22.11.09 02:59

ok ! also für die die doch etwas an quelltext brauchen die vieleicht auch noch wie ich d7 verwenden ....


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
function CodeErstellen(sOrignal, sCode, sText: String): String;
var
  iz: integer;
  iz1: integer;
  chCode: char;
  x:integer;
begin
for iz := 1 to length(sText) do
 begin
    iz1:=0;
  //   for chCode in sOrignal do
  for x := 1 to length(sOrignal) do
    begin
    chCode := SOrignal[x];
      inc(iz1);
      if chCode=sText[iz] then
      begin
        Result:= Result+ sCode[iz1];
      end;
    end;
  end;
end;






aber habe immer noch ein klitze kleines problem !
....
mein text komplett sieht nun so aus :

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:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
function CodeErstellen(sOrignal, sCode, sText: String): String;
var
  iz: integer;
  iz1: integer;
  chCode: char;
  x:integer;
begin
for iz := 1 to length(sText) do
 begin
    iz1:=0;
  //   for chCode in sOrignal do
  for x := 1 to length(sOrignal) do
    begin
    chCode := SOrignal[x];
      inc(iz1);
      if chCode=sText[iz] then
      begin
        Result:= Result+ sCode[iz1];
      end;
    end;
  end;
end;



procedure TForm1.Button1Click(Sender: TObject);

var
  strOrignal: String;
  strCode, strO: String;
  strOriginalText: String;
begin
  strOrignal:=('abcdefghijklmnopqrstuvwxyz1234567890-.,;:_ABCDEFGHIJKLMNOPRRSTUVWXYZ');
  strCode:=   ('d,;efghRSijXYZtuyz2314KPB5678vw-._AMNOG:klmnabcpsVWHIFJCDEqroLRTUx90');
  Edit2.Text:= CodeErstellen(strOrignal, strCode, Edit1.Text);
end;






procedure TForm1.Button2Click(Sender: TObject);
var
  strOrignal: String;
  strCode, strO: String;
  strOriginalText: String;
begin
strCode     :=('abcdefghijklmnopqrstuvwxyz1234567890-.,;:_ABCDEFGHIJKLMNOPRRSTUVWXYZ');
strOrignal  :=('d,;efghRSijXYZtuyz2314KPB5678vw-._AMNOG:klmnabcpsVWHIFJCDEqroLRTUx90');
  Edit3.Text:= CodeErstellen(strOrignal, strCode, Edit2.Text);
end;



end.




wenn ich nun im ersten editfeld anna eingebe und klicke button 1 steht im edit 2 feld : dZZd
das ist auch richtig !
wenn ich dann auf button2 klicke steht im edit 3 auch wieder anna ! Super !

wenn ich allerdings z.B. im edit 1 feld ha eingebe dann steht im edit2 feld : Rd ist auch richtig ! aber wenn ich dann wieder auf button2 klicke steht im edit3 feld auf einfmal : hUa.....

wie kommt der auf einmal an das grosse U ? ? ? ? ? ? ? ? ? ? ?


einfach112 - So 22.11.09 04:45

wobei .... hat sich auch erledigt .....
habe oben die zeichenfolgen nicht richtig gehabt ! einfach nochmal neu geschrieben und alles läuft ! THX !