![]() |
Zugriff auf Datenbank funktioniert nicht richtig
Aloha allerseits,
ich will mir ein kleines Lexikon basteln. Dazu habe ich ein Datenmodul eingefügt auf dem eine Table- und eine Source-Komponente platziert sind. Der TableType vom Table ist ttParadox. Dann hab ich ein Eingabeformular und ein Ansichtsformular. Auf dem Eingabeformular gibt es ein DBEdit (für den Begriff) und ein DBMemo (für die Erklärung). Auf dem Ansichtsformular gibt es eine DBListbox (in der sollen sämtliche Begriffe aufgelistet werden) und ein DBText (für die Erklärung). Nun möchte ich, dass beim Markieren eines Eintrages in der Listbox die dazugehörige Erklärung in dem DBText erscheint. Und da happerts. und zwar wird mir nur die Erklärung vom letzten zugefügeten Eintrag angezeigt, die anderen Begriffe haben als Erklärung dann immer MEMO bzw. wenn der letzte Eintrag markiert wird und danach die davor erstellten, haben diese dann die Erklärung vom letzten Eintrag. Das Hinzufügen eines Datensatzes realisier ich durch:
Code:
und der Zugriff dann auf die Erklärung durch
LexikonModul.LexikonTableBegriff.AsString:=Form3.DBEdit1.Text;
LexikonModul.LexikonTableErklaerung.AsString:=Form3.DBMemo1.Text; LexikonModul.LexikonTable.Post; Form1.DBListBox1.Items.Add(LexikonModul.LexikonTableBegriff.AsString);
Code:
Ich weiß es sind ein paar begin's und end's zuviel. Wär echt gut, wenn mir jemand sagen könnte, wie ich diesen Zugriff richtig hinkriege.
procedure TForm1.DBListBox1Click(Sender: TObject);
var x,i:integer; begriff:string; begin try for x:=0 to DBListBox1.Items.Count-1 do begin if DBListBox1.Selected[x] then begin begriff:=DBListBox1.Items.Strings[x]; for i:=0 to LexikonModul.LexikonTableBegriff.Index-1 do begin if begriff=LexikonModul.LexikonTableBegriff.AsString then Form1.DBText1.Caption:=LexikonModul.LexikonTableErklaerung.AsString; end; end; end; except showmessage('Fehler'); end; end; Kann es sein, dass ich immer nur den erstens Datensatz überschreibe? wenn ja, wie kann ich da ein Zähler oder was ähnliches einbauen, damit mir immer den nächsten Eintrag am einfügen und nicht den anderen überschreibe. |
Re: Zugriff auf Datenbank funktioniert nicht richtig
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:
Die Eigenschaft Sorted der Listbox sollte auf True gesetzt sein, dann wird die Liste sortiert.
Form1.ListBox1.AddItem(LexikonModul.LexikonTableBegriff.AsString, nil);
LexikonModul.LexikonTable.Post; 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:
Kurz gesagt (ohne Erklärungen) sollte die Methode wie folgt aussehen:
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.
Delphi-Quellcode:
Kurz, nicht?
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; 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 |
Re: Zugriff auf Datenbank funktioniert nicht richtig
Hey danke erstmal vielmals. Ich werd mir das nachher gleich mal anschauen und dann mal sehen, ob ich es hinbekommen oder doch noch hilfe benötige ;). Also danke nochmal.
|
Re: Zugriff auf Datenbank funktioniert nicht richtig
Also, ich hab das gerade mal ausprobiert mit den Tipps. Der Compiler bleibt aber bei der Zeile
Code:
hängen, mit der Meldung: Zu viel Parameter. Und er setzt den Cursor zwischen [].
if LexikonModul.LexikonTable.Locate('Begriff',VarArrayOf([begriff],[])) is false
then showmessage('Fehler'); |
Re: Zugriff auf Datenbank funktioniert nicht richtig
Zitat:
1. nie auf False vergleichen, kann daneben gehen! 2. du hast ein Klammerpaar [] falsch gesetzt.
Code:
Im Übrigen kannst du dir VarArrayOf sparen, wenn du nur einen Parameter benötigst.
if not LexikonModul.LexikonTable.Locate('Begriff',VarArrayOf([begriff]), [])
then showmessage('Fehler'); Grüße Mikhal |
Re: Zugriff auf Datenbank funktioniert nicht richtig
Hallo,
Versuch das mal
Code:
dann sollte es eigentlich funktionieren.
if LexikonModul.LexikonTable.Locate('Begriff',begriff,[])) is
|
Re: Zugriff auf Datenbank funktioniert nicht richtig
Sorry, aber ich komm grad gar nicht mit ;) Funktioniert so weit ohne Fehlermeldung, nur das mir die Erklärungen in dem DBText-Element noch nicht angezeigt werden.
|
Re: Zugriff auf Datenbank funktioniert nicht richtig
Sind die entsprechenden Eigenschaften des DBText (DataSource, DataField) richtig gesetzt?
MfG Urs |
Re: Zugriff auf Datenbank funktioniert nicht richtig
jupp sind se, also bei datafield steht als feld erklaerung drin,welches ja da och rein soll.
|
Re: Zugriff auf Datenbank funktioniert nicht richtig
kann mir wirklich keiner mehr helfen?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz