[Delphi] Für die Schule ein Leistungsnachweis....

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von KingLui, 14. Dezember 2006 .

Schlagworte:
  1. 14. Dezember 2006
    Für die Schule ein Leistungsnachweis....

    Hallo ich muss für morgen einen Leistungsnachweis bringen in delphi. und zwar müssen wir ein programm schreiben mit alles befehlen die wir hatten...

    da sind z.b. repeat while for randomize close listboxen edit und halt so die kleinen sachen...

    ich habe probiert ein kleines Quiz zu machen.. unzwar habe ich gesgat das ein 2 listboxen die fragen und antworten geladen werden ... so und ich hab das so gemacht das die fragen beim programmstart geladen werden... man gibt seine antwort ein drück auf antwort überprüfen und man bekommt in einem popup ( show message ) gesagt obs richtig ode rfalsch ist, dannach kommt die nächste frage... mein problem oder wunsch ist es nach diesem quiz eine meldung zu zeigen das man das quiz abgeshclossen hat und besser wäre wie viele richtig und falsch sind... hat ener von euch sowas shconmal gemacht ode rhat tipps?

    mein source:
    so das klappt auch nur werden die fragen doppelt und dreifach geladen und das quiz geht nie zu ende... ich habe es mit der delete funktion hinbekommen das die fragen einmal geladen werden und nach 10 fragen das quiz zu ende ist... aber die fragen stimmen dann mit de rantwort nicht überein...

    hilfe....
     
  2. 14. Dezember 2006
    AW: Für die Schule ein Leistungsnachweis....

    Wie ist denn der Zusammenhang mit der gewählten Antwort in der Listbox mit der Variablen "nr"?
    Ist die erste antwort auch nr:=1?
     
  3. 14. Dezember 2006
    AW: Für die Schule ein Leistungsnachweis....

    jap in den beiden txt dateien sind die antworten und fragen in den gelichen zeilen...
     
  4. 14. Dezember 2006
    AW: Für die Schule ein Leistungsnachweis....

    Also noch mal kurz zur Verständnis. Beim Programmstart wird zufällig frage 1-9 in das Label geladen, und in dem edit soll dann die gleiche zeile (also nr) eingeben werden. Und du brachste jetzt nur noch ne zähl variable die die richtigen Antworten zählt`?
     
  5. 14. Dezember 2006
    AW: Für die Schule ein Leistungsnachweis....

    Setz am besten mit ListBox1.ItemIndex:=nr Die Auswahl auf die aktuelle Frage bzw Zeile im ListBox.

    Code:
    var
    correct: integer;
    incorrect: integer;
    
    procedure TForm1.Button2Click(Sender: TObject);
    
    begin
     if edit1.Text = listbox2.items[nr] then begin
     showmessage ('Das ist korrekt!')
     inc correct;
     end
     else begin
     showmessage ('Das ist leider nich korrekt') ;
     inc incorrect;
     end
     listbox2.items.delete(listbox1.itemindex);
     listbox1.items.delete(listbox1.itemindex);
     nr := random(9);
     listbox1.itemindex := nr;
     label1.caption := listbox1.items[nr] ;
     if (listbox1.items.count=0) then showmessage('Du hast '+inttostr(correct)+' Fragen richtig und '+inttostr(incorrect)+' Fragen falsch beantwortet.');
    end;
    dann stimmen die Antworten wieder ^^
     
  6. 14. Dezember 2006
    AW: Für die Schule ein Leistungsnachweis....

    Beim Create also Programmstrart werden fragen und antworten 1-10 geladen in den 2 listboxen.... die invisble sind... so... und die fragen sollen nur 1mal im quiz vorkomme sprich wenn eine frage beantwortet wurde aus der antwort txt datei soll die frage gelöscht werden und die nächste geladen werde , sodass nach 10 fragen das programm eine meldung zeigt wie viele fagrn falsch und wie viele richtig warn...
     
  7. 14. Dezember 2006
    AW: Für die Schule ein Leistungsnachweis....

    Du könnstest auch eine zählvariable mit intigrieren, das würde dann so etwa sein...

    Code:
    begin
     i:=0
     if edit1.Text = listbox2.items[nr] then 
     begin 
     showmessage ('Das ist korrekt!');
     i:=i+1;
     end 
     else showmessage ('Das ist leider nich korrekt') ;
     nr := random(9);
     label1.caption := listbox1.items[nr] ;
    end;
    und die ausgabe dann meinetwegen mit panel1.caption:=('Du hast'+ inttostr(i) +'richtige Antworten')
     
  8. 14. Dezember 2006
    AW: Für die Schule ein Leistungsnachweis....

    klappt irgendwie nich bzw kann ich so nich einbauen irgendwie ... ka ^^
     
  9. 18. Dezember 2006
    Zuletzt von einem Moderator bearbeitet: 15. April 2017
    AW: Für die Schule ein Leistungsnachweis....

    So ich habe es bnochmal versucht mit Kingkaos seinem tipp doch siehe da... wa swill delphi da von mir ?


    delphi.JPG
    {img-src: //home.arcor.de/enercy/delphi.JPG}
     
  10. 18. Dezember 2006
    AW: Für die Schule ein Leistungsnachweis....

    ich will ja nicht unhölich erschien aber was möchte der debugger dir mit "'(' erwartet aber Bezeichner 'correct' gefunden" sagen? Debuggermessages verstehen ist da A und O. ^^

    Man könnte auch sagen der Debugger will eine Klammer wo der Variablenname steht d.h. inc(correct);
    wobei inc für increase steht (steigern) Standartwert ist 1 man kann aber auch z.b. inc(correct,4); schreiben, dann werden correct 4 hinzugefügt. das gegenteil von inc ist dec (decrease) und wird genau so verwendet.

    man könnte der einfachheit halber auch correct:=correct+1; verwenden

    Aber trotzdem sry für meine mangelhaften Delphikenntnisse ^^
     
  11. 18. Dezember 2006
    AW: Für die Schule ein Leistungsnachweis....

    nö warum ihr versuch tmir zu helfen ich hab weniger ahnung ^^

    naja ich habe es jezz geschafft den code einzufügen und es läuft doch wenn die 10 Fragen druch sidn kommt diese meldung!

    Code:
    [Warnung] Unit1.pas(49): Variable 'incorrect' ist möglicherweise nicht initialisiert worden
    [Warnung] Unit1.pas(49): Variable 'correct' ist möglicherweise nicht initialisiert worden
    
    Code:
    procedure TForm1.Button2Click(Sender: TObject);
    var correct: integer;
     incorrect: integer;
    
    begin
    if edit1.Text = listbox2.items[nr] then showmessage ('Das ist korrekt!')
    else showmessage ('Das ist leider nich korrekt') ;
    nr := random(9);
     label1.caption := listbox1.items[nr] ;
     listbox2.items.delete(listbox1.itemindex);
     listbox1.items.delete(listbox1.itemindex);
     nr := random(9);
     listbox1.itemindex := nr;
     label1.caption := listbox1.items[nr] ;
    if (listbox1.items.count=0) then showmessage('Du hast '+inttostr(correct)+' Fragen richtig und '+inttostr(incorrect)+' Fragen falsch beantwortet.');
    
    end;
    


    das ist der code
     
  12. 18. Dezember 2006
    AW: Für die Schule ein Leistungsnachweis....

    die beiden variablen global definieren d.h. unter

    var
    Form1: TForm1;
    nr: integer;

    schreiben und aus der Prozedur raus nehmen

    z.b. so:

    var
    Form1: TForm1;
    nr: integer;
    correct: integer;
    incorrect: integer;
     
  13. 18. Dezember 2006
    AW: Für die Schule ein Leistungsnachweis....

    Okay danke klappt...

    aber... die richtig und falshc anzeige geht jezz aba die fragen stimmen jezz wied ernich tüberein!


    ich werd noch wahnsinnig....
     
  14. 18. Dezember 2006
    AW: Für die Schule ein Leistungsnachweis....

    das problem tritt auf, wenn deine zufallszahl größer ist, als die Anzhal der Felder in der ListBox1 (und 2).

    du kannst noch eine prüfung machen:

    Code:
    procedure TForm1.Button2Click(Sender: TObject);
    begin
     [COLOR="Red"]if nr < listbox1.items.count then begin[/COLOR]
     if edit1.Text = listbox2.items[nr] then begin
     showmessage ('Das ist korrekt!')
     inc correct;
     end
     else begin
     showmessage ('Das ist leider nich korrekt') ;
     inc incorrect;
     end
     listbox2.items.delete(listbox1.itemindex);
     listbox1.items.delete(listbox1.itemindex);
     [COLOR="Red"]end[/COLOR]
     nr := random(9);
     listbox1.itemindex := nr;
     label1.caption := listbox1.items[nr] ;
     if (listbox1.items.count=0) then showmessage('Du hast '+inttostr(correct)+' Fragen richtig und '+inttostr(incorrect)+' Fragen falsch beantwortet.');
    end;
    sollte "nr" also kleiner sein als die Anzahl der Items läuft alles normal ab falls nicht wird eine neue nummer generiert, aber nichts gelöscht. kleiner muss nr desshalb sein, weil das erste item den index 0 hat und nicht 1. musst du dir so vorstellen du hast nur 1 item, das hat den index 0 aber listbox1.count ist 1 sollte jetzt nr 1 sein (genau so groß wie count) findet er kein item mit dem index 1.

    EDIT: bei deinem neuen code hast du die generierung der neuen "nr" nach oben verlegt dann verleg auch das "listbox1.itemindex := nr;" nach oben unter "nr := random(9);" ode rlass das ganz weg und schreibe

    listbox2.items.delete(nr);
    listbox1.items.delete(nr);
     
  15. 18. Dezember 2006
    AW: Für die Schule ein Leistungsnachweis....

    Hab eich gemacht klappt auch aber jezz werden keine fragen geladen nur die erste !

    habe das

    Code:
     listbox2.items.delete(listbox1.itemindex);
     listbox1.items.delete(listbox1.itemindex);
    
    durch das

    Code:
     nr := random(9);
     listbox1.itemindex := nr;
    

    ersetzt jezz läd er keine fragen


    wenn ich es umgekehrt mache, dann stimmen die fragen mit den antworten nich überein!
     
  16. 19. Dezember 2006
    AW: Für die Schule ein Leistungsnachweis....

    Am besten lässt du das "listbox1.itemindex := nr;" weg. Aber nach dem du die Frage angezeigt hast und die Antwort geprüft hast musst du ja die Frage samt Antwort löschen.

    listbox2.items.delete(nr);
    listbox1.items.delete(nr);

    ungefähr so:

    Code:
    procedure TForm1.Button2Click(Sender: TObject);
    begin
     if nr < listbox1.items.count then begin
     if edit1.Text = listbox2.items[nr] then begin
     showmessage ('Das ist korrekt!')
     inc correct;
     end
     else begin
     showmessage ('Das ist leider nich korrekt') ;
     inc incorrect;
     end
     listbox2.items.delete(nr);
     listbox1.items.delete(nr);
     end
     nr := random(9);
     if nr < listbox1.items.count then label1.caption := listbox1.items[nr] ;
     if (listbox1.items.count=0) then showmessage('Du hast '+inttostr(correct)+' Fragen richtig und '+inttostr(incorrect)+' Fragen falsch beantwortet.');
    end;
     
  17. 20. Dezember 2006
    AW: Für die Schule ein Leistungsnachweis....

    Also ma schauen, ob ich dir weiterhelfen kann, is zwar schon ein bischen her, dass ich mit DELPHI programmiert hab, aber sollte noch klappen

    Code:
    unit Unit1;
    
    interface
    
    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls;
    
    type
    TForm1 = class(TForm)
    ListBox1: TListBox;
    ListBox2: TListBox;
    Button2: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Button3: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    private
    { Private-Deklarationen }
    public
    { Public-Deklarationen }
    end;
    
    var
    Form1: TForm1;
    nr: integer;
    correct: integer;
    incorrect: integer;
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.Button2Click(Sender: TObject);
    
    begin 
     if edit1.Text = listbox2.items[nr] then (* Die Sicherheitsabfrage, die KingKaos eingebaut hat, lass ich weg, ich lös das Problem anders *)
     begin
     showmessage ('Das ist korrekt!');
     inc(correct);
     end
     else 
     begin
     showmessage ('Das ist leider nich korrekt') ;
     inc(incorrect);
     end;
     listbox2.items.delete(listbox1.itemindex); // Erst die Fragen löschen, dann neue Anzeigen
     listbox1.items.delete(listbox1.itemindex);
     nr := random(listbox1.items.count) - 1; // Die -1 ist wichtig, damit ein gültiger Index dabei rumspringt
     if (nr < 0) then // Das ist nur dann der Fall, wenn der ItemCount = 0 ist
     begin
     showmessage('Du hast '+inttostr(correct)+' Fragen richtig und '+inttostr(incorrect)+' Fragen falsch beantwortet.');
     showmessage('Das Quiz ist zu Ende!');
     Button2.Enabled := false; // Das Quiz ist zu Ende, weitere Fragen auszuwerten würde zu einem Laufzeitfehler führen, den wir so elegant verhindern, da der Button nicht mehr geklickt werden kann.
     end
     else
     begin
     label1.caption := listbox1.items[nr] ;
     listbox1.itemindex := nr;
     end;
    end;
    
    procedure TForm1.Button3Click(Sender: TObject);
    begin
    close;
    
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    randomize;
    listbox1.Items.LoadFromFile('frage.txt');
    listbox2.Items.LoadFromFile('ant.txt');
    label1.caption := listbox1.items[nr] ;
    Button2.Enabled := true;
    correct := 0;
    incorrect := 0;
    end;
    
    
    end.
    Das sollte so eigentlich funktionieren, ich kann es im Moment nich überprüfen, weil ich kein DELPHI zur Hand habe.
    Wenn du das Quiz neustarten möchtest, füg einfach einen Button ein, der die procedure FormCreate aufruft.

    Bin gespannt, obs so klappt. Wenn ich das so durchgehe, sollte es funktionieren.

    Weihnachtliche Grüße vom Niederrhein(er)
     
  18. 20. Dezember 2006
    AW: Für die Schule ein Leistungsnachweis....

    okay danke an beide der codee von Niederrheiner hat sauber geklappt!

    aber was muss ich in den button "quiz neustarten" schreiben damit das quiz neu startet? sprich die procedur create neu aufgerufen wird?


    eine frage noch... kann ich auch einpaar andere Quize machen und ein fenster soll kommen beim öffnen des programms

    quiz 1 quiz 2

    dann uss man halt ein quiz auswählen und das quiz wird aufgerufen !

    mit der loadfromfile blabla.exe funktion einfach in die buttons schreiben?
     
  19. 20. Dezember 2006
    AW: Für die Schule ein Leistungsnachweis....

    Das mit dem Quizneustarten ist eigentlich recht simpel, muss man nur wissen:
    Wähle den Button aus. Du bekommst dann im Objekteditor (oder so ähnlich) die Eigenschaften angezeigt. Da gibt es dann noch einen zweiten Tab, Aktionen heißt der, glaube ich. Da kannst du dann alle Möglichen Aktionen sehen, auf die der Button reagieren kann. Da suchst du dir einfach Onklick raus und klickst in das freie Feld. Da kannst du dann ein dropdownmenu ausfahren, wo auch Form.Create drin steht. das wählst du aus, und dann macht der Button das, was in der Create-Funktion steht.

    Und mit dem Quiz auswählen: Ja, genau so.

    Ich würde das so lösen, dass du entweder ein neues Fenster aufrufst und diesen Aufruf mit in Form.Create schreibst (Also im Stile von ShowMessage, nur mit Auswahlmöglichkeiten.. ich weiß nich ob es sowas gibt musste mal googlen). Oder dir zwei Buttons erstellst, und die hier die Eigenschaft Tag benutzt. Dieser Wert wird von Delphi nicht benötigt, also kannst du ihn ohne Probleme verwenden. Beim Button für das Quiz 1 setzt du den dann auf 1 und beim anderen Button analog.
    Diese lässt du dann wie oben beschrieben auch wieder Form.Create ausführen.
    Dann fügst du anstatt der Ladefunktionen(in Form.Create) einfach folgenden Code ein:

    Code:
    if (Sender is TButton) then
    begin
     if ((Sender as TButton).Tag = 1) then
     begin
     listbox1.Items.LoadFromFile('frage1.txt');
     listbox2.Items.LoadFromFile('ant1.txt');
     QuizNeustartenButton.Tag := 1;
     end
     else
     if ((Sender as TButton).Tag = 2) then
     begin
     listbox1.Items.LoadFromFile('frage2.txt');
     listbox2.Items.LoadFromFile('ant2.txt');
     QuizNeustartenButton.Tag := 2;
     end;
    end
    else
    begin
     listbox1.Items.LoadFromFile('frage1.txt');
     listbox2.Items.LoadFromFile('ant1.txt');
     QuizNeustartenButton.Tag := 1;
    end;
    
    Jetzt wird standardmäßig erst das erste Quiz geladen und nur bei auswahl mit dem Button fürs Quiz 2 auch dieses. Und wenn man den Neustarten-Button drückt, wird auch nur das aktuelle Quiz neugestartet. weitere Quizzes könntest du immer wieder mit else if anhängen oder mit einer Switch-Verzweigung.

    Gruß Niederrheiner
     
  20. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.