| Autor |
Beitrag |
einfach112
      
Beiträge: 168
xp
del7
|
Verfasst: Mo 16.11.09 23:39
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 Narses: Topic aus Dateizugriff verschoben am Mo 23.11.2009 um 09:30
_________________ sorry bin noob !
|
|
Chemiker
      
Beiträge: 194
Erhaltene Danke: 14
XP, Vista 32 Bit, Vista 64 Bit, Win 7 64 Bit, Win 10, Win 11
BDS 2006, RAD Studio 2009+C++, Delphi 13, VS 2010 Prof.
|
Verfasst: 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
      
Beiträge: 467
Erhaltene Danke: 17
WIN 7
NQC, Basic, Delphi 2010
|
Verfasst: Di 17.11.09 14:16
StringReplace? EInfach mal so in den Raum geworfen....und die beiden Arrays dafür natürlich
_________________ »Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: 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.
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
der organist
      
Beiträge: 467
Erhaltene Danke: 17
WIN 7
NQC, Basic, Delphi 2010
|
Verfasst: 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...
_________________ »Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: 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
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
einfach112 
      
Beiträge: 168
xp
del7
|
Verfasst: 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
_________________ sorry bin noob !
|
|
Chemiker
      
Beiträge: 194
Erhaltene Danke: 14
XP, Vista 32 Bit, Vista 64 Bit, Win 7 64 Bit, Win 10, Win 11
BDS 2006, RAD Studio 2009+C++, Delphi 13, VS 2010 Prof.
|
Verfasst: 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 
      
Beiträge: 168
xp
del7
|
Verfasst: 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
_________________ sorry bin noob !
|
|
DaRkFiRe
      
Beiträge: 526
WinXP Home & Professional
C, C++, Delphi
|
Verfasst: 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).
_________________ Lang ist der Weg durch Lehren - kurz und wirksam durch Beispiele! Seneca
|
|
einfach112 
      
Beiträge: 168
xp
del7
|
Verfasst: 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 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 : 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 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 ? ? ? ? ? ? ? ? ? ? ?
_________________ sorry bin noob !
|
|
einfach112 
      
Beiträge: 168
xp
del7
|
Verfasst: 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 !
_________________ sorry bin noob !
|
|