菜谱查询更容易——编一个《天天饮食》软件

编程爱好者

本期为大家介绍的这个生活实用程序名叫《天天饮食》,它的主要功能包括:1.通过目录树罗列了详细菜谱信息供查看;另外,软件的模糊查询功能也是一大特色。好了,下面让我们一起来看看这款软件吧,它采用Delphi7.0编写。

一、显示菜谱清单

操作方法:如图1,点击“菜谱清单”,在界面左下方显示一个目录树结构,分别显示各大菜系,点击一个菜系后,此菜系按烹饪方法展开,点击一个烹饪方法,界面右下方就显示属于此菜系的烹饪方法的各道菜的菜名、原料、制作方法等详细信息,点击“定制菜谱”下方的两个箭头按钮,系统将一条一条展示属于此菜系的烹饪方法下的各道菜的详细信息。比如点击“四川菜”→“炒菜”,界面右边就显示“鱼香腰花”,如果想知道四川菜的炒菜还有哪些,点击箭头按钮就可以了。

35-g12-1-1.jpg
图1

制作难点之一:目录树的形成

在制作软件前,首先要有一个菜谱的数据库cate.mdb,01表存放每道菜的详细信息,包括菜系cx、菜名mc、原料yl、制作方法zzff、烹饪方法ptlb,02表存放各类菜系,04表存放各种烹饪方法,weekplan表存放饮食周计划。前期工作是建立好数据库并把所有菜的信息写到数据库中备用。

点击“菜谱清单”后将显示目录树结构,也就是从cate.mdb数据库中把相关数据提出来加载到目录树中,这里有一个小技巧:如果按这种办法显示,数据量不大的话,程序没有问题,一旦数据量过于庞大,目录树的加载就需要一定时间,这样给人的感觉就是每次点击“菜谱清单”后,程序半天没有响应,为了避免这种情况,我们在程序启动时就加载目录树,并且把目录树隐藏,点击“菜谱清单”按钮就显示此目录树,这样给人的感觉程序运行就很流畅。下面我们来看如何把菜系和烹饪方法加载到目录树中。

procedure TForm1.FormShow(Sender: TObject);

var

aNode:TTreeNode;

i,j,k:integer;

kind,tmpkind,heat:string;

begin

ADODataSet_food.Close;

ADODataSet_food.CommandText:='sele

ct * from 02';//02这张表只有一个字段cx:菜系

ADODataSet_food.Open;

ADODataSet_food.First;

for i:=0 to ADODataSet_food.RecordCo

unt-1 do//每一个菜系都循环一次

begin

kind:=ADODataSet_food.FieldByName('cx').AsString;

aNode := TreeView1.Items.AddChild(nil,kind) ;//把菜系添加到目录树的父节点

ADODataSet.Close;

ADODataSet.CommandText:='select distinct ptlb from 01 where cx=''' + kind + '''';//这句话是在表01中把每一个菜系所对应的全部烹饪方法选择出来,重复的烹饪方法只选择一个,形成一个数据集合,如01表中湖南菜系所对应的烹饪方法有:炒菜、烧煨、汤、炸制、蒸炖。那么此五种烹饪方法形成一个数据集合。

ADODataSet.Open;

ADODataSet.First;

for j:=0 to ADODataSet.RecordCount-1 do

begin

heat:=ADODataSet.FieldByName('ptlb').AsString;//把前面形成的数据集合依次添加到目录树中。

TreeView1.Items.AddChild(aNode,heat);

ADODataSet.Next;

end;

ADODataSet_food.Next;

end;

end;

制作难点之二:菜谱信息的显示过程

在目录树中点击一道菜后,界面右下方显示这道菜的详细资料,这是如何实现的呢?原理是取出鼠标所点击的烹饪方法的值和上级目录也就是菜系的值,然后去表01中查询,如果表01的记录为我们选择的菜系且烹饪方法也为我们选择的,那么就在Edit1中显示这条记录的菜名,Memo1和Memo2分别显示原料和制作方法。在目录树的OnClick事件中添加下面代码:

procedure TForm1.TreeView1Click(Sender: TObject);

var

treefood,treefood2,tmpfood,caiming,yuanliao,zhizuo,cx:string;

i:integer;

begin

treefood:=TreeView1.Selected.Text;//取出烹饪方法的值

if TreeView1.Selected.HasChildren then//如果鼠标点击的为目录树的父目录,也就是点击的为菜系,那么其父目录的值为空

treefood2:=''

else

treefood2:=TreeView1.Selected.Parent.Text;//否则取出菜系的值

ADODataSet.Close;

ADODataSet.CommandText:='select * from 01 where cx=''' + treefood2+'''and ptlb='''+treefood+'''';//把01表中满足菜系为treefood2且烹饪方法为treefood的所有记录形成一个数据集合

ADODataSet.Open;

ADODataSet.First;//指向这个数据集合的第一条记录,并把这条记录的相应字段的值取出来显示

tmpfood:=ADODataSet.FieldByName('pt

lb').AsString;

caiming:=ADODataSet.FieldByName('m

c').AsString;

yuanliao:=ADODataSet.FieldByName('y

l').AsString;

zhizuo:= ADODataSet.FieldByName('zzf

f').AsString;

cx:=ADODataSet.FieldByName('cx').As

String;

Edit1.Text:='菜名:'+caiming;

Memo1.Clear;

Memo2.Clear;

memo1.Lines.Add('原料:');

memo2.Lines.Add('制作方法:');

memo1.Lines.Add(yuanliao);

memo2.Lines.Add(zhizuo);

Memo1.SelStart := 0;

Memo1.SelLength := 0;//这句话和上一句话的作用是Memo1在显示原料后,把光标定位到首行,如果去掉这两句话,Memo1的光标会定位在段落的最后一行。

Memo2.SelStart := 0;

Memo2.SelLength := 0;

end;

二、查询菜谱

如图2,点击“查询菜谱”,然后输入需要查询的菜名,点击“查询”按钮即可。如果数据库中有此菜名,界面下方将显示其详细信息。这里的菜名支持模糊查询,比如输入的为“回锅肉”,查询结果为包含“回锅肉”三个字的所有菜,点击“查询”按钮后显示查询结果的第一道菜的信息,点击方向键按钮可以查看包含“回锅肉”的所有菜的信息。如上图,查询结果共有4道菜名都含有回锅肉,这里显示的是第三条记录。

35-g12-1-2.jpg
图2

关于模糊查询的编程方法,可参看上期G15版文章。

三、增加菜谱

依次输入菜系、菜名、烹饪类别、原料、制作方法后,点击“增加”按钮,这样就把这道菜的信息录入到数据库中了。增加记录属于简单的数据库操作,这里不做解释了。

四、定制菜谱

点击“定制菜谱”后,就可以在软件中定制一周的菜谱了,设计好一周内每天每顿的饮食,录入进去,然后点击“定制计划”按钮,如果不满意此计划,在输入框中进行修改后再次按下“定制计划”,就录入到数据库中了。当然,系统提供了打印的功能,点击“打印计划”按钮后,即可打印出定制的菜谱。

定制计划是简单的对表的修改操作,属于基本知识,这里不做讲解了,打印计划使用到了Delphi7.0的Rave组件来设计报表,制作方法请参考相关书籍。

以上程序下载网址:http://www.cpcw.com/xz/35shenghuo.rar

此软件的编写主要使用了TreeView控件和对数据库的操作,特别是SQL语言的灵活运用。TreeView是一个功能强大且非常实用的控件,TreeView的运用是本软件的制作难点,希望大家能熟练掌握。