Ich gebe zu, ich habe mir nicht die Mühe gemacht, Dein ganzes Beispiel durchzuackern,
aber:
Du verwendest die DBListbox falsch.
Diese Komponente ist dafür da, eine Auswahlliste für Werte anzuzeigen, die in ein Datenfeld eingetragen werden sollten. Wenn Du z.B. ein Feld "Kategorie" in der Tabelle hättest, könntest Du es mit einer DBListBox verknüpfen, deren Items dann z.B. "Wissenschaft", "Gesellschaft", "Wirtschaft" (oder was für Lexikonkategorien Du eben hast) sind. Der Benutzer kann dann beim Eintragen eines neuen Datensatzes aus dieser Liste wählen.
Was Du dagegen bräuchtest (wenn Du das Ganze überhaupt so realisieren willst), ist eine "normale" ListBox.
Dann schreibst Du nach dem (oder noch besser vor dem) Post
Delphi-Quellcode:
Form1.ListBox1.AddItem(LexikonModul.LexikonTableBegriff.AsString, nil);
LexikonModul.LexikonTable.Post;
Die Eigenschaft Sorted der Listbox sollte auf True gesetzt sein, dann wird die Liste sortiert.
Der Zugriff kann auch viel eleganter gelöst werden. Das Problem sind nicht die begin/ends, die zuviel sind, sondern die Tatsache, dass Du sowohl die Listbox als auch die Tabelle selbst von Hand durchsuchst. Das können die Komponenten selber (und wahrscheinlich besser).
Delphi-Quellcode:
procedure TForm1.ListBox1Click(Sender: TObject);
var x,i:integer;
begriff:
string;
begin
// statt
for x:=0
to DBListBox1.Items.Count-1
do
begin
if DBListBox1.Selected[x]
then
// schreibst Du}
i := ListBox1.ItemIndex
// Index der selektierten Zeile
// bzw. gleich
begriff := ListBox1.Items[ItemIndex]
// Inhalt der selektierten Zeile
// statt
begriff:=DBListBox1.Items.Strings[x];
for i:=0
to LexikonModul.LexikonTableBegriff.
Index-1
do
// Das ist übrigens ganz falsch. "Index" gibt hier die
// Nummer der Spalte an. Wenn also das Feld Begriff das dritte Feld der Tabelle ist,
// ist Index = 2 (fängt ja bei 0 an)
begin
if begriff=LexikonModul.LexikonTableBegriff.AsString
then
Form1.DBText1.Caption:=LexikonModul.LexikonTableErklaerung.AsString;
// Auch das ist falsch. Du sollst einem DBText keine Caption zuweisen.
// Die soll ja aus der DB ausgelesen werden.
end;
// schreibst Du:
if LexikonModul.LexikonTable.Locate('
Begriff', VarArrayOf([begriff], [])
is false
then showmessage('
Fehler');
// Locate sucht einen Datensatz in der Tabelle und macht diesen zum aktiven Datensatz.
// Indem der Datensatz aktiviert wird, werden auch alle datensensitiven Komponenten
// (in Deinem Fall DBText1) aktualisiert und sollten den entsprechenden Text anzeigen.
Kurz gesagt (ohne Erklärungen) sollte die Methode wie folgt aussehen:
Delphi-Quellcode:
procedure TForm1.ListBox1Click(Sender: TObject);
var begriff:string;
begin
begriff := ListBox1.Items[ItemIndex] // Inhalt der selektierten Zeile
if LexikonModul.LexikonTable.Locate('Begriff', VarArrayOf([begriff], []) is false
then showmessage('Fehler');
end;
Kurz, nicht?
Ich hoffe, dass so das richtige Verhalten erzielt wird.
Im Übrigen wäre es eleganter, ganz auf diese ListBox zu verzichten und statt dessen ein DBGrid zu verwenden.
Das DBGrid zeigt auf die gleiche DataSource, es wird aber nur das Feld Begriff angezeigt.
So hättest Du mit einer Tabelle, einer DataSource, einem DBGrid und einem DBText (oder auch DBMemo) die ganze Funktionalität ohne überhaupt Quellcode zu brauchen.
Viel Erfolg
Urs