Autor Beitrag
moerty1988
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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 :P 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:
ausblenden 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 user profile iconNarses: Delphi-Tags hinzugefügt
Einloggen, um Attachments anzusehen!
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 14.10.07 21:47 
Wandele dein SOS in Morscode um und guck mit pos, ob die Zeichenfolge im Edit vorkommt.
moerty1988 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: So 14.10.07 21:53 
Dann wäre die if Bedingung:
ausblenden 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 user profile iconNarses: Delphi-Tags hinzugefügt
Lurnon
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 33



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 148

XP
D6, D2007 prof
BeitragVerfasst: Mo 15.10.07 10:12 
Hi,
wenn du im OnCreate die Variablen belegst, mach es doch anders.
Nimm einen Record:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
MyZeichen = Record
  str: String;
  b: Char;
end;

dann ein
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 33



BeitragVerfasst: 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!
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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:
ausblenden 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:

ausblenden 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 user profile iconNarses: Beiträge und Anhänge zusammengefasst.
Einloggen, um Attachments anzusehen!
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: Mo 15.10.07 14:50 
Ich würde das mit konstanten Arrays machen, das ist viel kürzer und übersichtlicher:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1296

Windows Vista Home Premium
Delphi 7 PE, Delphi 7 Portable, bald C++ & DirectX
BeitragVerfasst: 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...
ausblenden Delphi-Quelltext
1:
if Pos('... --- ...') <> 0 then					

Ich gehe mal davon aus, dass die einzelnen Buchstaben durch Leerzeichen getrennt werden...
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: Mo 15.10.07 15:29 
Warum sollten die getrennt werden? genau das ist doch bei Morsecode eben nicht notwendig...
Wolle92
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1296

Windows Vista Home Premium
Delphi 7 PE, Delphi 7 Portable, bald C++ & DirectX
BeitragVerfasst: 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
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: 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1296

Windows Vista Home Premium
Delphi 7 PE, Delphi 7 Portable, bald C++ & DirectX
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 15.10.07 16:42 
Moin!

user profile iconmoerty1988 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... :zwinker:

Hast du denn schonmal hier im Forum nach Lösungen gesucht? Suche in: Delphi-Forum, Delphi-Library MORSEZEICHEN :les:

Wenn bei der Suche nichts passendes oder auch nichts, was man passend machen könnte, dabei war: Wie sieht denn dein Ansatz bisher aus? :nixweiss: Wenn du keinen Quelltext hast, dann könntest du ja zumindest deine Idee(n), wie man das machen könnte, erläutern! :idea: ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
moerty1988 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var text: string;
i: integer;
begin
text:=edit1.text;
//Leerzeichen in Nullen umwandeln
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":

ausblenden 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;
//hier wurden dann noch 21 andere Einträge folgen für die anderen Buttons
  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
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: Di 16.10.07 01:40 
Das geht auch einfacher, wie bereits gesagt...
ausblenden Delphi-Quelltext
1:
2:
3:
const
  morse: array[0..1] of String = ('...', '---', '.');
  zeichen: array[0..1] of String = ('s', 'o', 'e');

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 148

XP
D6, D2007 prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 16.10.07 08:29 
Moin!

user profile iconTProgger 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? :gruebel:

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? :nixweiss:

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.