Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Selbstprogrammierung eines Vokabeltrainers (https://www.delphipraxis.net/180545-selbstprogrammierung-eines-vokabeltrainers.html)

Soph6297 27. Mai 2014 20:22

Selbstprogrammierung eines Vokabeltrainers
 
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Abend! :hi:

Schlussendlich habe ich jetzt doch meinen Weg hierher gefunden, da ich mit meinen bisherigen Kenntnissen leider nicht weiterkomme.
Wir haben in der Schule die Aufgabe bekommen ein Programm mit Delphi 6 selbst zu schreiben, uns blieb dabei überlassen, welche Art von Programm wir erstellen.
Ich habe mich für eine Art Vokabeltrainer entschieden, allerdings mit Geschichtsjahreszahlen/-ereignissen.

Ich habe bereits mit dem Schreiben des Quelltextes begonnen und möchte einmal kurz umreißen, wie ich mir das Programm vorgestellt habe (Formular s. Anhang);
Ich habe eine separate Textdatei (war Pflicht bzw. eine typisierte Datei), deren Inhalt ich in die ListBox hochlade. Der Inhalt besteht aus geschichtlichen Ereignissen, wie z.B. die Kaiserkrönung Napoleons. Die ListBox ist beim Ausführen des Programms nicht sichtbar. Eine Zeile der Textdatei wird zufällig in das Panel geladen und zu diesem Ereignis muss dann später die passende Jahreszahl eingegeben werden (Edit-Feld).
Anleitung- und Abbruch-Button sind an der Stelle nicht weiter relevant.
Durch Klick auf den "Neues Ereignis" Button soll zufällig ein neues Ereignis aus der Textdatei in das Panel geladen werden (funktioniert soweit!).
Durch Klick auf den "Ok"-Button soll geprüft werden, ob die eingegebene Jahreszahl mit dem Ereignis übereinstimmt.
Und da komme ich nicht weiter...
Mein bisheriger Quelltext lautet:

Code:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    AbbruchButton: TBitBtn;
    JahreszahlEdit: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    BitBtn1: TBitBtn;
    EreignisButton: TBitBtn;
    AnleitungButton: TBitBtn;
    ListBox1: TListBox;
    EreignisPanel: TPanel;
    procedure AbbruchButtonClick(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure AnleitungButtonClick(Sender: TObject);
    procedure EreignisButtonClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
var Jahreszahl:Integer;
procedure TForm1.AbbruchButtonClick(Sender: TObject);
begin
close
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Jahreszahl:=StrToInt(JahreszahlEdit.Text);


end;

procedure TForm1.AnleitungButtonClick(Sender: TObject);
begin
ShowMessage('Wie funktioniert dieser Trainer?'+#13+'Durch das Klicken auf den Button "Neues Ereignis" wird zufällig ein geschichtliches Ereignis ausgewählt'+#13+ 'und unter dem Wort "Ereignis" angezeigt. Ihre Aufgabe ist es nun die richtige Jahreszahl des angezeigten Ereignisses anzugeben,indem sie die Jahreszahl in das Feld unterhalb der Wörter "Gesuchte Jahreszahl" eingeben.'+#13+'Mit Klick auf den "Ok"-Button bestätigen Sie Ihre Eingabe und Sie werden darüber informiert, ob Ihre Eingabe richtig war.'+#13+'Mit einem erneuten Klick auf den "Neues Ereignis"-Button wird das nächste Ereignis angezeigt.');
end;

procedure TForm1.EreignisButtonClick(Sender: TObject);
var zufall:Integer;



begin

ListBox1.Items.LoadFromFile('TextEreignis.txt');

randomize;
zufall:=random(ListBox1.Items.Count);
EreignisPanel.Caption:=ListBox1.Items.Strings[Zufall];




end;

end.
Wie ist es mir möglich (wenn überhaupt?), dass das Programm feststellt, ob die eingegebene Jahreszahl mit dem zufällig gewählten Ereignis aus der Textdatei übereinstimmt?
Wäre dankbar für eure Denkanstöße! :)

MfG
Soph6297

Perlsau 27. Mai 2014 21:19

AW: Selbstprogrammierung eines Vokabeltrainers
 
Würdest du mal kurz erläutern, was du unter "typisierte Datei" vor dem Lesen der verlinkten Anleitung und dann nochmal kurz, was du nach dem Lesen des Tutorials darunter verstehst? Denn mit einer Listbox eine typisierte Datei laden zu wollen erscheint mir doch etwas arg naiv. Wenn du dem Link folgst, erhältst du eine umfassende Einführung in typisierte Dateien. Dein gezeigter Code ist auf keinen Fall bereit, eine typisierte Datei entgegenzunehmen, denn es fehlt – genau, du hast's erfaßt! – der Record.

Da fällt mir noch ein: Wieso schreibst du nicht ein Programm auf der Basis dessen, was ihr in der Schule gelernt habt? Man erwartet doch sicher nicht von dir, Programmiertechniken einzusetzen, die man dir nicht zuvor beigebracht hat, oder?

Dejan Vu 28. Mai 2014 07:17

AW: Selbstprogrammierung eines Vokabeltrainers
 
Er liest eine Textdatei in eine Listbox ein. Wo ist da das Problem? Die Vorgabe war 'Textdatei oder typisierte Datei'.

Textdateien sind bei einfachen Sachen vorzuziehen, das man sie mit jedem Notepad-Derivat bearbeiten kann.

In deiner Textdatei muss neben dem Text, der das geschichtliche Ereignis beschreibt, auch die Jahreszahl stehen.
Damit das Programm die beiden Werte voneinander unterscheiden kann, sollte man sie markieren, z.B. mit einem Trennzeichen: "1939;Beginn des 2.Weltkrieges"

Damit kannst Du die Daten aber nicht einfach so ins Ereignispanel schreiben, sondern musst vorher Jahr von Ereignis trennen,

Delphi-Quellcode:
// Statt
// EreignisPanel.Caption:=ListBox1.Items.Strings[Zufall];
  TrenneJahrUndEreignis (ListBox1.Items.Strings[Zufall], FJahr, Ereignis);
  EreignisPanel.Caption := Ereignis;
...
'Ereignis' ist eine lokale String-Variable (die musst Du deklarieren, weißt Du, wo?)
'FJahr' ist ein privates Feld. Weißt Du auch, wo du das deklarieren musst?

Im OnClick des OK-Buttons vergleichst Du nun die Jahreszahleinfabe mit dem Feld 'FJahr' und gibst eine entsprechende Meldung aus.

Ach, trennen musst Du ja noch:
Delphi-Quellcode:
Procedure TForm1,TrenneJahrUndEreignis (text : String; Var jahr, ereignis : string);
Begin
  ...
  jahr := ...
  ereignis := ...
End;
Hier wird dir 'Pos' und 'Copy' weiterhelfen, und die Tatsache, das z.B. das Semikolon Jahr und Ereignis trennt.

Mehr Hilfe gibt es aber nicht :-)

DeddyH 28. Mai 2014 07:25

AW: Selbstprogrammierung eines Vokabeltrainers
 
Delphi-Referenz durchsuchenTStrings.Values und Delphi-Referenz durchsuchenTStrings.Names könnten auch hilfreich sein, dann muss man nicht selbst mit Stringfunktionen herumhantieren, sofern die Datei das entsprechende Format hat.

Perlsau 28. Mai 2014 07:29

AW: Selbstprogrammierung eines Vokabeltrainers
 
Zitat:

Zitat von Dejan Vu (Beitrag 1260539)
Ach, trennen musst Du ja noch:
Delphi-Quellcode:
Procedure TForm1,TrenneJahrUndEreignis (text : String; Var jahr, ereignis : string);
Begin
  ...
  jahr := ...
  ereignis := ...
End;
Hier wird dir 'Pos' und 'Copy' weiterhelfen, und die Tatsache, das z.B. das Semikolon Jahr und Ereignis trennt.

Mehr Hilfe gibt es aber nicht :-)

Also wenn schon liest man das nicht in eine unsichtbare Listbox ein und trennt dann mühevoll via Pos und Copy, sondern verwendet gleich zwei lokal deklarierte Stringlisten, wovon die eine zur Trennung der Werte der CSV-Datei dient. Das Ergebnis kommt dann in ein entsprechendes Record-Array, so daß Jahr und dazugehörendes geschichtliches Ereignis stets durch dieselbe ID verbunden sind. Auf die ID kann man dann locker einen Zufallsgenertator ansetzen.

DeddyH 28. Mai 2014 08:00

AW: Selbstprogrammierung eines Vokabeltrainers
 
Meine Variante kommt mit einer Stringliste aus.

Dejan Vu 28. Mai 2014 08:14

AW: Selbstprogrammierung eines Vokabeltrainers
 
Wollen wir den Fragesteller weiter verwirren? Ich wollte wirklich seinen unvollkommenen Ansatz nehmen und ihn nur minimalinvasiv in die richtige Richtung stupsen. Wenn er mit Stringlisten ankommt, die sein Lehrer vielleicht nicht auf dem Schirm hat, gibt es vielleicht Probleme. Schon das Einführen einer Prozedur hat mich Überwindung gekostet, denn es gibt ja Programmierer (und Lehrer halten sich dafür), die Prozeduren nur verwenden, um DRY zu vermeiden, aber nicht, um lesbaren Code zu schreiben.

Ich geh jetzt Kollegen ärgern ('Arbeiten').

DeddyH 28. Mai 2014 08:55

AW: Selbstprogrammierung eines Vokabeltrainers
 
Ich meinte mit "Stringliste" nicht zwingend TStringlist, sondern allgemein jeden TStrings-Abkömmling, der die oben genannten Methoden bereitstellt, meinetwegen also auch TListBox.Items.

Soph6297 28. Mai 2014 13:48

AW: Selbstprogrammierung eines Vokabeltrainers
 
Zitat:

Zitat von Perlsau (Beitrag 1260510)
Würdest du mal kurz erläutern, was du unter "typisierte Datei" vor dem Lesen der verlinkten Anleitung und dann nochmal kurz, was du nach dem Lesen des Tutorials darunter verstehst? Denn mit einer Listbox eine typisierte Datei laden zu wollen erscheint mir doch etwas arg naiv. Wenn du dem Link folgst, erhältst du eine umfassende Einführung in typisierte Dateien. Dein gezeigter Code ist auf keinen Fall bereit, eine typisierte Datei entgegenzunehmen, denn es fehlt – genau, du hast's erfaßt! – der Record.

Da fällt mir noch ein: Wieso schreibst du nicht ein Programm auf der Basis dessen, was ihr in der Schule gelernt habt? Man erwartet doch sicher nicht von dir, Programmiertechniken einzusetzen, die man dir nicht zuvor beigebracht hat, oder?

Ich arbeite, wie Dejan Vu erkannt hat, mit einer Textdatei. Wir hatten die Auswahl zwischen einer typisierten Datei und einer Textdatei; ich habe mich allerdings für eine Textdatei entschieden, da ich damit besser klar komme.
Es wird zwar von uns erwartet uns bereits bekanntes Wissen anzuwenden, allerdings auch, neues Wissen mit einzubinden, was wir vorher noch nicht behandelt haben.

@ Dejan Vu:
Danke für die bisherige Hilfe;
Zitat:

'FJahr' ist ein privates Feld.
Mh, nein tut mir leid. Ich habe leider keine Idee, wo ich ein privates Feld deklariere; nach implementation?


Also hätte ich jetzt die Möglichkeit entweder mit pos und copy zu arbeiten oder mit einer CSV-Datei (von der ich leider noch nie etwas gehört habe)? Ebenso wenig habe ich Erfahrung mit TString aus.
Lässt es sich denn empfehlen mit Pos und Copy zu arbeiten?

Danke!
MfG

DeddyH 28. Mai 2014 13:58

AW: Selbstprogrammierung eines Vokabeltrainers
 
Ein privates Feld deklariert man im private-Abschnitt der Klasse, zu der es gehören soll. In üblicher Nomenklatur stellt man dem Bezeichner ein F voran. Beispiel:
Delphi-Quellcode:
type
  TDings = class
  private
    FIntwert: integer;
  end;
FIntwert ist somit ein privates Feld vom Typ integer der Klasse TDings. Zu den TStrings: da Du eine Listbox verwendest, hast Du diese TStrings bereits verfügbar, nämlich in deren Items-Eigenschaft.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:09 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz