Autor Beitrag
nanashi
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 31



BeitragVerfasst: Fr 19.03.10 17:15 
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:

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:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Di 23.03.10 13: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:

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



BeitragVerfasst: Do 25.03.10 22: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Do 25.03.10 23:40 
user profile iconnanashi hat folgendes geschrieben Zum zitierten Posting springen:
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:

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



BeitragVerfasst: Fr 26.03.10 18:09 
ah danke. Das werd ich gleich mal ausprobieren.^^