
A mellékelt példaprogram megnyitása előtt a Lotto.pas-ban lévő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
A komponens használata
A komponens Items tulajdonságában kell megadnunk a húzható elemek halmazát. A tulajdonság TStringList típusú. Minden egyes húzható elemnek külön sorban kell elhelyezkednie.
A Level értékén keresztül adhatjuk meg a húzandó elemek számát. A lehetséges kombinációkat a komponens a FileName tulajdonságban megadott állományba menti el. Az állomány txt formátumú. Minden kombináció külön sorba kerül.
Ha például az 5-ös lottó kombinációira vagyunk kíváncsiak, akkor az Items tulajdonságba írjuk be a számokat 1-90-ig. A Level értékét állítsuk 5-re.
A kombinációk kiszámolásához az Execute metódust kell meghívnunk.
A kombinációk kiszámítása gépünk sebességétől függően több percig is eltarthat. A 6-os lottó esetén egy kb. 135 MB-os TXT állomány jön létre.
A komponens elkészítése
A komponenst a TComponent osztályból származtatjuk. Fel kell vennünk a tulajdonságok tárolására szolgáló változókat és metódusokat. A kombinációkat egy TextFile típusú állományba fogjuk elmenteni.
Az Execute metódusnak kell létrehoznia, majd bezárni a FileName tulajdonságban megadott állományt.
AssignFile(f,FFileName);
Rewrite(f);
Count(FItems,1,'');
WriteLn(f,'A kombinációk száma: ',FRows);
CloseFile(f);
A kombinációkat a Count függvény számítja ki.
procedure TLotto.Count(List: TStringList; ILevel: Integer; s: String);
A függvény rekurzív. A List paraméter tartalmazza az éppen aktuális értékkészletet. Az ILevel értéke adja meg azt a függvénynek, hogy éppen hányadik húzott számot generálja. Az s paraméter az előző függvényhívások által kiszámolt számok sorozatát tartalmazza.
A függvény belsejében létre kell hozni egy ideiglenes TStringList-et.
l:=TStringList.Create;
l.Assign(List);
Ha az ILevel változó értéke megegyezik a Level tulajdonságban megadott értékkel, akkor nem kell további függvényhívást végrehajtanunk. Ilyenkor ki kell írnunk az s változó tartalmát a megadott állományba, valamint növelnünk kell a beírt sorok számát tartalmazó változó értékét.
if ILevel=FLevel then begin
for i:=0 to List.Count-1 do begin
WriteLn(f,s+List[i]);
Inc(FRows);
end;
end
Ha ILevel és FLevel értéke nem egyezik, akkor egy újabb rekurzióra van szükség.
else begin
for i:=0 to List.Count-1 do begin
if ILevel=1 then s:='';
l.Delete(0);
t:=s+List[i]+',';
Count(l,ILevel+1,t);
end;
Az ideiglenes listából (l) ki kell törölnünk az első elemet, hiszen azt éppen most használjuk fel. A meghívott függvénynek tovább kell adnunk az eddig kikalkulált számok listáját. A függvény rekurzív hívásánál az ILevel aktuális értékénél eggyel nagyobbat kell megadnunk.