nyelvoktató program

Készítettem egy adatbázison alapuló német-magyar szótárprogramot, aminek a keresőrésze már működik is, de szeretnék készíteni egy másik Form-on egy szókikérdező funkciót is:
Ami úgy néz ki, hogy van egy Edit1, ebben jelenik meg a kérdezni kívánt szó, és van egy Edit2, amelybe nekem kell beírni a kérdezett magyar szó német megfelelőjét és a Button2(check) gomra kattintva egy Showmessage ablakban kiírja, hogy 'Good' vagy 'Wrong'+ a helyes német szó.

Eddig működik is, csak az az egy problémám van, hogy mindig ugyanazokat a szavakat kérdezi, és ha elér az utolsó listában szereplő szóhoz, akkor ott véget is ér. Pedig én Random módon szeretném, hogy bármely szót kérdezzen bármikor.

Az adatbázisom(vocabulary.dbf) így épül fel a Tanuljunk könnyen gyorsan németül című könyv alapján:
Oszlopok: Lesson, German, Hungarian

A szóban forgó Unit eddigi felépítése:

unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, DBTables, ExtCtrls, DBCtrls, Grids, DBGrids, StdCtrls;

type
TForm2 = class(TForm)
DataSource1: TDataSource;
Table1: TTable;
Edit1: TEdit;
Button1: TButton;
Label1: TLabel;
Edit2: TEdit;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Edit2Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2; i: integer;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
randomize;
for i:=1 to Table1.RecordCount do
begin
//Table1.Locate('HUNGARIAN',random(Table1.FieldCount),[]);
Table1.Locate('HUNGARIAN','*',[]);
//Table1.Locate('HUNGARIAN',Table1.FieldValues[*]); //Table1.MoveBy[System.varAny]
Edit1.Text:=Table1.FieldValues['HUNGARIAN'];

end;
end;

procedure TForm2.Edit2Click(Sender: TObject);
begin
Edit2.Enabled;
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
repeat
if Edit2.Text = Table1.FieldValues['GERMAN'] then
Showmessage('Good!')
else
Showmessage('Wrong. The answer is: '+Table1.FieldValues['GERMAN']);
Table1.MoveBy(System.varVariant);
Edit1.Text:=Table1.FieldValues['HUNGARIAN'];
Edit2.Text:='';

until Button3.Cancel;
end;

procedure TForm2.Button3Click(Sender: TObject);
begin
Close;
end;

end.

Szerintem a MoveBy metódussal lehet némi probléma, de persze az is lehet, hogy az egésszel... Régen tanultam. Ha valakinek van kedve bogarászni, hogy hol lehet a probléma, légyszi segítsen. :) Szeretném megkönnyíteni a szótanulást magamnak.
Nagyon köszönöm!

petka85

Szerintem a probléma az, hogy...

Szia Petka85,

Így első löketre azt látom, szerintem az a baj, hogy a Button2Click-ben nem dobsz újra random-ot. Az is nagyon fontos, hogy a randomize eljárást egyetlen egyszer hívd a programodban! A Form1 OnCreate eseményébe rakd bele!

Nem használtam soha ezt a MoveBy-t, ami nem jelenti azt, hogy Te ne használd. Ezt a Table1.Locate('HUNGARIAN','*',[]); dolgot nem nagyon értem hogy miért kell, mert szerintem a * jel miatt rá fog állni az első elemre mindig.

A MoveBy-nak lesz még egy baja: ha eléri a tábla végét, odaragad. Jó lenne elölről kezdeni ekkor. Csinálj egy procedure-t:


procedure Mozgat(pDelta : Integer) ;
var i : integer ;
begin
for i := 0 to pDelta do begin
if Not Table1.Eof then
Table1.Next
else
Table1.First ;
end ;
end ;

És amikor el kell mozgatni, meghívod így:

Mozgat(Trunc(Random(Table1.RecordCount))) ;

Még arra figyelj, hogy a Random szintaktikája szerint vissza tud nullát is adni. Ekkor ugyanazt a szót fogja adni, mint ami előbb volt, hiszen nem mozgattad semerre. Ezt oldd meg magadtól, menni fog!

De ezt akkor is hívd meg, amikor kitalált vagy nem talált ki egy szót! Na mit szólsz?
Menyus

Én régen írtam egy lottó

Én régen írtam egy lottó sorsoló programot, Win98 alatt teljesen jól működött, de XP-alatt mindig ugyanazokat a számokat adta ki (négy- öt variációt). Szerintem az XP máshogy generálja a randomszámokat...
Üdv.: Totó

Könyvajánló

Programozzunk Turbo Delphi Rendszerben