Autor Beitrag
Quegge
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Fr 30.01.09 11:55 
Hey Leute, ich habe folgendes Problem:

Ich hab mir mit nem Kumpel eine eigene Sprache ausgedacht(Deutsch in anderen Zeichen).
Dachte mir dann so: Könntest ja mal versuchen dafür einen Übersetzer zu programmieren.
Hab also alles, was nötig ist gemacht, aber ich weiß nicht wie ich es schaffen soll den kompletten Text aus einem Editfeld (oder anderes Textfeld; spielt keine Rolle) zu übersetzen. Man könnte für jeden Buchstaben ein Feld anlegen, das auslesen, übersetzen, in ein anderes Feld den entsprechenden Buchstaben ausgeben. Bringt aber nicht sehr viel, find ich. Es sollen alle Zeichen (siehe unten) aus einem Feld gelesen werden. Schon mal Danke an den, der mir helfen kann. =)
Beispiel wäre:

a -.,
b ,.-

In dieser Art sollen die Buchstaben ausgelesen werden.
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Fr 30.01.09 12:07 
:welcome: erstmal ;)
Ich verstehe nicht ganz, du willst eine Art Verschlüsselung implementieren? Also du hast einen deutschen Text und möchtest, dass aus einem 'a' ein 'b' wird, etc?

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Fr 30.01.09 12:12 
ich denke eher das er sowas wie einen hmmm, übersetzer bauen will, also der Buchstabe "a" soll in die zeichenkombination "-.," umgewandelt werden, "b" in ",.-" und so weiter also wie ein Morsealphabet.

Dafür würde sich Stringreplace anbieten. Oder aber auch eine For-Schleife, würd ich aber dazu abraten.

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
Quegge Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Fr 30.01.09 12:22 
Hallo ;)

Das, was elundril geschrieben hat, meine ich. Genau so!
Ich hab schon angefangen und mir gedacht, dass ich es mit if machen könnte.
Wird bestimmt auch funktionieren, aber dann kann ich es nicht aus einem Feld herauslesen.
Beispiel:
im Edit1 Feld steht:
.-. -_. -.- .__ ..-

Jetzt soll er erkennen, dass es 5 Buchstaben sind und diese in einem anderem Edit2 Feld darstellt.
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Fr 30.01.09 12:23 
user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
ich denke eher das er sowas wie einen hmmm, übersetzer bauen will, also der Buchstabe "a" soll in die zeichenkombination "-.," umgewandelt werden, "b" in ",.-" und so weiter also wie ein Morsealphabet.

Dafür würde sich Stringreplace anbieten. Oder aber auch eine For-Schleife, würd ich aber dazu abraten.

lg elundril

StringReplace ist gefährlich, hier. Du wirst für jedes Zeichen ein StringReplace benötigen (Viel Copy&Paste => Unübersichtlicher Code => unsaubere Programmierung und schlechte Wartbarkeit) und je nach dem, wie dein "verschlüsseltes Alphabet" aussieht, könnte eine doppelte Ersetzung statt finden: Angenommen, 'a' würde in 'bb' übersetzt, und 'b' in 'cc', dann wird aus dem Text 'a' nicht 'bb' sondern 'cccc'.
Eine For-Schleife ist für solche Aktionen immer von Vorteil. Ich gebe dir mal ein kleines Beispiel:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
const
  Code_Alphabet : array [Ord('a') .. Ord('z')] of String = (',.-', '-.,', {...} );
  //Hier schreibst du der Reihenfolge nach rein, in was die Buchstaben von 'a' bis 'z' übersetzt werden sollen.
  //Ord gibt dir übrigens den ASCII Wert des übergebenen Zeichens zurück. Achtung: Hier sind NUR kleinbuchstaben und keine äöü abgedeckt!
function Uebersetze(Klartext : String): String;
var
  i : Integer;
begin
  result := '';
  //Low und High geben dir jeweils den kleinsten/größten Index des übergebenen Arrays zurück
  //Oh, die hab ich ja garnicht benutzt... naja egal :D Nutzung: High(Code_Alphabet) wäre das gleiche wie Ord('z') hier.
  for i := 1 to Length(Klartext) do //was tut wohl Length ;) 
  begin
     result := result + Code_Alphabet[Ord(Klartext[i])];
  end;
end;


Achtung: Diese Methode ist langsam, da das Result immer wieder vergrößert werden muss.

Die Umkehrung hiervon ist etwas komplizierter, da bei dir ein Buchstaben in mehrere Zeichen übersetzt wird. Sind diese Zeichenketten immer gleich lang? Dann lässt sich das mit copy lösen.

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Quegge Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Fr 30.01.09 12:54 
Jetzt musste ich erstmal alles gründlich nachlesen, weil ich gar nicht durchgesehen habe.
Kann man das nicht anders schreiben?
Man legt für jedes eine Variable an und vergleicht diese dann. Keine Ahnung :?
Es handelt sich übringens immer um 3 Zeichen.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 30.01.09 13:13 
user profile iconQuegge hat folgendes geschrieben Zum zitierten Posting springen:
Man legt für jedes eine Variable an und vergleicht diese dann. Keine Ahnung :?
Das wäre allerdings extrem aufwendig und unnötig kompliziert.

user profile iconQuegge hat folgendes geschrieben Zum zitierten Posting springen:
Es handelt sich übringens immer um 3 Zeichen.
Dann funktioniert es ja, wenn du danach immer 3 Zeichen nimmst und diese in dem Array suchst. Hast du diese gefunden, dann nimmst du den aktuellen Index als Buchstaben (Chr).
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Fr 30.01.09 13:20 
user profile iconQuegge hat folgendes geschrieben Zum zitierten Posting springen:
Kann man das nicht anders schreiben?
Was stört dich an meinem Ansatz? :) Er ist eigentlich relativ simpel und übersichtlich. Ich erklär dir gern nochmal ausführlicher was in meiner Funktion passiert, wenn du magst.
Übrigens, wenn dir GroßKleinschreibung egal ist, kannst du ja einfach ersteinmal LowerCase (Gibt den übergebenen String in Kleinbuchstaben zurück) über den Text laufen lassen, dadurch kannst du die Großbuchstaben getrost vergessen.
Bedenke aber, dass nur Zeichen, die im Array abgedeckt sind, im Text stehen dürfen. Du musst also auch eine Abfrage in meine Funktion einbauen, die zunächst prüft, ob es sich bei dem Zeichen um z.B. eine Leertaste handelt, diese sollte dann entweder ignoriert oder einfach übernommen werden. Das einfachste wäre es aber glaube ich, wenn du für Leertasten eine eigene 3-Zeichen-Kette definierst.

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Quegge Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Fr 30.01.09 13:43 
Es wäre besser, wenn du mir noch einiges erklären könntest :roll:

Zitat:
const
Code_Alphabet : array [Ord('a') .. Ord('z')] of String = (',.-', '-.,', {...} );


Ich habe es mal ausprobiert. Er zeigt an, dass die Klammer nicht geht !?

Außerdem ist der kleinste/größte Index doch gar nicht wichtig oder?
Er soll einfach die Zeichen des gesamten Textes (mit Leerzeichen )zurückgeben.

Und Length sagt dann aus, dass wenn min. 1 Zeichen gegeben ist, das Resultat als Klartext gegeben wird?
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Fr 30.01.09 14:02 
Fangen wir vorn an :zustimm:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
const
  Code_Alphabet : array [Ord('a') .. Ord('z')] of String = (',.-', '-.,', {...} );
  //Hier schreibst du der Reihenfolge nach rein, in was die Buchstaben von 'a' bis 'z' übersetzt werden sollen.
  //Ord gibt dir übrigens den ASCII Wert des übergebenen Zeichens zurück. Achtung: Hier sind NUR kleinbuchstaben und keine äöü abgedeckt!
function Uebersetze(Klartext : String): String;
var
  i : Integer;
begin
  result := '';
  //Low und High geben dir jeweils den kleinsten/größten Index des übergebenen Arrays zurück
  //Oh, die hab ich ja garnicht benutzt... naja egal :D Nutzung: High(Code_Alphabet) wäre das gleiche wie Ord('z') hier.
  for i := 1 to Length(Klartext) do //was tut wohl Length ;) 
  begin
     result := result + Code_Alphabet[Ord(Klartext[i])];
  end;
end;

Zunächst definiere ich mir eine Konstante, ein Array. Was ein Array ist weißt du? Falls nicht: Es ist im prinzip ein großer Schrank mit Schubladen, die nummeriert sind. Als Beschriftung für die unterste Schublade hab ich das Zeichen 'a' gewählt (Umgewandelt in eine Zahl), dies ist damit das unterste Element des Arrays, welches mit dem kleinsten Index angesprochen wird.
Ich hab Delphi gesagt, in die Schubladen dürfen nur Strings rein. Da das Array eine Konstante ist, muss ich es sofort mit den ganzen 26 Elementen füllen. In meinem kurzen Codeabschnitt habe ich dir nur gezeigt, wie die ersten 2 Elemente eingefüllt werden, die restlichen 24 habe ich mit dem Kommentar {...} angedeutet, das musst du natürlich selbst übernehmen ;)
Nun kann ich das Array ansprechen. Ich sage dem Array: Ich hätte gern den Inhalt der Schublade, die mit dem Zeichen 'b' beschriftet ist, wie folgt: Code_Alphabet[Ord('b')] Hierbei wandelt die Funktion Ord das Zeichen 'b' in eine Zahl um, vom Array bekomme ich also genau das, was in meinem "verschlüsselten" Text dann ein 'b' sein soll.

Warum ist bei dir ein Fehler aufgetreten? Weil dein Array nicht komplett gefüllt war! Delphi hat gemerkt, dass statt 26 Schubladen nur 2 angegeben waren, ausserdem war da ein Komma, welches Delphi sagt, dass noch ein Element kommen soll, aber es kam keines (Statt dessen nur ein Kommentar {...}, welches ja vom compiler ignoriert wird. Für ihn stand da nur ('-.,', ',.-', ); also fehlte was hinter dem Komma).

Nun zur Funktion.
Ich bekomme in der Funktion den Klartext als String übergeben, Klartext ist also jetzt eine Variable vom Typ String, in der z.B. "hallo" stehen könnte.
Ich setze den Rückgabewert der Funktion zunächst auf '', also leer.
Dann laufe ich mit der For-Schleife durch den String Klartext: die Variable i wird in jedem Durchlauf um 1 erhöht (das machen For-Schleifen immer!) und zwar so lange, bis sie, im Fall Klartext='hallo' 5 erreicht hat, denn Length('hallo') ergibt 5 (der String ist 5 Zeichen lang).
In jedem Durchlauf der Schleife wird nun ein Zeichen im Klartext behandelt, und zwar (in Pseudocode) so:
Füge dem Rückgabewert der Funktion (Der am Anfang leer ist!) genau den String hinzu, der in der Schublade des Arrays Code_Alphabet mit der Aufschrift *mein aktuell behandelter Buchstabe* liegt. Du erinnerst dich: Ord macht aus dem Buchstaben eine Zahl, damit der Array damit umgehen kann.
Das Problem dabei ist natürlich: Sobald in meinem Klartext ein Zeichen ist, für das im Array keine Schublade existiert, hagelt's einen Fehler ("Listenindex überschreitet das Maximum (*zahl*)" wird die Nachricht vermutlich sein :) ), also muss ich der Funktion noch eine If-Abfrage hinzufügen, die, bevor ich auf das Array zugreife, überprüft, ob das Zeichen auch wirklich eine Schublade im Array hat. Das würde z.B. so gehen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
if Klartext[i] in [Ord('a') .. Ord('z')] then
  //Das zeichen kann übersetzt werden
else
  //Einfach das Zeichen so lassen und übernehmen!
  result := result + Klartext[i]; //Un-"verschlüsseltes" Zeichen einfügen

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Quegge Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Fr 30.01.09 17:04 
Danke erstmal für diese ausführliche Anleitung.
Es klingt alles ganz einleuchtend, das Problem nun ist:
Davon hatte ich zuvor noch nichts gehört und dachte, dass es auch anders geht.
Jetzt habe ich versucht das alles so zu schreiben, das möglichst wenig Fehler vorhanden sind.
Weißt du, wo hier der Fehler ist? Nach dem, was Delphi mir sagt, muss ein begin-end falsch sein (aber wo) !?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.Button1Click(Sender: TObject);
begin
   const
    Code_Alphabet : array [Ord('a') .. Ord('z')] of String = ('...','..-','.-.','-..','.--','-.-','--.','---','.._','._.','_..','.__','_._','__.','___','--_','-_-','_--','-__','_-_','__-','.-_','._-','_.-','-._','_-.');

    function Uebersetze(Klartext : String): String;
    var
     i : Integer;

    begin
  result := '';

  for i := 1 to Length(Klartext) do
  begin
     result := result + Code_Alphabet[Ord(Klartext[i])];
  end;

 end;
Blackheart666
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2195

XP
D3Prof, D6Pers.
BeitragVerfasst: Fr 30.01.09 17:34 
Probiers mal so.
ausblenden 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:
public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  const
    Code_Alphabet : array [Ord('a') .. Ord('z')] of String = ('...','..-','.-.','-..','.--','-.-','--.','---','.._','._.','_..','.__','_._','__.','___','--_','-_-','_--','-__','_-_','__-','.-_','._-','_.-','-._','_-.');
implementation

{$R *.dfm}

function Uebersetze(Klartext : String): String;
var
  i : Integer;
begin
  result := '';
  for i := 1 to Length(Klartext) do //was tut wohl Length ;)
  begin
     result := result + Code_Alphabet[Ord(Klartext[i])];
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   Caption:=Uebersetze('hallo');
end;

end.

Und schau dir mal das an.
www.christian-stelzm...rtikel/crashkurs.htm

_________________
Blackheart666
Der Irrsinn ist bei Einzelnen etwas Seltenes, - aber bei Gruppen, Parteien, Völkern, Zeiten die Regel. (Friedrich Nietzsche)
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Fr 30.01.09 19:50 
user profile iconQuegge hat folgendes geschrieben Zum zitierten Posting springen:
Nach dem, was Delphi mir sagt, muss ein begin-end falsch sein (aber wo) !?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.Button1Click(Sender: TObject);
begin
const
  Code_Alphabet : array [Ord('a') .. Ord('z')] of String = ('...','..-','.-.','-..','.--','-.-','--.','---',
                                                            '.._','._.','_..','.__','_._','__.','___','--_',
                                                            '-_-','_--','-__','_-_','__-','.-_','._-','_.-','-._','_-.');
  function Uebersetze(Klartext : String): String;
  var
    i : Integer;
  begin
    result := '';

    for i := 1 to Length(Klartext) do
    begin
      result := result + Code_Alphabet[Ord(Klartext[i])];
    end;

  end;

Schaun wir uns das mal an und vorallem: rücken wir den Code mal richtig ein. Die Einrückung sollte das deutlich machen, und das tut sie auch: Eine Variablen- oder Konstantendeklaration innerhalb des begin-end-Blocks einer Prozedur ist nicht möglich (Ich verweise auf den Delphi-Crashkurs, den dir BlackHeart schon gepostet hat - wirklich gutes Dokument, unbedingt anschauen!), die gehört zwischen das procedure bla(); und das begin, ebenso die Deklaration der Funktion.
Mein Gedanke dabei war allerdings auch, die Funktion und die Konstante Global zu deklarieren, etwa so, wie Blackheart das schon getan hat.

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Quegge Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Fr 30.01.09 20:28 
Diese Seite werde ich mir unbedingt mal anschauen.

Es werden keine Fehler mehr angezeigt, aber der Klartext steht als Caption da :?
und wo soll ich ein Leerzeichen einfügen? Wo kann man dieses 3 stelliges Zeichen einfügen?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 30.01.09 21:32 
user profile iconQuegge hat folgendes geschrieben Zum zitierten Posting springen:
Es werden keine Fehler mehr angezeigt, aber der Klartext steht als Caption da :?
Ähm, genau das machst du doch auch... :gruebel:
ausblenden Delphi-Quelltext
1:
Caption:=Uebersetze('hallo');					
Du setzt doch auch Caption. ;-)
Quegge Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Fr 30.01.09 22:05 
das ist mir auch klar -.-
die frage ist ja, was muss man tun um das zu verändern + leerzeichen erkennen
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 30.01.09 22:10 
user profile iconQuegge hat folgendes geschrieben Zum zitierten Posting springen:
das ist mir auch klar -.-
Jetzt verstehe ich wie du das meintest. :oops:

user profile iconQuegge hat folgendes geschrieben Zum zitierten Posting springen:
die frage ist ja, was muss man tun um das zu verändern
Bei mir steht da der übersetzte Code, nicht der Klartext. Wie sieht der Code bei dir denn jetzt aus?
Getestet habe ich eben den von user profile iconBlackheart666 1:1.

user profile iconQuegge hat folgendes geschrieben Zum zitierten Posting springen:
+ leerzeichen erkennen
ausblenden Delphi-Quelltext
1:
if Klartext[i] = ' ' then					
Dann hast du ein Leerzeichen.
Quegge Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Fr 30.01.09 22:42 
ich auch und bei mir steht die Caption in .-_ Zeichen.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Button1Click(Sender: TObject);
begin
   Caption:=Uebersetze('hallo');
end;


das wort, welches man für hallo einsetzt, wird dann in der caption angezeigt.

Das Zeil ist aber das Edit2 Feld. Also hab ich folgendes getan:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.Button1Click(Sender: TObject);
begin
   Caption:=Uebersetze(Edit1.Text);
end;

end.


Jetzt muss er es nur noch in das Edit 2 Feld einsetzen. Wie geht das?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 30.01.09 22:46 
Naja, dann pack das Ergebnis doch in Edit2.Text statt in Caption. :nixweiss:
Quegge Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Fr 30.01.09 22:53 
Ging erst nicht, jetzt schon.
Immer noch keine Leerzeichen^^