| Autor |
Beitrag |
moerty1988
Hält's aus hier
Beiträge: 6
|
Verfasst: So 14.10.07 21:41
Hallo,
und schon einmal danke an alle, die sich kurz Zeit nehmen um mir bei meinem Problem zu helfen.
Ich soll ein Programm schreiben, in dem ich Morsecodes eingeben kann (edit1). Dann habe ich 2 Buttons, mit denen ich überprüfen soll, ob in dem gesamten Morsecode das Wort "SOS" vorhanden ist (button1) und dann soll man den Morsecode in einen Text übersetzen können (button2).
Was ich bis jetzt gemacht habe:
Ich habe 26 Variablen für das Alphabet festgelegt. a-z: string[4];
Dann habe ich in form.create alle Variablen mit ihren Codes belegt.
z.B. s:='...';
Soweit kein Problem  Jetzt bin ich beim "Überprüfe" Button, der mir sagen soll ob das Wort "SOS" im edit1 vorhanden ist, egal was davor, oder dahinter steht. Hier beginnt mein Problem. Ich habe bis jetzt nur eine Abfrage ob SOS alleine drin steht:
Delphi-Quelltext 1:
| if edit1.text=s+o+s then ... |
Nun weiß ich nur nicht, wie ich das gesamte edit Feld auf das Wort SOS überprüfe und dann noch den zweiten Button wie ich die Morsecodes in einen normalen Text umwandeln kann.
Anbei mein Programm bist jetzt.
Moderiert von Narses: Delphi-Tags hinzugefügt
Einloggen, um Attachments anzusehen!
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 14.10.07 21:47
Wandele dein SOS in Morscode um und guck mit pos, ob die Zeichenfolge im Edit vorkommt.
|
|
moerty1988 
Hält's aus hier
Beiträge: 6
|
Verfasst: So 14.10.07 21:53
Dann wäre die if Bedingung:
Delphi-Quelltext 1:
| if edit1.Text='...'+'---'+'...' then ? |
Und pos wende ich dann so an:
Kenne die Funktion pos leider nicht, wie verwende ich diese, damit er aus dem gesamten edit1 String ein Teilstring erkennt?
Moderiert von Narses: Delphi-Tags hinzugefügt
|
|
Lurnon
      
Beiträge: 33
|
Verfasst: So 14.10.07 22:22
Schau dir den Link mal den Link an.
Da steht folgendes:
Pos(gesuchter_String;in_dem_zu_suchenden_String) die Funktion gibt einen Integerwert zurück,
wird der String gefunden ist der Integerwert =der Position in dem String, in dem du suchst.
Wird der Wert nicht gefunden ist der Wert des Integer 0.
Ach ja ich würde zwischen den Morsecodes der einzelnen Zeichen ein Leerzeichen lassen, ansonsten könnte es durch Zufall passieren, dass ein paar andere Buchstaben zusammen ebenfalls die Morsefolge von SOS ergeben.
|
|
moerty1988 
Hält's aus hier
Beiträge: 6
|
Verfasst: So 14.10.07 22:54
Hat hervorragend geklappt.
Koenntest du mir nun noch beim zweiten Button helfen?
Sodass man die Codes in Buchstaben umwandeln kann?
|
|
TProgger
      
Beiträge: 148
XP
D6, D2007 prof
|
Verfasst: Mo 15.10.07 10:12
Hi,
wenn du im OnCreate die Variablen belegst, mach es doch anders.
Nimm einen Record:
Delphi-Quelltext 1: 2: 3: 4:
| MyZeichen = Record str: String; b: Char; end; |
dann ein
Delphi-Quelltext 1: 2:
| var zArray: Array[1..26] of MyZeichen; |
Dieses belegst du dann wie gehabt.
In zArray[x].str kommen die Punkte/Striche und in zArray[x].b der Buchstabe.
So hast du bei Zugriff auf eine Zeichenfolge auch gleich den Buchstaben.
Gruß 
Zuletzt bearbeitet von TProgger am Mo 15.10.07 10:13, insgesamt 1-mal bearbeitet
|
|
Lurnon
      
Beiträge: 33
|
Verfasst: Mo 15.10.07 10:12
Wenn du Leerzeichen zwischen den Morsecodes für die jeweiligen Zeichen gelassen hast (also ... ___ ... statt ...___...) ist das ganze kein Problem, jedoch würde ich dir vorher dazu raten aus deinen 26Variablen ein Feld zu machen [1..26].
Beim Klick auf den Button musst du dann sinngemäß (hab es nicht getestet) sowas durchführen:
Bei dieser Variante muss auch nach dem letzten Morsezeichen ein Leerzeichen eingegeben werden!
Delphi-Quelltext 1: 2: 3: 4:
| for i:=1 to 26 do begin edit1.text=StringReplace(edit1.text,Feld[i]+' ', chr(64+i), [rfReplaceAll]); end; |
Wenn dir das Leerzeichen am Ende nicht zusagt (da sowas ja vom Benutzer leicht vergessen werden kann), hast du zwei Möglichkeiten:
1)Entweder du ermittelst mittels length(String) die Länge von edit1.text und kontrollierst anschließend ob edit1.text[length(String)] gleich ' ' ist, wenn nicht hängst du einfach mittels edit1.text:=edit1.text+' ' ein Leerzeichen an. Damit bist du auf das Leerzeichen des Benutzer nicht angewiesen.
2) Du baust 2 Felder und orndest sie nach der Komplexität des Morsezeichens vom4er bis zum 1er und ins zweite schreibst du den zugehörigen Buchstaben, dann veränderst du das oben wie folgt:
edit1.text=StringReplace(edit1.text,Feld1[i],Feld2[i], [rfReplaceAll])
Beachte: Die Leerzeichen zwischen den Morsezeichen bleiben hier erhalten, willst du sie anschließend wieder entfernen musst du den delete Befehl zusammen mit Pos nutzen
edit: Da scheint jmd. schneller gewesen zu sein 
|
|
moerty1988 
Hält's aus hier
Beiträge: 6
|
Verfasst: Mo 15.10.07 13:05
Hallo TProgger,
danke für deine Antort,
leider bin ich schon etwas länger wieder aus Delphi raus un habe nicht mehr so die Ahnung.
Muss ich jetzt den Array bei type reinschreiben? Oder bei den Varibalen?
Koenntest du mir meinen Quellcode vllt so bearbeiten, dass ich sehe wo es genau stehen muss?
Habe dazu mal die aktuelle Version hochgeladen.
Die Überprüfung funktioniert schon nur noch das Umwandeln.
Danke schon mal
Programm im Anhang.
//edit:
Habe das jetzt so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| type
zeichen = record str: String; b: Char; end;
var
zArray: Array[1..26] of zeichen;
procedure TForm1.FormCreate(Sender: TObject); begin zArray[1].str:='.-'; zArray[1].b:='a'; |
Ist das so richtig?
Jetzt habe ich dann für A den Buchstaben un den Code belegt und müsste das jetzt noch für alle 26 Buchstaben machen, also für B dann noch:
Delphi-Quelltext 1: 2:
| zArray[1].str:='-...'; zArray[1].b:='b'; |
---
Hier jetzt nochmal das Programm mit dem Array und den Variablen.
Jetzt brauch ich nur noch den Befehl, um die Codes umzuwandeln, wenn das bis dahin so richtig ist?
Gruß moerty
Moderiert von Narses: Beiträge und Anhänge zusammengefasst.
Einloggen, um Attachments anzusehen!
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 15.10.07 14:50
Ich würde das mit konstanten Arrays machen, das ist viel kürzer und übersichtlicher:
Delphi-Quelltext 1: 2: 3:
| const morse: array[0..1] of String = ('...', '---', '.'); zeichen: array[0..1] of String = ('s', 'o', 'e'); |
Jetzt musst du nur noch den Morsecode zeichenweise durchgehen und so versuchen einen Buchstabencode zu finden.
|
|
Wolle92
      
Beiträge: 1296
Windows Vista Home Premium
Delphi 7 PE, Delphi 7 Portable, bald C++ & DirectX
|
Verfasst: Mo 15.10.07 15:27
wenn er doch nur rausfinden soll, ob in dem Code SOS drinsteht, dann braucht er doch nur die position davon ermitteln...
Delphi-Quelltext 1:
| if Pos('... --- ...') <> 0 then |
Ich gehe mal davon aus, dass die einzelnen Buchstaben durch Leerzeichen getrennt werden...
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 15.10.07 15:29
Warum sollten die getrennt werden? genau das ist doch bei Morsecode eben nicht notwendig...
|
|
Wolle92
      
Beiträge: 1296
Windows Vista Home Premium
Delphi 7 PE, Delphi 7 Portable, bald C++ & DirectX
|
Verfasst: Mo 15.10.07 15:48
doch, nach einem fertigen wort wird eine Pause mit der Länge von einem Punkt gemacht...
Es gibt ja Wärter, die haben dann den Code ".." und wenn man dann ohne Unterbrechung ...---... schreibt, kann das SOS aber auch IAMS oder EIMB heißen, weil man nicht weiß, wann ein Zeichen zuende ist... und wenn man bei was längerem erstmal rumprobieren muss, was es denn heißen könnte, dann sind die Leute schon tot, bevor man weiß, was die überhaupt sagen wollten...
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 15.10.07 15:52
Nach einem Wort, stimmt, aber du hast es nach jedem Zeichen gemacht, egal, ich kenn mich da auch nicht so gut aus, jedenfalls ist dann mit Leerzeichen die Umwandlung ja eine Sache von 2 Zeilen plus die Konstanten...
|
|
Wolle92
      
Beiträge: 1296
Windows Vista Home Premium
Delphi 7 PE, Delphi 7 Portable, bald C++ & DirectX
|
Verfasst: Mo 15.10.07 15:57
boah, ich brauch nen kaffee, merk ich grad
Also:
Nach einem Zeichen (Char) wir eine Pause von der Länge eines Punktes (.) gemacht...
Nach einem Wort dann (ShortString) wird eine Pause von der Länge eines Striches (-) gemacht...
Und so entsteht dann die Nachricht (String)
Für so ein Programm würde ich sagen, nach jedem Zeichen ein Leerzeichen, nach einem Wort dann zwei
|
|
moerty1988 
Hält's aus hier
Beiträge: 6
|
Verfasst: Mo 15.10.07 16:11
Hey, danke, aber der Button "Überprüfen" funktioniert schon ohne Probleme.
Nur soll ein Text den ich eingebe (in Morsezeichen) noch übersetzt werden können.
Das heißt ich schreibe einen Satz in Morsezeichen und das programm soll dann im edit2 den Text in buchstaben ausgeben.
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 15.10.07 16:42
Moin!
moerty1988 hat folgendes geschrieben: | Nur soll ein Text den ich eingebe (in Morsezeichen) noch übersetzt werden können.
Das heißt ich schreibe einen Satz in Morsezeichen und das programm soll dann im edit2 den Text in buchstaben ausgeben. |
Hm  Hier kann man keinen Quelltext bestellen, auch wenn die "Kollegen" hier schon mal etwas "übereifrig" in die Tasten greifen...
Hast du denn schonmal hier im Forum nach Lösungen gesucht? MORSEZEICHEN
Wenn bei der Suche nichts passendes oder auch nichts, was man passend machen könnte, dabei war: Wie sieht denn dein Ansatz bisher aus?  Wenn du keinen Quelltext hast, dann könntest du ja zumindest deine Idee(n), wie man das machen könnte, erläutern!
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
moerty1988 
Hält's aus hier
Beiträge: 6
|
Verfasst: Mo 15.10.07 22:42
Gedanken habe ich mir schon gemacht und ich habe auch erste Ansätze:
Als leerzeichen, bzw. Unterbrechungen zwischen den einzelnen Morsecodes habe ich ein Slash ('/') genommen. Dies soll beim Umwandeln in den normalen Text dann auch als Leerzeichen umgewandelt werden.
Dazu habe ich folgendes:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| var text: string; i: integer; begin text:=edit1.text; while pos('/',text) > 0 do text[pos('/',text)]:=' '; |
So, da dass ohne Probleme funktioniert habe ich mir gedacht: "Das muss auch mit den Morsecodes gehen":
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| for i:=1 to length(text) do begin while pos(zArray[1].str,text)>0 do text[pos(zArray[1].str,text)]:=zArray[1].b; while pos(zArray[2].str,text)>0 do text[pos(zArray[2].str,text)]:=zArray[2].b; while pos(zArray[3].str,text)>0 do text[pos(zArray[3].str,text)]:=zArray[3].b; while pos(zArray[4].str,text)>0 do text[pos(zArray[4].str,text)]:=zArray[4].b; while pos(zArray[5].str,text)>0 do text[pos(zArray[5].str,text)]:=zArray[5].b; end;
edit2.Text:=text; |
Und hier fängt der Fehler an. Wenn ich jetzt nun einen Text eingeben würde und dort ein H als Morsecode vorkommen würde, dann wandelt das Programm die Morsecodes in 4 E's um.
Morsecode H: '....'
Morsecode E: '.'
Das heißt, dass er im Code 4 Punkte findet und diese als E's interpretiert. Ein weiterer Fehler ist, dass wenn er z.B. das A gefunden hat (Morsecode: .-) Bei dem Code nur das erste Zeichen übersetzt. D.h. wenn ich als Morsecode .- habe übersetzt das Programm nach a- es erkennt also das A als Code aber wandelt nur das erste Zeichen des Codes zum A um und behält den Rest bei.
Um alles nachzuvollziehen habe ich das aktuelle Programm nochmal hinzugefügt
Einloggen, um Attachments anzusehen!
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 16.10.07 01:40
Das geht auch einfacher, wie bereits gesagt...
Delphi-Quelltext 1: 2: 3:
| const morse: array[0..1] of String = ('...', '---', '.'); zeichen: array[0..1] of String = ('s', 'o', 'e'); |
Delphi-Quelltext 1: 2:
| for i := 0 to High(morse) do StringReplace(text, morse[i], zeichen[i], [rfReplaceAll]); |
Natürlich muss die Reihenfolge im Array so sein, dass nicht zuerst nach "." gesucht wird und danach nach "...", weil dann natürlich die einzelnen Punkte ersetzt würden. Andere Möglichkeit: Ein Leerzeichen vor und hinter den Text setzen und einfach " . ", " ... ", etc. ersetzen (natürlich müssen die Leerzeichen beim Ersetzen beibehalten werden).
|
|
TProgger
      
Beiträge: 148
XP
D6, D2007 prof
|
Verfasst: Di 16.10.07 07:25
Moin, hab dein Programm mal etwas optimiert und ergänzt.
Schaus einfach an. Es sollte alles wie gewünscht funktionieren 
Einloggen, um Attachments anzusehen!
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 16.10.07 08:29
Moin!
TProgger hat folgendes geschrieben: | Moin, hab dein Programm mal etwas optimiert und ergänzt.
Schaus einfach an. Es sollte alles wie gewünscht funktionieren  |
Sag mal, kann ich auch bei dir Programme bestellen, wenn ich mich ein bischen doof anstelle?
Meinst du nicht, du wirfst ein wenig zu schnell mit Quelltext bzw. c&p-ready-Lösungen um dich, anstatt deine Lösungen anständig kommentiert hier vorzustellen?
cu
Narses ja, ich weiß, immer die gleiche Leier, aber das scheint ab und zu nötig zu sein...
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
|