Einzelnen Beitrag anzeigen

urs.liska

Registriert seit: 6. Aug 2003
Ort: Freiburg
195 Beiträge
 
Delphi 6 Professional
 
#2

Re: Zugriff auf Datenbank funktioniert nicht richtig

  Alt 24. Jan 2005, 13:37
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
  Mit Zitat antworten Zitat