![]() |
Datenbank: Access • Version: office 16 • Zugriff über: OLEB Provider Microsoft Jet
Datenbank- Quiz programmieren
Liste der Anhänge anzeigen (Anzahl: 1)
Hallöchen, ich bins wieder, falls jemand meinen letzten Beitrag schon kennt. :-D
Ich muss am 17.3. mein Projekt in der Schule abgeben und fühle mich langsam gestresst.. hänge an einen Knackpunkt. Wenn ich den habe, dann bin ich fast fertig. Hoffe auf eure Hilfe..:oops: Bevor Fragen kommen, JA i hab ich schon oben deklariert als integer.. Mein Ziel ist es, dass die Fragen aus der Datenbank ausgelesen werden Die Frage erscheint im Caption Feld von der Radio Group und die Antwortmöglichkeiten in den RadioButtons.. Nun soll beim Click auf 'nächste Frage' die nächste kommen, aber das passiert nicht.. es kommt keine Fehler meldung und das Programm läuft auch.. nur kommt halt keine neue Frage/bzw Antworten Das einzige derzeit ist, dass die erste Frage zwar erscheint, aber die Antwortmöglichkeiten von einer anderen Frage stammen.. Programmieren liegt mir einfach nicht.. Ein Bild zur Vorstellung hänge ich wieder mit an! hier der Quelltext:
Delphi-Quellcode:
procedure TFormle.ButtonnextClick(Sender: TObject);
var query:ANSIstring; i:integer; begin if lb.ItemIndex >=0 then begin rg.Visible:=true; Datamodule1.ADOQuery6.SQL.Clear; Datamodule1.ADOQuery7.SQL.Clear; Datamodule1.ADOQuery6.SQL.Text:='SELECT Frage FROM Fragen WHERE Fach = ' +#39+lb.Items.Strings[lb.ItemIndex]+#39 + ' AND Schwierigkeit="1";'; Datamodule1.ADOQuery6.Open; Datamodule1.ADOQuery7.SQL.Text:= 'SELECT L1, L2, L3 FROM Fragen WHERE Fach = ' +#39+lb.Items.Strings[lb.ItemIndex]+#39 + ' AND Schwierigkeit="1";'; Datamodule1.ADOQuery7.Open; for i:=0 to 10 do while not (Datamodule1.ADOQuery6.Eof) and (Datamodule1.ADOQuery7.Eof) do Datamodule1.ADOQuery6.Next; Datamodule1.ADOQuery7.Next; //Frage in "Titel" rg.Caption:= Datamodule1.ADOQuery6.Fields[0].AsString; //Antworten in Radiobuttons rg.Items.Clear; rg.Items.Add(Datamodule1.ADOQuery7.Fields[0].AsString); rg.Items.Add(Datamodule1.ADOQuery7.Fields[1].AsString); rg.Items.Add(Datamodule1.ADOQuery7.Fields[2].AsString); i:=+1; end else begin application.MessageBox('Auswahlfehler!','Fehler'); end; end; |
AW: Datenbank- Quiz programmieren
Du hast da im Prinzip 0 Fehlerbehandlung drin. Damit fängt es schon an. Dann würde das korrekte Einrücken des Codes auch alles für dich verständlicher machen denke ich.
Wofür 2 Queries? Ich gebe dir mal einen Tipp. Benutz mal die "Automatische Einrückung" (STRG+D). Vielleicht findest du einen der Fehler dann schon selber. |
AW: Datenbank- Quiz programmieren
Zitat:
Ich finde meinen quelltext selber persönlich nicht unübersichtlich.. das extreme einrücken ist für mich tatsächlich viel unüberischtlicher.. 2 Queries hab ich deswegen, weil ich persönlich denke, da es sich einmal nur um die Frage handelt und dann um die Antwortmöglichkeiten.. deswegen 2 einzelne.. brauche ja 2 verschiedene Ausgaben im SELECT Befehl.. ist das falsch? Automatische Einrückung funktioniert nicht, hab es probiert. Und nein, meine Fehler finde ich nicht selber, da ich schon seit einigen Tagen versuche das Problem zu lösen und immer noch zu keiner Antwort gekommen bin.. ein Klassenkamerad konnte mir auch nicht helfen.. deswegen frage ich hier |
AW: Datenbank- Quiz programmieren
Zitat:
Rück mal alles händisch korrekt ein dann findest du einen der Fehler. Zitat:
Ich möchte dich nicht ärgern. Ich möchte nur, dass du genau hinguckst ;) |
AW: Datenbank- Quiz programmieren
Beispielhaft mal 3 Zeilen, aber korrekt eingerückt:
Delphi-Quellcode:
Fällt Dir da etwas auf?
while not (Datamodule1.ADOQuery6.Eof) and (Datamodule1.ADOQuery7.Eof) do
Datamodule1.ADOQuery6.Next; Datamodule1.ADOQuery7.Next; [Bemerkung] Das sind wahrscheinlich gleich 2 Fehler in 3 Zeilen [Bemerkung] |
AW: Datenbank- Quiz programmieren
Zitat:
|
AW: Datenbank- Quiz programmieren
Zitat:
Zitat:
![]() Wenn deine Lehrerin oder dein Lehrer nicht über Begin, End und Blöcke gesprochen hat, am besten direkt ersetzen. |
AW: Datenbank- Quiz programmieren
Zitat:
Delphi-Quellcode:
Sicher, dass das so stimmt?
while (not (Datamodule1.ADOQuery6.Eof)) and (Datamodule1.ADOQuery7.Eof) do
|
AW: Datenbank- Quiz programmieren
Denk bitte nicht, dass wir dich hier ärgern wollen. Aber es ist auch ein gewisser Grad an Mitarbeit erwünscht.
[OT]Ich gehe einfach mal davon aus, dass der Lehrer das Basiswissen nicht vermittelt oder nicht korrekt vermittelt. Genau sowas hier ist dann der Grund, warum viele Delphi anschließend hassen[/OT] |
AW: Datenbank- Quiz programmieren
Zitat:
und ja, ich arbeite auch gerne mit und bemühe mich ja, aber wenn ICH selber nichts finde und keine ahnung habe... weiß halt dann auch nicht weiter.. |
AW: Datenbank- Quiz programmieren
Zitat:
|
AW: Datenbank- Quiz programmieren
Eventuell hier nachlesen. Lass alles bis zum Thema if-Anweisungen weg. Das brauchst du jetzt gerade noch nicht.
![]() |
AW: Datenbank- Quiz programmieren
Zitat:
"AdoQuery.Next" nicht funktioniert, da dort ja eigentlich dann der nächste eintrag aus der datenbank ausgewählt werden sollte.. aber das funktioniert halt nicht ich hab davir schon 6 verschiedene units programmiert, wo Login Daten gespeichert werden, wo man neue Einträge in die DB hinzufügen und bearbeiten kann, also hab ich "grundlegende erfahrungen".. nur das jetzt will irgendwie nicht funktionieren und ich selbst finde diesmal nicht den knackpunkt. |
AW: Datenbank- Quiz programmieren
Zitat:
Zitat:
|
AW: Datenbank- Quiz programmieren
Nochmal: deine Schleifenbedingung bedeutet, dass AdoQuery6 nicht am letzten Datensatz angekommen sein darf, AdoQuery7 aber muss. Und durch den fehlenden begin-end-Block wird nur eins der beiden Queries angesprochen. Korrigier das jetzt erst einmal, dann sehen wir weiter.
|
AW: Datenbank- Quiz programmieren
Gut, wenn "schau mal genau hin" nicht hilft, dann sind Dir die "Spielregeln" anscheinend nicht klar.
Bringt es nun etwas, Dir zu sagen, mach da mal Begin End oder andere Klammerung drum? Der Code würde laufen, aber in der Prüfung bringt es Dich nicht weiter. Mein erster Tipp: Debuggen! Also zusehen, Schritt für Schritt, wie der Codezeiger durch Deinen Code läuft (und staunen) Das ist sehr lehrreich! Wenn du noch nie mit dem Debugger gearbeitet hast, 2 Möglichkeiten: 1. einfach loslegen, F7, F8 und vielleicht ein paar Brakepoints und los geht die Reise 2. Debug Ausgaben ala "ich bin jetzt bei dem Schritt 'query.next'" in ein Memofeld eintragen 2. kann man sehr dosiert machen und es reicht trotzdem zum Staunen. Besonders wenn man sieht, wo es lang geht und man immer noch nicht begreift warum. Nervig und vielleicht quälend aber lehrreich. |
AW: Datenbank- Quiz programmieren
ich hab es jetzt so gemacht. Jetzt bleibt die Radiogroupbox aber komplett leer und zeigt weder frage noch antworten an
Delphi-Quellcode:
for i:= 0 to 10 do
begin Datamodule1.ADOQuery6.First; Datamodule1.ADOQuery7.First; while (not (Datamodule1.ADOQuery6.Eof) and (Datamodule1.ADOQuery7.Eof)) do begin Datamodule1.ADOQuery6.Next; Datamodule1.ADOQuery7.Next; //Frage in "Titel" rg.Caption:= Datamodule1.ADOQuery6.Fields[0].AsString; //Antworten in Radiobuttons rg.Items.Clear; rg.Items.Add(Datamodule1.ADOQuery7.Fields[0].AsString); rg.Items.Add(Datamodule1.ADOQuery7.Fields[1].AsString); rg.Items.Add(Datamodule1.ADOQuery7.Fields[2].AsString); end; end; i:= i+1; |
AW: Datenbank- Quiz programmieren
Ich reagiere jetzt auf was anderes.
Was soll dieses
Delphi-Quellcode:
dort?
i:=+1;
Bzw das von dir abgeänderte
Delphi-Quellcode:
i:= i+1;
Es scheint wirklich so, als würdest du die Basis überhaupt nicht kennen und ihr, die Klasse, legt einfach drauf los. Für gewöhnlich lehrt man als Lehrpersonal erst einmal die grundlegenden Begriffe und und und. Und fängt nicht gleich ohne Grundwissen vermittelt zu haben mit Datenbanken an. |
AW: Datenbank- Quiz programmieren
Ja, die Klammerung von Query6 und 7 EOF ist immer noch fehlerhaft.
Ich wollte da noch eine Sache loswerden (ist ja auch schon angeklungen) Man könnte Frage und Antworten in einem Schwung laden, damit spart man sich das Handling von 2 Queries.. .. was meinst Du? Aber vielleicht eine blöde Idee, den Fehler zu vermeiden statt zu korrigieren... |
AW: Datenbank- Quiz programmieren
Setz mal einen Haltepunkt innerhalb der while-Schleife.
|
AW: Datenbank- Quiz programmieren
Ich schreibe es nur noch einmmal sicherheitshalber.
Hier möchte dich, auch wenn gerade gefühhlt auf dich eingedroschen wird, niemand ärgern. Es geht alleine darum, dass du etwas lernst und eventuelle Prüfungen bestehst. |
AW: Datenbank- Quiz programmieren
Vielleicht wäre es auch sinnvoller, den Code erst einmal zu vergessen und sich den Ablauf einmal klassisch auf Papier aufzuzeichnen, das kann ein Struktogramm, ein PAP oder einfach etwas eigenes sein, Hauptsache, man kann seinen Gedankengang später nachvollziehen. Wenn man dann der Meinung ist, dass das so funktioniert, formuliert man das dann in Code.
|
AW: Datenbank- Quiz programmieren
Zum Beispiel hier:
![]() Kann dann so aussehen ![]() |
AW: Datenbank- Quiz programmieren
hab nun die 2. query gelöscht. Nun wird die Frage auch im ersten Radiobutton angezeigt, und nicht nur im Titel.. (deswegen ja ursprünglich die 2 Queries)
Delphi-Quellcode:
if lb.ItemIndex >=0 then
begin rg.Visible:=true; Datamodule1.ADOQuery6.SQL.Clear; Datamodule1.ADOQuery6.SQL.Text:='SELECT Frage, L1, L2, L3 FROM Fragen WHERE Fach = ' +#39+lb.Items.Strings[lb.ItemIndex]+#39 + ' AND Schwierigkeit="1";'; Datamodule1.ADOQuery6.Open; Datamodule1.ADOQuery6.First; while not Datamodule1.ADOQuery6.Eof do begin Datamodule1.ADOQuery6.Next; //Frage in "Titel" rg.Caption:= Datamodule1.ADOQuery6.Fields[0].AsString; //Antworten in Radiobuttons rg.Items.Clear; rg.Items.Add(Datamodule1.ADOQuery6.Fields[0].AsString); rg.Items.Add(Datamodule1.ADOQuery6.Fields[1].AsString); rg.Items.Add(Datamodule1.ADOQuery6.Fields[2].AsString); end; end else begin application.MessageBox('Auswahlfehler!','Fehler'); end; |
AW: Datenbank- Quiz programmieren
Müsst ihr das mit einer Datenbank machen? Wenn nicht würde ich es mit einer Ini-Datei machen.
|
AW: Datenbank- Quiz programmieren
Zitat:
Ich möchte einfach nur, das beim klick eine neue frage mit neuen antworten aus meiner datenbank erscheint. mehr nicht.. kein checked:=true/false etc.. |
AW: Datenbank- Quiz programmieren
Zitat:
|
AW: Datenbank- Quiz programmieren
Zitat:
|
AW: Datenbank- Quiz programmieren
Wenn man in einer Schleife die gesamte Datenmenge durchläuft und anschließend die Daten anzeigt, welchen Datensatz stellt man dann dar? Den letzten, oder? Dann nützt dir auch kein „Weiter“-Button. Aber klar, Struktogramme usw. braucht man ja nicht.
|
AW: Datenbank- Quiz programmieren
Kannst du die Datenbankdatei und das Projekt mal hier anhängen?
|
AW: Datenbank- Quiz programmieren
Zitat:
|
AW: Datenbank- Quiz programmieren
Wahrscheinlich ist es noch niemanden aufgefallen:
Delphi-Quellcode:
So wird immer die zweite Antwort verarbeitet. Wenn es nur eine Gibt, macht es bumm!
Datamodule1.ADOQuery6.First;
while not Datamodule1.ADOQuery6.Eof do begin Datamodule1.ADOQuery6.Next; //Frage in "Titel" rg.Caption:= Datamodule1.ADOQuery6.Fields[0].AsString; //Antworten in Radiobuttons rg.Items.Clear; rg.Items.Add(Datamodule1.ADOQuery6.Fields[0].AsString); rg.Items.Add(Datamodule1.ADOQuery6.Fields[1].AsString); rg.Items.Add(Datamodule1.ADOQuery6.Fields[2].AsString); end; darum:
Delphi-Quellcode:
Und da auch einmal nichts zurück kommen könnte:
Datamodule1.ADOQuery6.First;
while not Datamodule1.ADOQuery6.Eof do begin //Frage in "Titel" rg.Caption:= Datamodule1.ADOQuery6.Fields[0].AsString; //Antworten in Radiobuttons rg.Items.Clear; rg.Items.Add(Datamodule1.ADOQuery6.Fields[0].AsString); rg.Items.Add(Datamodule1.ADOQuery6.Fields[1].AsString); rg.Items.Add(Datamodule1.ADOQuery6.Fields[2].AsString); Datamodule1.ADOQuery6.Next;{---- weiter zum nächsten Datensatz oder EOF} end;
Delphi-Quellcode:
Das gefällt mir besser, aber das ist Geschmackssache.
Datamodule1.ADOQuery6.First;
if Datamodule1.ADOQuery6.Eof then begin showmessage('Es wurden keine daten gefunden'); end else {---- es wurden Daten geliefert} repeat //Frage in "Titel" rg.Caption:= Datamodule1.ADOQuery6.Fields[0].AsString; //Antworten in Radiobuttons rg.Items.Clear; rg.Items.Add(Datamodule1.ADOQuery6.Fields[0].AsString); rg.Items.Add(Datamodule1.ADOQuery6.Fields[1].AsString); rg.Items.Add(Datamodule1.ADOQuery6.Fields[2].AsString); Datamodule1.ADOQuery6.Next;{---- weiter zum nächsten Datensatz oder EOF} until Datamodule1.ADOQuery6.Eof; Gruß K-H P.S. Damals als ich noch in die Schule ging gab es Lehrer, die den falschen Beruf gewählt hatten und Schüler die selbst mit einfachen logischen Zusammenhängen überfordert waren. Ich vermute heute ist es nicht wesentlich anders, darum sollten wir uns jeden Kommentar zur Berufung einer Lehrperson oder eines Schülers verkneifen. |
AW: Datenbank- Quiz programmieren
Wieso wird denn immer in einer Schleife das Dataset durchlaufen? Ich würde ja bei der ersten Frage öffnen und bei Click auf den Button dann eins weiter positionieren. Oder übersehe ich da etwas?
|
AW: Datenbank- Quiz programmieren
Jetzt verunsicherst Du mich. "normal" liefert eine Query 0..n Datensätze zurück. Bei 0 ist EOF gleich true.
bekommst Du 1..n Datensätze mußt Du mit .Next dadurch scrollen bis das EOF true ist wenn Du alle Datensätze haben willat. Aber wie läuft das mit den TDB...Komponenten? sind sind die hier im Einsatz? Ach ja .First ist direkt nach .Open nicht notwendig, da der Zeiger direkt auf dem ersten Datensatz steht. Dieser wird durch .Next erst auf den nächsten Datensatz verschoben. Gruß K-H |
AW: Datenbank- Quiz programmieren
Nach einem Open stehe ich auf dem ersten Datensatz oder auf Eof, wenn es keinen Datensatz gibt. Wozu jetzt die Schleife, ich will doch initial den ersten?
|
AW: Datenbank- Quiz programmieren
Gute Frage!
dann ist das also überflüssig und nicht nur ungeschickt. Gruß K-H |
AW: Datenbank- Quiz programmieren
Genau darauf will ich hinaus.
|
AW: Datenbank- Quiz programmieren
Moin...8-)
Zitat:
(Poppcorn hol...) ... interessante Diskussion. :stupid: @TE: Zitat:
Zitat:
|
AW: Datenbank- Quiz programmieren
hab es so programmiert, aber stehe immer noch vor dem gleichen Problem, beim click auf dem button bleibt die frage + Antworten immer die gleichen und zeigt nicht die nächsten an..
Delphi-Quellcode:
procedure TFormle.ButtonnextClick(Sender: TObject);
begin if lb.ItemIndex >=0 then begin rg.Visible:=true; Datamodule1.ADOQuery6.SQL.Clear; Datamodule1.ADOQuery6.SQL.Text:='SELECT Frage, L1, L2, L3 FROM Fragen WHERE Fach = ' +#39+lb.Items.Strings[lb.ItemIndex]+#39 + ' AND Schwierigkeit="1";'; Datamodule1.ADOQuery6.Open; if Datamodule1.ADOQuery6.Eof then begin showmessage('Keine Daten'); end else begin repeat //Frage in "Titel" rg.Caption:= Datamodule1.ADOQuery6.Fields[0].AsString; //Antworten in Radiobuttons rg.Items.Clear; rg.Items.Add(Datamodule1.ADOQuery6.Fields[1].AsString); rg.Items.Add(Datamodule1.ADOQuery6.Fields[2].AsString); rg.Items.Add(Datamodule1.ADOQuery6.Fields[3].AsString); Datamodule1.ADOQuery6.Next; until Datamodule1.AdoQuery6.Eof; end; end else begin application.MessageBox('Auswahlfehler!','Fehler'); end; |
AW: Datenbank- Quiz programmieren
Schick mal alles in einem zip-Archiv hier rüber bitte.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:57 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