Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Suchen des 2ten Wortes in einem Vokabelpaar in einer ListBox
nanashi - Fr 19.03.10 16:15
Titel: Suchen des 2ten Wortes in einem Vokabelpaar in einer ListBox
Hallo liebe Community.^^
Folgendes Problem:
Ich habe 2 Edits und eine ListBox. In der ListBox stehen Vokabelpaare und zwar:
Word1 = Word2
Wenn ich in Edit1 etwas eingebe (Word1), ist das Wort aus Edit1 das Suchwort und Word2 soll dann in Edit2 ausgegeben werden.
D.h. zuerst sucht er das Wort in der ListBox und dann gibt er die Übersetzung in Edit2 aus.
Das habe ich geschafft! Hab es in das Change-Ereignis des Edits geschrieben.
Nun möchte ich allerdings so etwas auch für Edit2.
D.h. Wenn ich in Edit2 etwas eingebe (Word2), dann soll er jetzt das 2te Wort suchen, also Word2 und nicht Word1, und mir stattdessen Word1 in Edit1 als Übersetzung ausgeben.
Nun meine Frage: Wie mach ich das???
Meine Procedure für Edit1 sieht wie folgt aus:
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:
| procedure TForm1.Edit1Change(Sender: TObject); var i,p: Integer; Gefunden: Boolean; Suchwort,s: string; begin Suchwort:=Edit1.Text; Suchwort:=trim(Suchwort); if Suchwort <>'' then begin Gefunden:=false; i:=-1; while (i<ListBox1.Items.Count-1)and not gefunden do begin Inc(i); if Pos(Suchwort,ListBox1.Items[i])=1 then Gefunden:=True; end; if Gefunden then begin ListBox1.ItemIndex:=i; s:=ListBox1.Items[ListBox1.ItemIndex]; p:=Pos('=',s); Delete(s,1,p+1); Edit2.Text:=s; end else ShowMessage('Suchwort wurde nicht gefunden'); end; end; |
Wie muss ich diesen Algorithmus ändern, dass es dann für Edit2 passt?? Ich hab irgendwie gerade überhaupt keine Ansätze oder Ideen. >.<
Habt ihr irgendwelche Vorschläge diesbezüglich für mich?? oder gar eine Lösung parat?
Lg nanashi
Yogu - Di 23.03.10 12:55
Hallo,
TStringList bietet Eigenschaften, über die auf Namen und Werte zugegriffen werden kann. Namen stehen einfach vor dem Gleichheitszeichen und die werte dahinter - genau wie in deiner Fragestellung.
Am einfachsten wäre es jetzt, in einer Schleife alle
StringList.Names bzw.
SringList.ValueFromIndex durchzugehen und sich den Index zu merken:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| for i := 0 to StringList.Count-1 do if StringList.Names[i] = Word1 then begin Word2 := StringList.ValueFromINdex[i]; Exit; end;
for i := 0 to StringList.Count-1 do if StringList.ValueFromIndex[i] = Word1 then begin Word2 := StringList.Names[i]; Exit; end; |
Da
TListBox.Strings diese Eigenschaften auch bietet, kannst du direkt über die ListBox darauf zugreifen. Schöner wäre es aber wie immer, die Logik von der Anzeige zu trennen und die Schlüssel-Werte-Paare in eine
TStringList zu packen.
Grüße,
Yogu
nanashi - Do 25.03.10 21:30
Danke für deine Antwort. Das hat mir sehr geholfen. Ich habe das Problem jetzt gelöst.
Was mir aber aufgefallen ist, ist das ich bei den beiden Edits die Algorithmen nicht in das change-ereignis schreiben darf ansonsten herscht chaos, da sich die Werte dann gegenseitig ständig ändern sobald sich in einem edit auch nur ein Buchstabe ändert.
Aber wenn man die Algorithmen in Button per click nutzt, funktioniert das super.^^
Vielen Dank nochmal.
Lg nanashi
Yogu - Do 25.03.10 22:40
nanashi hat folgendes geschrieben : |
| Was mir aber aufgefallen ist, ist das ich bei den beiden Edits die Algorithmen nicht in das change-ereignis schreiben darf ansonsten herscht chaos, da sich die Werte dann gegenseitig ständig ändern sobald sich in einem edit auch nur ein Buchstabe ändert. |
Deklariere einfach eine private Klassenvariable (in den
private-Teil der Deklaration von
TForm1), die angibt, ob gerade eine
OnChange-Funktion am laufen ist. Vor jeder dieser Funktionen prüfst du nun, ob die Variable gesetzt ist, denn dann kann abgebrochen werden :think:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure OnClickHandler; begin if OnClickCalled then Exit;
OnClickCalled := True; try finally OnClickCalled := False; end; end; |
Grüße,
Yogu
nanashi - Fr 26.03.10 17:09
ah danke. Das werd ich gleich mal ausprobieren.^^
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!