Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Übersetzer - Ansatzprobleme (https://www.delphipraxis.net/91097-uebersetzer-ansatzprobleme.html)

naudoc 29. Apr 2007 14:09


Übersetzer - Ansatzprobleme
 
Hallo,

wie kann man denn einen Uebersetzer programmieren, d.h. einzelne Wörter oder Buchstaben erfassen und diese verändern, bzw anders formatiert in ein anderes Edit/Memofenster verfrachten?

Danke schonmal!

mkinzler 29. Apr 2007 14:11

Re: Übersetzer - Ansatzprobleme
 
Was meinst du mit Übersetzen? Interpreieren?

naudoc 29. Apr 2007 14:18

Re: Übersetzer - Ansatzprobleme
 
HI,

Danke für die schnelle Antwort.
Zum Beispiel a->4 und i->! oder auch hallo->hello und auf wiedersehen->goodbye

Danke

mkinzler 29. Apr 2007 14:20

Re: Übersetzer - Ansatzprobleme
 
Im onChange könntest du den Inhalt mit einer Liste Abgleichen und wenn etwas gefunden wird das ergebnis Ausgegeben werden.

naudoc 29. Apr 2007 14:23

Re: Übersetzer - Ansatzprobleme
 
Wie kann man denn abgleichen, nur mit if und case oder gibt es da andere Möglichkeiten?
Und was ist wenn ich dann ai eingebe? Das a wird 4 aber ai kennt er ja dann nicht, oder?

mfG

mkinzler 29. Apr 2007 14:30

Re: Übersetzer - Ansatzprobleme
 
Mit if oder case wäre es ja etwas viel was abgeprüft werden müßte. Ich würde z.B. mit einer ValueList arbeiten.

naudoc 29. Apr 2007 14:35

Re: Übersetzer - Ansatzprobleme
 
Und zu 'ai' hast du keine Lösung?

Aber trotzdem schon mal vielen Dank!

mkinzler 29. Apr 2007 14:40

Re: Übersetzer - Ansatzprobleme
 
Willst du nun einen Sprachübersetzer oder ein Buchstaben->Zahl Übersetzer machen.
Ord('a')-48 = 1

naudoc 29. Apr 2007 14:44

Re: Übersetzer - Ansatzprobleme
 
Es soll eine Symbolübersetzung werden:

hallo-->|-|4110
mkinzler-->|\/| |{ ! |\| z 1 3 ,-

nur zum gaudi...

p0w3r5tr34m3r 29. Apr 2007 14:55

Re: Übersetzer - Ansatzprobleme
 
du meinst wahrscheinlich das hier -> 1337 - Converter

naudoc 29. Apr 2007 15:01

Re: Übersetzer - Ansatzprobleme
 
Ja genau das.
Wie programmier ich das(ich brauch nur nen Ansatz, wie die einzelnen Buchstaben erfasst werden....)

mfG

Meflin 29. Apr 2007 15:30

Re: Übersetzer - Ansatzprobleme
 
Zitat:

Zitat von naudoc
Wie programmier ich das(ich brauch nur nen Ansatz, wie die einzelnen Buchstaben erfasst werden....)

Wie wärs mal mit nem simplen
Delphi-Quellcode:
NewText := StringReplace(OldText, 'E', '3', [rfReplaceAll, rfIgnoreCase])
Das musst du eben für jeden buchstaben des Alphabets machen...


g0rmed 30. Apr 2007 06:54

Re: Übersetzer - Ansatzprobleme
 
Oder du informierst dich mal über formale Sprachen, das ist glaub ich schonmal ne sehr gute Grundlage für den theoretischen Ansatz...hier bie wiki
Das Thema ist aber nicht sooo einfach(soll nicht heißen, dass es sehr schwer ist), vorallem deswegen, weil es auch Besandteil des info-studiums ist...
Wie das mit Delphi am besten umzusetzten ist...keine Ahnung...hab mich damit bisher nur theoretisch beschäftigt :roll:

mkinzler 30. Apr 2007 06:56

Re: Übersetzer - Ansatzprobleme
 
Zitat:

Wie wärs mal mit nem simplen
Delphi-Quellcode:
NewText := StringReplace(OldText, 'E', '3', [rfReplaceAll, rfIgnoreCase])
Das musst du eben für jeden buchstaben des Alphabets machen...
Da wäre aber der Ansatz über den ASCII-Code besser

Meflin 30. Apr 2007 13:33

Re: Übersetzer - Ansatzprobleme
 
Zitat:

Zitat von mkinzler
Da wäre aber der Ansatz über den ASCII-Code besser

Ach wirklich? Und was möchte das bitteschön für einen Vorteil bringen :roll:

ist es so schwer, mit 8k+ Beiträgen halbwegs sinnvolle und informative Beiträge zu erstellen?


mkinzler 30. Apr 2007 13:34

Re: Übersetzer - Ansatzprobleme
 
Es wäre nur eine If-Anweisung

Meflin 30. Apr 2007 13:42

Re: Übersetzer - Ansatzprobleme
 
Zitat:

Zitat von mkinzler
Es wäre nur eine If-Anweisung

Und was will er bitte mit den ASCII-Codes, wenn aus "M" "|\/|" werden soll :gruebel:


naudoc 30. Apr 2007 15:35

Re: Übersetzer - Ansatzprobleme
 
Hallo nochmal,

Wie bekomme ich denn den Text aus einer Memo?
also:
Delphi-Quellcode:
edit2.text := StringReplace(edit1.text, 'E', '3', [rfReplaceAll, rfIgnoreCase])
funktioniert, aber
Delphi-Quellcode:
memo2.lines := StringReplace(memo1.lines, 'E', '3', [rfReplaceAll, rfIgnoreCase])
nicht.

Wie bekomme cih das zum laufen?

mfG

mkinzler 30. Apr 2007 15:39

Re: Übersetzer - Ansatzprobleme
 
Du mußst zuerst den Inhalt in eine temporäre Variable schreiben

Delphi-Quellcode:
s := memo1.lines;
memo2.lines := StringReplace(s, 'E', '3', [rfReplaceAll, rfIgnoreCase])

naudoc 30. Apr 2007 15:53

Re: Übersetzer - Ansatzprobleme
 
Wenn ich das mache passiert trotzdem das selbe:

[Fehler] Unit1.pas(37): Inkompatible Typen: 'String' und 'TStrings'

und gleich noch ne Frage:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
edit2.text := StringReplace(edit1.text, 'a', '4 ', [rfReplaceAll, rfIgnoreCase]);
edit2.text := StringReplace(edit1.text, 'b', '|3 ', [rfReplaceAll, rfIgnoreCase]);
edit2.text := StringReplace(edit1.text, 'c', '[ ', [rfReplaceAll, rfIgnoreCase]);
edit2.text := StringReplace(edit1.text, 'd', '|) ', [rfReplaceAll, rfIgnoreCase]);
edit2.text := StringReplace(edit1.text, 'E', '3 ', [rfReplaceAll, rfIgnoreCase]);
edit2.text := StringReplace(edit1.text, 'f', '|= ', [rfReplaceAll, rfIgnoreCase]);
edit2.text := StringReplace(edit1.text, 'g', '9 ', [rfReplaceAll, rfIgnoreCase]);
edit2.text := StringReplace(edit1.text, 'h', '|-| ', [rfReplaceAll, rfIgnoreCase]);
edit2.text := StringReplace(edit1.text, 'i', '! ', [rfReplaceAll, rfIgnoreCase]);
edit2.text := StringReplace(edit1.text, 'j', '_| ', [rfReplaceAll, rfIgnoreCase]);
edit2.text := StringReplace(edit1.text, 'k', '|{ ', [rfReplaceAll, rfIgnoreCase]);
edit2.text := StringReplace(edit1.text, 'l', '1 ', [rfReplaceAll, rfIgnoreCase]);
edit2.text := StringReplace(edit1.text, 'm', '|\/| ', [rfReplaceAll, rfIgnoreCase]);
edit2.text := StringReplace(edit1.text, 'n', '|\| ', [rfReplaceAll, rfIgnoreCase]);
edit2.text := StringReplace(edit1.text, 'o', '0 ', [rfReplaceAll, rfIgnoreCase]);
edit2.text := StringReplace(edit1.text, 'p', '|° ', [rfReplaceAll, rfIgnoreCase]);
edit2.text := StringReplace(edit1.text, 'q', '[,] ', [rfReplaceAll, rfIgnoreCase]);
edit2.text := StringReplace(edit1.text, 'r', ',- ', [rfReplaceAll, rfIgnoreCase]);
edit2.text := StringReplace(edit1.text, 's', '5 ', [rfReplaceAll, rfIgnoreCase]);
edit2.text := StringReplace(edit1.text, 't', '7 ', [rfReplaceAll, rfIgnoreCase]);
edit2.text := StringReplace(edit1.text, 'u', '|_| ', [rfReplaceAll, rfIgnoreCase]);
edit2.text := StringReplace(edit1.text, 'v', '\/ ', [rfReplaceAll, rfIgnoreCase]);
edit2.text := StringReplace(edit1.text, 'w', '\/\/ ', [rfReplaceAll, rfIgnoreCase]);
edit2.text := StringReplace(edit1.text, 'x', '}{ ', [rfReplaceAll, rfIgnoreCase]);
edit2.text := StringReplace(edit1.text, 'y', '\|/ ', [rfReplaceAll, rfIgnoreCase]);
edit2.text := StringReplace(edit1.text, 'z', '2 ', [rfReplaceAll, rfIgnoreCase]);
edit2.text := StringReplace(edit1.text, 'ä', '43 ', [rfReplaceAll, rfIgnoreCase]);
edit2.text := StringReplace(edit1.text, 'ö', '03 ', [rfReplaceAll, rfIgnoreCase]);
edit2.text := StringReplace(edit1.text, 'ü', '|_|3 ', [rfReplaceAll, rfIgnoreCase]);
edit2.text := StringReplace(edit1.text, '?', '! ', [rfReplaceAll, rfIgnoreCase]);
edit2.text := StringReplace(edit1.text, '.', '* ', [rfReplaceAll, rfIgnoreCase]);
end;
Erstmal sorry weils so lange ist, aber wenn ich jetzt in Edit1 was eingebe sind die Keys nach 2 Tasten gesperrt. Weiss jemand warum? (Es sind keine OnKeyPress- oder sowas Ereignisse eingestellt)
--> sorry hatte MaxLength eingestellt

Nochwas:
Der Text wird 1:1 kopiert in Edit2 und nicht verändert, warum?


mfG

mkinzler 30. Apr 2007 15:57

Re: Übersetzer - Ansatzprobleme
 
Sorry muß natürlich
Delphi-Quellcode:
s := memo1.lines.Text;
heißen

BTW. wprde statt
Zitat:

edit2.text
auch ne lokale Variable nehmen

Meflin 30. Apr 2007 16:18

Re: Übersetzer - Ansatzprobleme
 
Und viel schöner wird dein Code noch so ;)
Delphi-Quellcode:
var
  Chars: array[0..2] of string = ('E', 'M', 'T');
  Replacement: array[0..2] of string = ('3', '|\/|', '7');

for i := 0 to Length(Chars) - 1 do
  NewText := StringReplace(OldText, Chars[i], Replacement[i], [rfReplaceAll, rfIgnoreCase]);

Matze 30. Apr 2007 16:21

Re: Übersetzer - Ansatzprobleme
 
Anstelle die StringReplace-Funktion zu nutzen, die bei so vielen Aufrufen recht langsam ist, würde ich Lösungen wie beispielsweise diese verwenden.

inherited 30. Apr 2007 16:23

Re: Übersetzer - Ansatzprobleme
 
Zitat:

Zitat von naudoc
Nochwas:
Der Text wird 1:1 kopiert in Edit2 und nicht verändert, warum?

Weil du immer wieder Edit1 als Quelle benutzt, dessen Text aber nie geändert wird

thule 20. Feb 2008 22:38

Re: Übersetzer - Ansatzprobleme
 
ich bin hier über die suche gelandet und meine frage ist auch etwas offtopic aber:
ich möchte einen sehr einfachen sprache-zu-sprache übersetzer schreiben und mir fehlen etwas die ansätze. ich denke ein (z.B Ini [wegen "=" ])-File ist irgendwie ungünstig was performance, DB-size usw angeht. sagen wir es so: ich habe eine konsole, ich gebe ein "translate://morgen" und hätte nun gern die ausgabe der möglichen übersetzungen. wie müsste ich vorgehen? vielen dank. gruß

inherited 21. Feb 2008 19:35

Re: Übersetzer - Ansatzprobleme
 
Da bietet sich eine Datenbank (MySQL, Firebird, ist hier eigentlich egal) an. Damit kannst du auch mehrere mögliche Übersetzungen leicht implementieren. Du hast dann zum beispiel eine Tabelle GermanToEnglish mit den Feldern German und English und mit der Abfrage "SELECT * FROM GermanToEnglish WHERE German='MeinSuchString'; und bekommst alle Eingetragenen übersetzungen.
Ein Speicherschonenderer Ansatz wäre, für jedes Wort nur einen Eintrag in der Liste zu haben und alle Übersetzungen mit Komma oä. separiert. Abfrage ist fast die gleiche (evtl noch ein LIMIT 1 dahinter), du musst dann nurnoch dein Ergebnis mit explodeexplode oä. Trennen.

thule 22. Feb 2008 01:35

Re: Übersetzer - Ansatzprobleme
 
Ja, das klingt sehr gut.
So wird's getestet.
Ich bin hier schon weiterführend fündig geworden. Noch ne andere Frage dazu: Nicht das ich jetzt extrem faul bin, aber kann jemande freie datenbanken empfehlen (gibt es welche?). Sie müssen nicht extrem groß sein. ich habe mir schon die von dict.cc (knapp 14mb) besorgt, aber die darf nicht weitergegeben werden und ist viel zu groß, da meine übersetzerfunktionen im normalen "use" rahmen sein dürfen.

vielen dank und gruß :)

alzaimar 22. Feb 2008 06:24

Re: Übersetzer - Ansatzprobleme
 
Zitat:

Zitat von Matze
Anstelle die StringReplace-Funktion zu nutzen, die bei so vielen Aufrufen recht langsam ist, würde ich Lösungen wie beispielsweise diese verwenden.

Na nun, das spielt sich aber eher im Millisekundenbereich ab, meinst Du nicht? Bei massivem Einsatz würde ich Deinem Einwand Recht geben, aber in Anbetracht der Tatsache, das es sich beim Threadsteller um einen Rookie handeln dürfte, würde ich (wie auch sonst in Projekten) nach der Devise: "Keep it simple" handeln.
Zitat:

Zitat von inherited
Ein Speicherschonenderer Ansatz wäre, für jedes Wort nur einen Eintrag in der Liste zu haben ...

Bei einem DB-Ansatz sollte man diese Überlegung nicht anstellen, weil dann die Rückwärtsübersetzung nicht mehr orthogonal funktioniert. Dein erster Ansatz ist schon ok. Eventuell kann man noch über die Normalisierung in die 3NF nachdenken, da Wörter in beiden Spalten doppelt vorkommen können.
Grundsätzlich ist ein 'Übersetzer' dieser Form jedoch nur als Vokabeltrainer zu gebrauchen. Ein Übersetzer muss ja auch noch das Zeugs verstehen, was er übersetzen soll, und da wird es dann schon etwas schwerer.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz