我有4种类型的熔岩,水,黑暗和自然。我想对每一个进行查询,一次一个。目前我有
procedure TFGame.GetStartingCards;
var
ManaType :string ;
begin
Manatype := 'Nothing';
while ManaType <> 'Nature' do
begin
if ManaType = 'Dark' then
ManaType := 'Nature';
if ManaType = 'Water' then
ManaType := 'Dark';
if Manatype = 'Lava' then
Manatype := 'Water';
if Manatype = 'Nothing' then
ManaType := 'Lava' ;
with adoquery1 do
begin
close;
sql.Clear;
sql.Add('SELECT * ');
sql.Add('FROM Cards');
sql.Add('WHERE Color='''+ManaType+'''');
open;
end;
//return the result of everything for giving mana type..
end;
但似乎是一种更好的方法,比如将每个mana类型放入一个数组并使用该数组来提供查询。但无法让它发挥作用。所以问题是,如果我决定保留这样的话会有任何缺陷吗?
答案 0 :(得分:8)
我建议为mana引入一个枚举类型,也许是一个用于查询的字符串const数组
type
TManaType = (mtNothing, mtNature, mtDark, mtWater, mtLava);
const
cManaQueryNames : array[mtNothing..mtLaval] of string =
('nothing','nature','dark','water','lava');
此外,在您的数据库中,您可以考虑将manatype存储为数字,与TManaType的数值(ord)相对应,这样在您的数据库中,水的法术力应该存储为ord(mtWater)= 3
答案 1 :(得分:1)
您可以使用单个SQL查询来获取法术力类型的所有结果:
SELECT * FROM cards WHERE Color IN ('Dark', 'Nature', 'Water', 'Lava')
或弹出数组中的类型并循环:
for manaType in manaTypes do
begin
// run an SQL query
end;
阵列是更好的方法,因为您现在可以从其他地方(数据库,配置文件)获取法术力类型,并且它们在源代码中不是硬编码的。这样做更好,因为您可能会改变自己的名字或数字,如果在这种情况下不需要修改和重新编译程序,那就更有效了。
答案 2 :(得分:1)
procedure TFGame.GetStartingCards;
const
ManaTypes : array [0..4] of string = ('Nothing', 'Lava', 'Water', 'Dark', 'Nature');
var
i: integer;
begin
for i := 0 to Length(ManaTypes) - 1 do
begin
with adoquery1 do
begin
close;
sql.Clear;
sql.Add('SELECT * ');
sql.Add('FROM Cards');
sql.Add('WHERE Color='''+ManaTypes[i]+'''');
open;
end;
//return the result of everything for giving mana type..
end;
end;