Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

Hilfe bei Programmieren mit Delphi 6

geoli / 8 Antworten / Baumansicht Nickles

Hallo,
ich hab vor kurzem mit delphi6 angefangen und wollte nun mal ein kleines Quiz programmiern.
Dabei stieß ich schnell auf das Problem wie dies anzufangen sei. Konkret, soll man in ein Feld die Antwort auf eine Frage eingeben können (ein Wort reicht) und der Computer soll nun überprüfen, ob dies das richtige Wort war.
Vielen Dank im Voraus für Deine Hilfe!!! geoli

bei Antwort benachrichtigen
Borlander geoli „Hilfe bei Programmieren mit Delphi 6“
Optionen
{
  Dabei stieß ich schnell auf das Problem wie dies anzufangen sei.
  ----------------------------------------------------------------
  bor: Hast Du Dir schon Gedanken darüber gemacht, wie die Fragen
       und Antworten gespeichert werden sollen?
       z.B. in einer INI-Datei (max. 32KB)
}
{
  Konkret, soll man in ein Feld die Antwort auf eine Frage eingeben
  können (ein Wort reicht) und der Computer soll nun überprüfen, ob
  dies das richtige Wort war.
  ----------------------------------------------------------------
  bor: Siehe folgende Ereignisprocedure...
       Die Procedure wird beim Klick auf die Btn_Answer:TButton
       ausgeführt und Vergleicht den in Edt_Answer:TEdit
       eingegebenen Text mit dem String Loesung. Anschließend wird
       Angezeigt ob die Antwort richtig oder falsch ist. Außerdem
       sollten z.B. die richtigen Antworten gezählt werden...
}

{ ... }
procedure TForm1.Btn_AnswerClick(Sender: TObject);
{ ... }
begin
  
{ ... }
  
if Edt_Answer.Text = Loesung { Loesung ist der Antwort-Sting }
    
then begin { Zweig "Richtig" }
      
ShowMessage('Richtig :-)');
      
{ Antwortzähler incrementieren oder Ähnliches }
    
end
    else begin
{ Zweig "Falsch" }
      
ShowMessage('Leider Falsch :-(');
      
{ Fehlerzähler incrementieren oder Ähnliches }
    
end;
end;
{ ... }

{
  CU Borlander
}

bei Antwort benachrichtigen
geoli Nachtrag zu: „Hilfe bei Programmieren mit Delphi 6“
Optionen

Hab´s versuch hat jedoch nicht ganz geklappt. Hier meine Unit1 vielleicht kannst du mir ja sagen worans liegt:
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
procedure Button1Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Kennedy: Word;

implementation



procedure TForm1.Button1Click(Sender: TObject);
begin
if Edit1.Text = Kennedy
then begin
ShowMessage('Richtig')
end
else begin
ShowMessage('Leider falsch')
end;

end;

end.

Vielleicht kannst du mir ja noch sagen, wie man das mit dem Antwortspeichern in einer INI-Datei macht.
Vielen Dank für die bisherige Hilfe, wäre schon wenn du oder ein anderer noch weiterhelfen könntest:
geoli

bei Antwort benachrichtigen
Andreas42 geoli „Hab s versuch hat jedoch nicht ganz geklappt. Hier meine Unit1 vielleicht kannst...“
Optionen

Hi!

Ich glaube, da geht nochwas schief. ;-)

Was willst du eigentlich machen? Moment, ich versetzte mich mal hinein - Pause - OK, ich glaub ich hab's:

Du möchtest abfragen, ob im Eingabe Feld Edit1 der Text "Kennedy" eingeben wurde, oder?

Falls nicht, dann entschuldige ich mich für die folgende Erklärung..

Du hast leider noch Problem mit den Datentypen, da müssen wir ganz tief einsteigen:

In Programmiersprachen sind Texte eigentlich fast immer eine Kette von Einzelbuchtaben. Jeder Buchstabe wird in einem einzelnen Byte gespeichert.

In Pascal (Delphi verwendet Pascal als Sprache) nennt sich dieser Datentyp STRING (= Kette(Band/Schnur).

Eine Zeichnekette wird in pascal von einfachen Hochkommas "eingeklammert".

Wenn du eine Zeichenkette angeben willst, dann musst du das so machen:

'Kennedy'

Dann gibt es noch Variablen. Eine Vriable, die Strings speichern kann, wird so angelegt:

SpeicherFuerStrings : string;

Neben Strings kann man auch Zahlenwerte speichern. Ganzzahlige Werte werden oft als Integer, Long oder Word gespeichert. Die drei Typen unterscheiden sich in der grösse der Werte, die sie aufnehmen können und ob die Werte negativ werden können.

WORD ist also ein Datentyp für Zahlen (nicht für Text...)

Deine Button1Click-Prozedur müsste also so aussehen, wenn sie auf die Zeichenkette "Kenndy" reagieren soll:

procedure TForm1.Button1Click(Sender: TObject);
begin
if Edit1.Text = 'Kennedy'
then begin
ShowMessage('Richtig')
end
else begin
ShowMessage('Leider falsch')
end;

Die Definition der Variable Kennedy (Kennedy: Word;) stört dann nicht, kann aber gelöscht werden.

Ich hoffe, das hilft dir weiter.

Bis denn
Andreas

Hier steht was ueber mein altes Hard- und Softwaregedoens.
bei Antwort benachrichtigen
geoli Nachtrag zu: „Hilfe bei Programmieren mit Delphi 6“
Optionen

Vielen Dank an Borlander und Andreas42 für die bisherige Hilfe.
Hätte nun nur noch die Frage wie man für ein erstelltes Formular Fragen und Antworten abspeichern kann d.h. dass man nur ein Formular benötigt mit einem Label für die Fragen und ein Edit-Fenster wo man die Antworten eingeben kann. Borlander erwähnte eine INI-Datei. Hätte jemand genauere Infos?
Schon mal Vielen Dank für Eure Mühe!!! geoli

bei Antwort benachrichtigen
Borlander geoli „Hilfe bei Programmieren mit Delphi 6“
Optionen
Borlander erwähnte eine INI-Datei. Hätte jemand genauere Infos?
Such mal in der Delphi-Hilfe nach TIniFile, damit kannst Du auf Ini-Dateien zugreifen (lesen/schreiben)...

Eine INI-Datei ist so aufgebaut:
[Section1]
Key1=Value1
Key2=Value2
...
[Section2]
Key1=Value1
Key2=Value2
...
[Section3]
...


Es würde sich also anbienten eine INI-Datei mit einer Sektion "quiz" zu verwenden und die Fragen und Antworten als Schlüssel+Wert-Paar abzulegen:
[quiz]
Welcher US-Präsident hatte die Initialen JFK?=Kennedy
Wo gibt es schnelle Hilfe zu PC-Fragen?=nickles.de
...


Gibt auch noch andere Möglichkeiten: z.B:
[Fragen]
1=Welcher US-Präsident hatte die Initialen JFK?
2=Wo gibt es schnelle Hilfe zu PC-Fragen?
...
[Antworten]
1=Kennedy
2=nickles.de
...


Beim Programmstart kopierst Du dann die alle Keys der Section "Quiz" (also alles unter [Quiz]) in eine StringList. Und wählst eine zufällige Frage aus der Liste und lässt diese in einem TLabel anzeigen. Nach eingabe der Antwort kannst Du diese auf richtigkeit überprüfen und eine neue Frage auswählen...

Das ganze lässt sich natürlich auch noch weiter ausführen, ich hab mich erst mal aufs Nötigste beschränkt. Wenn die ersten Fragen auftauchen (zu TIniFile wirst Du evtl. noch die eine haben) melde Dich nochmal...


CU Borlander
bei Antwort benachrichtigen
geoli Nachtrag zu: „Hilfe bei Programmieren mit Delphi 6“
Optionen

Hilfe !!! Langsam verliere ich die Übersicht.
Habs mit der Delphi-Hilfe versucht, diese ist jedoch in englisch und ziemlich allgemein.
Hab nun ein neues Formular erstellt in der ich das Label für die Frage freigelassen habe und dazu eine INI-Datei wo ich mein Beispiel eingetragen habe. Unklar ist mir nun wie ich es anstelle dass das programm auf die INI-Datei zugreift und wie es wissen soll dass vor dem (=) die Frage steht die ins Label soll und dahinter die Antwort. In der delphi-hilfe stand was von WriteString und ReadString aber wie dies genau anzuwenden sei bleibt mir noch Dunkel. Hoffe wieder auf Deine/Eure Hilfe. Vielen Dank schon mal. geoli

bei Antwort benachrichtigen
Borlander geoli „Hilfe !!! Langsam verliere ich die Übersicht. Habs mit der Delphi-Hilfe...“
Optionen
Habs mit der Delphi-Hilfe versucht, diese ist jedoch in englisch und ziemlich allgemein.
Ich vermute Du benutzt die Personal Version, bei mir ist die Hilfe in Deutsch. Das die Hilfe zu allgemein ist kann ich ebenfalls nicht bestätigen, wenn Du Informationen über eine Komponenten / ein Object brauchts kannst Du normalerweise am obenren Rand der Hilfe auf Eigenschaften (Properties), Methoden (Methods) und Ereignisse (Events) klicken - dann bekommst Du eine umfangreiche Liste.

dazu eine INI-Datei wo ich mein Beispiel eingetragen habe.
Hast Du die Datei im Programmverzeichnis liegen?

Unklar ist mir nun wie ich es anstelle dass das programm auf die INI-Datei zugreift
Dazu musst Du zuerst die Unit inifiles in der Uses-Klausel am Anfang der Unit einfügen.

Um Dann die auf die INI-Datei zuzugreifen musst Du ein Object vom Typ TIniFile erstellen (erst mit var deklarien wie eine String- oder Integer-Variabel). Diese solltest Du global (wenn Du das Object nur lokal erstellen würdest, kannst Du nur in der jeweiligen Function/Procedur verwenden und die darin gespeichrten Daten sind beim nächsten Aufruf nicht mehr verfügbar) deklarien (hinter "var
Form1: TForm1;"). Damit Du das Object verwenden kannst musst Du es beim Programmstart (OnCreate Form1) erstellen:
QuizData := TIniFile.Create('quiz.dat'); { bor: Ich hab das Object einfach mal "QuizData" genannt und als Dateinamen "quiz.dat" verwendet - der Pfad muss nicht mit angegeben werden wenn sich die Datei im selben Verzeichnis wie das Programm oder im Windowsverzeichnis befindet - die Endung muss auch nicht umbedingt INI sein, ich habe ganz neutral .dat gewählt }
Beim Beenden des Programms (OnClose) solltest Du den Speicher des Objects wieder mit QuizData.Free; freigeben.


Unklar ist mir nun wie ich es anstelle dass das programm auf die INI-Datei zugreift und wie es wissen soll dass vor dem (=) die Frage steht die ins Label soll und dahinter die Antwort. In der delphi-hilfe stand was von WriteString und ReadString aber wie dies genau anzuwenden sei bleibt mir noch Dunkel.
Mit Antwort := QuizData.ReadString('[quiz]', Frage, '#Fehler die Frage existiert nicht!'); kannst Du die Antwort aus der Datei lesen - dafür muss Du allerdings erst mal die Frage kennen. Die Fragen lädst Du am besten beim Programmstart in eine StringList, so kannst Du die Fragen zufällig auswählen, damit das ganze nicht zu Langweilig wird.

Erst mal musst Du die wieder eine TStingList global deklarieren.
Diese wird ebenfalls beim Programmstart erzeugt:
QuestionList := TStringList.Create;
und am Ende des Programms mit der Methode Free wieder freigegeben.

Um die Fragen in die StingList zu lagen verwendest Du die Methode ReadSection, als Section gibtst Du in Deinem Fall 'quiz' an und als Strings die StringList.

Die Fragen kannst Du anschließend mittels QuestionList[Nummer] abrufen - gezählt wird ab 0. Um den Text im Label anzeigen Zu lassen musst Du den Rückgabewert einfach der Eigenschaft Caption des Labels zuweisen.

Die Antworten kannst Du anschließend mittels QuizData.Read('quiz', Frage_Label.Caption, '#Fehlermeldung wenn die Frage nicht gefunden wurde!'); abrufen

So damit müsstest Du schon ein bisschen weiter kommen, wenn nicht kannst Du immer noch weiterfragen ;-)


CU Borlander
bei Antwort benachrichtigen
geoli Nachtrag zu: „Hilfe bei Programmieren mit Delphi 6“
Optionen

Ich dachte nicht das so ein kleines Programm so kompliziert sein kann. Jedenfalls habe ich mein möglichstes versucht um deine Ratschläge umzusetzen. Ich hab es nochmal bei der Hilfe versucht kann jedoch keine Properties, Methods oder Events finden. Hab dir mal wieder meinen Quell-Text in dem sicherlich vieles schief läuft hinterlassen:
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
TIniFile;
TStringList;

implementation

{$R *.dfm}
begin
OnCreate Form1;
QuizData := TIniFile.Create('quiz.dat');
Antwort := QuizData.ReadString('[quiz]');
QuestionList := TStringList.Create;
ReadSection('quiz');
ReadString('QuestionList');
QuestionList[Nummer];
end


procedure TForm1.Button1Click(Sender: TObject);
begin
QuizData.Read('quiz')
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
QuizData.free;
QuestionList.free;
Close;
end;

end.

Einerseits glaube ich, dass hier und da noch einige Buchstaben fehlen, und andererseits, dass einige der Befehle an der falschen Stelle stehen. Warte wie immer auf deinen Rat. Vielen Dank für deine Mühe !!! geoli

bei Antwort benachrichtigen