Wörterbuch/ Übersetzer für Delphi bzw. Lazarus

Also ich wollte mir jetzt vor einer Weile mal ein kleines Wörterbuch programmieren, der Anfang ist auch schon getan, ich habe bereits alle Worte drinne, und die werden mir bei der Eingabe auch ausgegeben.

ich wollte jetzt einerseits wissen, wie ich es machen kann dass es das Wort erkennt, egal ob groß oder klein geschrieben.

Also um das mal an einem Beispiel zu erklären, bei der Übersetzunge der Zahl „8“ habe ich jetzt als befehl eingegeben

if s=‚8‘ then s:=‚skri‘;

ich würde jetzt aber auch gerne dass ‚skri‘ auch dann ausgegeben wenn ich ‚Acht‘ oder ‚acht‘ eingeben, bisher hab ich es jetzt erstmal so gemacht das ich alles noch mal neu eingegeben habe, also das ich dann quasi 3 Zeilen dafür habe, kann ich dass auch irgendwie zusammen in einen befehl mache?? ich habe es versucht mit

if s=‚8‘ or ‚acht‘ or ‚Acht‘ then s:=‚skri‘;

aber das hat irgendwie nicht geklappt… wie genau kann ich das also machen???

So 2. Man hat ja teilweise mehrere Übersetzungsmöglichkeiten für ein Wort, ich würde gerne das diese Untereinander ausgegeben würden… aber irgendwie klappte das bei mir nicht so richtig… was muss ich dafür also eingeben???

und nun zur letzten Frage, ich hätte gern dass man mir die gramatik der jeweiligen Sprache anzeigt (also in einem neuen Fenster). Ich kenne bisher nur die ‚Memo‘ - komponente, die müsste dafür geeignet sein?? wenn ja wie baue ich das ein, damit mir dann eben zum schluss das ganze angeziegt wird. bisher hat sich bei allem wes ich gemacht hat diese Memokomponente immer konsequent geweigert mir zu zeigen was ich davor eingetippt habe (also bezogen jetzt auf andere programme bei denen ich das ‚Memo‘ gebraucht habe).

alsi ich hoffe ihr könnt mir helfen :smiley:

Einfacher wäre es, vor dem vergleich immer alles auf Kleinbuchstaben zu formatieren…

Ansonsten, ich mach seit vielen Jahren kein Delphi mehr…

Sorry, das ist sehr speziell.
Ich würde Dir empfehlen, Dich nach fertigen Übersetzungs-Komponenten umzuschauen. Wäre doch gelacht, wenn sich nicht schonmal jemand darüber Gedanken gemacht hat. Und wer will schon das Rad zweimal erfinden?..

Beste Grüße,
Steffen

Miene Antworten im zitierten Text:

ich wollte jetzt einerseits wissen, wie ich es machen kann
dass es das Wort erkennt, egal ob groß oder klein geschrieben.

if UpperCase(Suchwort) = UpperCase(Wort) then …

Der Trick liegt also einfach darin, Suchtext und Ziel in Großschrift zu wandeln und dann zu vergleichen.

Also um das mal an einem Beispiel zu erklären, bei der
Übersetzunge der Zahl „8“ habe ich jetzt als befehl eingegeben

if s=‚8‘ then s:=‚skri‘;

ich würde jetzt aber auch gerne dass ‚skri‘ auch dann
ausgegeben wenn ich ‚Acht‘ oder ‚acht‘ eingeben, bisher hab
ich es jetzt erstmal so gemacht das ich alles noch mal neu
eingegeben habe, also das ich dann quasi 3 Zeilen dafür habe,
kann ich dass auch irgendwie zusammen in einen befehl mache??

case s of
‚acht‘,‚8‘ : ergebnis := ‚skri‘;
‚neun‘,‚9‘ : ergebnis := ‚‘;
end;

Das ist die „simple“ Lösung. Eine vollständige Lösung würde erfordern, dass die Daten des Wörterbuchs eine semantische Struktur zulassen. Du arbeitest aber glaube ich mit einer Listenstruktur, weshalb die Case-Lösung für die die einfachste sein dürfte.

ich habe es versucht mit

if s=‚8‘ or ‚acht‘ or ‚Acht‘ then s:=‚skri‘;

Mit „Case“ geht es besser. Dein konkreter Fehler lag aber in der Syntax. Es hätte wie folgt heißen müssen:

if (s = ‚8‘) or (UpperCase(s) = ‚ACHT‘) then s := ‚skri‘;

So 2. Man hat ja teilweise mehrere Übersetzungsmöglichkeiten
für ein Wort, ich würde gerne das diese Untereinander
ausgegeben würden… aber irgendwie klappte das bei mir nicht
so richtig… was muss ich dafür also eingeben???

Das hängt natürlich davon ab, wie Du die Übersetzungsergebnisse findest.
Wenn Wörter und Übersetzungen z.B. in einer Wertliste vorliegen (z.B.: Wort=Übersetzung)

Schleife
Solange Übersetzungen zum Suchwort gefunden werden:
Memo um eine Zeile erweitern: Memo.Add(…)

und nun zur letzten Frage, ich hätte gern dass man mir die
gramatik der jeweiligen Sprache anzeigt (also in einem neuen
Fenster).

Ich weiß nicht genau, was Du mit einem „neuen Fenster“ meinst. Man könnte zum Beispiel die Hint-Eigenschaft der Memo-Komponente verwenden. Wenn diese einen Text enthält (der auch mehrzeilig sein darf), wird er angezeigt, wenn der Mauszeiger über der Komponente schwebt (ein sogenannter Tool-Tip).
Wenn Du die Eigenschaft TMemo.Hint zur Laufzeit setzt, verändert sich der angezeigte Text entsprechend.
Allerdings muss zusätzlich die Eigenschaft TMemo.ShowHint auf True gesetezt sein.

Gruß
Robert

okay danke erstmal :smiley: das mit case ist super, da hab ich gar nicht dran gedacht, danke :smiley:

also zu der sache mit dem neuen Fenster.

ich hatte das so geplant das man da auf einen Button klickt und dann wird eben ein neues Fenster geöffnet wo dann eben Gramatik und so drinsteht.

wir hatten sowas in der schule im infounterricht mal kurz gemacht, aber da war ich krank… aber am ende war es eben so das man auf einen Button klickte und dann wurde eben ein neues Fenste geöffnet (also „Form2“) und da war dann eben nur ein Memo drine und da stand dann eben diverser kram drin. und so in etwa wollte ich das jetzt auch haben… nur klappt das bei mir irgendwie nich wirklich…

Hiho,

Vorweg, ich glaube, so wie Du das angehst, ist das für ein Wörterbuch nicht der ideale Ansatz, aber ich denke, Du bist noch Anfänger und das ist ein guter Weg Erfahrungen zu sammeln und wünsche dir viel Erfolg.

Zu Deiner ersten Frage:
Mehrere Vergleiche in einer Bedingung laufen so ab:

if (s='8') or (s='acht') or (s='Acht') then 
 s:='skri'; 

Wegen Deinem groß/Kleinschreibeproblem könntest Du es auch so machen:

if (s='8') or (UpperCase(s) = 'ACHT') then 
 s:='skri';

UpperCase gibt den übergebenen Wert komplett groß geschrieben zurück und Du musst ihn dann nur gegen den komplett groß geschiebenen Wert vergleichen, somit könnte der Benutzer auch ‚aCht‘ eingeben.

Zu Deiner zweiten Frage:

Du könntest mehrere Wörter mit einem Zeilenumbruch trennen. Dies machst du über die Ascii-Zeichen 13 und 10. Würde so aussehen

s:='skri' +#13#10+ 'Wort mit anderer Bedeutung'

Die Memofrage verstehe ich nicht ganz. Daher lasse ich Dir hier mal einen Code-Schnipsel, der Dir hoffentlich weiterhilft. In diesem Siehst du, wie Du Zeilen an das Memo anfügst, ohne dass Du den existierenden Text überschreibst. Ich hoffe, das hilft.

procedure TForm1.Button1Click(Sender: TObject);
var
 s: string;
begin
 s := edit1.Text;

 memo1.Lines.Add('eingegebenes Wort: ' + s);

 memo1.Lines.Add('Bedeutung des Wortes: ');
 if (s='8') or (s='acht') or (s='Acht') then
 memo1.Lines.Add('skri');

 if (s='8') or (s='blah') or (s='blubb') then
 memo1.Lines.Add('trullalla');

 memo1.Lines.Add(''); // 

Gruß Jan

Ein zweites Fenster würdest Du z.B. so öffnen können:

 form2 := tForm2.Create(self);
 try
 form2.Memo1.Text := Memo1.Text;
 form2.ShowModal;
 finally
 freeandnil(form2);
 end; 

Du musst vorher über Datei/neues Formular ein neues Formular anlegen.

>if s=‚8‘ or ‚acht‘ or ‚Acht‘ then s:=‚skri‘;

Probier mal:

if s = ‚8‘ or lowercase(s) = lowercase(‚acht‘) then…

Dann ist die Groß-/Kleinschreibung bei der Eingabe egal.

.

Hallo, DarkJosi!

Also ich wollte mir jetzt vor einer Weile mal ein kleines
Wörterbuch programmieren, der Anfang ist auch schon getan, ich
habe bereits alle Worte drinne, und die werden mir bei der
Eingabe auch ausgegeben.

ich wollte jetzt einerseits wissen, wie ich es machen kann
dass es das Wort erkennt, egal ob groß oder klein geschrieben.

Also um das mal an einem Beispiel zu erklären, bei der
Übersetzunge der Zahl „8“ habe ich jetzt als befehl eingegeben

if s=‚8‘ then s:=‚skri‘;

ich würde jetzt aber auch gerne dass ‚skri‘ auch dann
ausgegeben wenn ich ‚Acht‘ oder ‚acht‘ eingeben, bisher hab
ich es jetzt erstmal so gemacht das ich alles noch mal neu
eingegeben habe, also das ich dann quasi 3 Zeilen dafür habe,
kann ich dass auch irgendwie zusammen in einen befehl mache??
ich habe es versucht mit

if s=‚8‘ or ‚acht‘ or ‚Acht‘ then s:=‚skri‘;

So geht das nicht! Du musst jedes mal s=’’ mit angeben! Also:
if s=‚8‘ or s=‚acht‘ or s=‚Acht‘…
Zur Vereinfachung würde ich die Funktion lowercase verwenden:
if s=‚8‘ or lowercase(s)=‚acht‘ then …

So 2. Man hat ja teilweise mehrere Übersetzungsmöglichkeiten
für ein Wort, ich würde gerne das diese Untereinander
ausgegeben würden… aber irgendwie klappte das bei mir nicht
so richtig… was muss ich dafür also eingeben???

Wie hast Du denn die Definitionen abgelegt? Alle Übersetzungen eines Wortes mit Komma oder Semikolon getrennt in einem String? Dann müsstest Du mit substr nach einem Teilstring der Definition suchen.
Angenommen, Du hättest ein Wort gefunden und wolltest alle Möglichen Übersetzungen ausgeben, die es für das gesuchte Wort gibt, dann müsstest Du in einer while-Schleife nach Semikolons suchen und alles zwischen zwei Semikolons bzw. zwischen Anfang und dem ersten Semikolon jeweils in eine Zeile ausgeben.

und nun zur letzten Frage, ich hätte gern dass man mir die
gramatik der jeweiligen Sprache anzeigt (also in einem neuen
Fenster). Ich kenne bisher nur die ‚Memo‘ - komponente, die
müsste dafür geeignet sein?? wenn ja wie baue ich das ein,
damit mir dann eben zum schluss das ganze angeziegt wird.
bisher hat sich bei allem wes ich gemacht hat diese
Memokomponente immer konsequent geweigert mir zu zeigen was
ich davor eingetippt habe (also bezogen jetzt auf andere
programme bei denen ich das ‚Memo‘ gebraucht habe).

alsi ich hoffe ihr könnt mir helfen :smiley:

Was stellst Du dir denn überhaupt unter „Grammatik anzeigen“ vor?

Leider kann ich den Rest Deiner Erklärungen nicht ganz nachvollziehen. Aber ich hoffe ich konnte Dir schon ein wenig weiterhelfen und andere waren vielleicht intelligenter als ich.

Viele Grüß

Thomas

ich wollte jetzt einerseits wissen, wie ich es machen kann
dass es das Wort erkennt, egal ob groß oder klein geschrieben.

das machst du entweder mit AnsiLowerCase:

if AnsiLowerCase(s) = ‚acht‘

oder mit: if AnsiUpperCase(s) = ‚ACHT‘

Also um das mal an einem Beispiel zu erklären, bei der
Übersetzunge der Zahl „8“ habe ich jetzt als befehl eingegeben

if s=‚8‘ then s:=‚skri‘;

ich würde jetzt aber auch gerne dass ‚skri‘ auch dann
ausgegeben wenn ich ‚Acht‘ oder ‚acht‘ eingeben, bisher hab
ich es jetzt erstmal so gemacht das ich alles noch mal neu
eingegeben habe, also das ich dann quasi 3 Zeilen dafür habe,
kann ich dass auch irgendwie zusammen in einen befehl mache??
ich habe es versucht mit

if s=‚8‘ or ‚acht‘ or ‚Acht‘ then s:=‚skri‘;

hier musst du zumindest schreiben:

if (s=‚8‘ or AnsiLowerCase(s)=‚acht‘) then …

aber das hat irgendwie nicht geklappt… wie genau kann ich
das also machen???

So 2. Man hat ja teilweise mehrere Übersetzungsmöglichkeiten
für ein Wort, ich würde gerne das diese Untereinander
ausgegeben würden… aber irgendwie klappte das bei mir nicht
so richtig… was muss ich dafür also eingeben???

und nun zur letzten Frage, ich hätte gern dass man mir die
gramatik der jeweiligen Sprache anzeigt (also in einem neuen
Fenster). Ich kenne bisher nur die ‚Memo‘ - komponente, die
müsste dafür geeignet sein?? wenn ja wie baue ich das ein,
damit mir dann eben zum schluss das ganze angeziegt wird.
bisher hat sich bei allem wes ich gemacht hat diese
Memokomponente immer konsequent geweigert mir zu zeigen was
ich davor eingetippt habe (also bezogen jetzt auf andere
programme bei denen ich das ‚Memo‘ gebraucht habe).

alsi ich hoffe ihr könnt mir helfen :smiley:

bei deinen weiterne Fragen weiß ich nicht genau, was du meinst bzw wie du dir das vorstellst.

LG