Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Buchstaben durch Zahlen ersetzen
sourtooth - Mo 13.10.03 19:56
Titel: Buchstaben durch Zahlen ersetzen
Hallo!
Ich bin in Sachen Delphi Programmierung noch ein Anfänger, und habe mich an mein erstes Programm gemacht.
In diesem soll folgendes sofort in einem Memo Feld umgewandelt werden:
1= I/i
2 = Z/z
3 = E/e
4 = A/a
5 = S/s
6= G/g
8 = B/b
0= O/o
Und hier der bisherige Quelltext:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm1.Memo1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var SelPos: Integer; begin with TReplaceDialog(Sender) do begin SelPos := Pos(FindText, Memo1.Lines.Text); FindText := 'z'; ReplaceText := '2'; if SelPos > 0 then begin Memo1.SelStart := SelPos - 1; Memo1.SelLength := Length(FindText); Memo1.SelText := ReplaceText; end else; end; end; |
Das funzt ja soweit ganz gut, es wird aber nur z mit 2 ersetzt.
Wie bau ich die anderen Buchstaben ein, die ersetzt werden sollen?
Und wie wird die "Beachtung" der Gross/Kleinschreibung deaktiviert,sodass auch nach Z und nicht nur nach z gesucht wird?
Vielen Dank!
sourtooth
Shark - Mo 13.10.03 21:24
versuchs mal mit einer TStringList und der Eigenschaft Values:
StrList.Values['0'] := 'a/A'; // Values setzen
...
if StrList.Values[irgendeine Zahl] <> '' then // Auslesen
nur ein Beispiel
Delete - Mo 13.10.03 23:06
Wie wäre es mit StringRepalce? Allerdings erst ab einer Delphi Version > D3 verfügbar. In den Faq sollte aber ein Ersatz für StringReplace existieren.
sourtooth - Di 14.10.03 14:09
Das sagt mir alles nichts :(
Könnt ihr mir das vielleicht ein wenig genauer erklären?
Danke.
Terra23 - Di 14.10.03 14:49
... warum willst du umwandeln? Mach doch im OnKeyPress-Ereigniss einfach so, daß du prüfst, ob eine der Buchstabentasten aus deiner Liste gedrückt wurde und sage dann, daß es nicht erlaubt ist und setze zusätzlich stattdessen die entsprechende Ziffer:
Delphi-Quelltext
1: 2: 3: 4: 5:
| If Key=Buchstabe Begin Key:=#0; <- Rückschritt Key:=Zahl; End; |
Die Prozedur geht sicherlich noch ein wenig einfacher, denke ich... :-)
Delete - Di 14.10.03 14:55
| sourtooth hat folgendes geschrieben: |
Das sagt mir alles nichts :(
Könnt ihr mir das vielleicht ein wenig genauer erklären?
Danke. |
Ich habe eine klasse Idee für dich: Kuck mal nach StringReplace in der Hilfe. :P
sourtooth - Di 14.10.03 16:53
Hab ich schon, nur hilft es mir nicht weiter, ich weiss nicht, wie man es anwenden soll.
Tino - Mi 15.10.03 14:42
Dann poste mal deine Versuche wie du die Funktion StringReplace in deinem Code eingefügt hast.
Gruß
Tino
sourtooth - Do 16.10.03 14:06
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| begin with TReplaceDialog(Sender) do begin StrList.Values[0] := 'a'; if StrList.Values[0] <> '' then end; |
Oder wie sonst soll ich den Vorschlag von Shark einbinden?
barfuesser - Do 16.10.03 14:17
Was hat das mit StringReplace zu tun :?:
barfuesser
Shark - Do 16.10.03 14:52
Mit meinem Vorschlag merkst Du Dir nur, was Du mit was ersetzen willst.
Du willst Z mit 1 ersetzen:
StrList.Values['Z'] := '1'; //hat ich oben falsch
und so weiter...
dann ersetzen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| for i := 0 to StrList.count - 1 do begin FindText := StrList.Names[i]; ReplaceText := StrList.Values[FindText] ;
ersetzen...
end; |
sourtooth - Do 16.10.03 17:09
Danke für deine Antwort.
| Zitat: |
[Error] l33t.pas(51): Declaration expected but 'FOR' found
[Error] l33t.pas(53): Undeclared identifier: 'FindText'
[Error] l33t.pas(53): Undeclared identifier: 'StrList'
[Error] l33t.pas(53): Undeclared identifier: 'i'
[Error] l33t.pas(54): Undeclared identifier: 'ReplaceText' |
die o.g. Fehlermeldung bekam ich, als ich das eingegeben hatte:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.Memo1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
for 'i' := 0 to StrList.count - 1 do begin FindText := StrList.Names[i]; ReplaceText := StrList.Values[FindText]; StrList.Values['Z'] := '1';
end; |
worm - Do 16.10.03 22:32
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.Memo1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin Case Key of 'Z', 'z': Key := '2'; 'E', 'e': Key := '3'; end; end; |
Nach dem Schema müsste es gehen. Kommt drauf an, was du jetzt eigentlich erreichen wolltest.
Und Du solltest wirklich erstmal etwas über die Grundlagen lernen, bevor du wild herumprobierst. Schnapp Dir'n Buch und lern die Grundlagen, danach kannst du auf dieser Basis weitermachen.
Terra23 - Fr 17.10.03 00:36
@Worm: Eine ähnlich Lösung hatte ich ihm auch angeboten; die wollte er scheinbar nicht..
@Sourtooth: Wenn überhaupt, dann muss es For I heißen und nicht For 'I'..
sourtooth - So 19.10.03 17:31
@Terra
Das lag daran, dass ich zu der Zeit nicht viel damit anfangen konnte, da ich es nicht verstanden hatte...
Ich bin jetzt worms Exempel gefolgt, bekomme aber die Fehlermeldung, dass
''Property and Method Memo1KeyUp'' nicht kompatibel sein.
Woran liegts?
So ist der Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm1.Memo1KeyUp(Sender: TObject; var Key: Char; Shift: TShiftState); begin Case Key of 'Z', 'z': Key := '2'; 'E', 'e': Key := '3'; end; end; |
worm - Mo 20.10.03 00:53
| sourtooth hat folgendes geschrieben: |
@Terra
Das lag daran, dass ich zu der Zeit nicht viel damit anfangen konnte, da ich es nicht verstanden hatte... |
Buch lesen!
Hmm, welche Delphi-Version benutzt du eigentlich? Die Fehlermeldung kenn ich gar nicht. Das einzige, was ich mir vorstellen könnte, was Du gemacht haben könntest, hätte die Fehlermeldung "Deklaration von ... unterscheidet sich von vorheriger Deklaration" ergeben.
Naja, wie auch immer, die Parameterliste einer Ereignisbehandlungsroutine kannst du nicht einfach verändern, der Fehler lag im Code. Da Key vom Typ Word ist, darf man nicht Key mit 'Z' etc vergleichen, sondern muss Key in einen Char umwandeln. Dazu gibt's die Funktion Chr. Es hieße also
Delphi-Quelltext
1: 2: 3:
| case Chr(Key) of 'Z', 'z': Key := Ord('2'); end; |
Habe das aber mal getestet und festgestellt, dass dadurch am Tastendruck irgendwie nichts verändert wird. Nimm also Memo1.OnKeyPress, dann kannst du auch den Code nehmen, den ich zuerst gepostet hatte, denn bei OnKeyPress bekommst du einen Wert vom Typ Char. Und damit funktioniert die Umwandlung direkt bei der Eingabe auch.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!