趣味取名 求助软件
编程学堂
给宝宝取名是一件麻烦的事情,要朗朗上口,要考虑五行数理。我设计了一款趣味取名软件,可以满足广大网民的需求。
解析软件设计原理
取名的方式有三种,分别为手动取名、半自动取名和自动取名。手动取名是指输入“姓”后,提供第二个和第三个汉字的多种组合,这些组合都满足五行全“吉”,由用户在窗体上选择第二个汉字和第三个汉字。
半自动取名是指用户可以在网络上寻找更多的姓名,存储为TXT格式再导入软件中,由软件进行分析并反馈结果。自动取名是指选择一个姓氏后,系统自动分析并把符合要求的名字列举出来。
设计思路:
输入姓名后,把姓名拆分为一个一个的汉字并导入fantizi中,返回每个汉字的笔画,然后根据每个汉字的笔画进行计算,计算出天格、地格、人格、总格、外格对应的数字,然后查询wuge,把对应的详细信息显示出来,并根据天格、地格、人格等数字计算出五行,查询sancai,最后显示查询结果即可。
技术要点:
对字符串的操作是本软件的核心,拆分姓名并计算每个汉字的笔画就需要对字符串进行处理。字符串在程序设计中应用非常广泛,当我们需要把获取的文字信息进行分析处理时常常就会使用到字符串相关知识,小到统计一篇文章的字数、分析彩票,大到开发网游、工程项目,灵活使用字符串将大大提高编程效率,降低劳动强度。
软件开发步骤
第一步:
启动Delphi7.0,新建一个工程,并在工程中添加自动取名窗体、半自动取名窗体、手动取名窗体,再新建数据库data,建立三张表:表fantizi(两个字段:bihua、hanzi)、表sancai(两个字段:sancai、hanyi)、表wuge(两个字段:shuzi、hanyi)。在网络上搜索百家姓大全,分别制作成若干个TXT文件放在项目文件夹的xm目录下。
第二步:
在“姓名”对应的OnKeyPress事件中,首先把姓名拆分为一个一个的汉字,然后调用函数GetBiHua查询fantizi取得每个汉字的笔画数,并显示在Edit文本框(Edit2~Edit5)中,然后点击“测算名字五行”按钮就在Memo中显示对应的详细信息。代码如下:
tian:= strtoint(Edit2.Text)+1;// 天格
ren:=strtoint(Edit2.Text)+ strtoint(Edit3.Text);// 人格
di:= strtoint(Edit3.Text)+ strtoint(Edit4.Text);// 地格
zong:= strtoint(Edit2.Text)+strtoint(Edit3.Text)+ strtoint(Edit4.Text) ;// 总格
wai:= strtoint(Edit4.Text)+1;// 外格
//计算五行的方法为:
case (tian mod 10) of
1,2:wuxing:=wuxing+'木';
3,4:wuxing:=wuxing+'火';
5,6:wuxing:=wuxing+'土';
7,8:wuxing:=wuxing+'金';
if Key=#13 then//姓名输入框中按下回车键
begin
for i:=0 to 3 do
begin
arr[i]:='';//此数组存储每个汉字
arr2[i]:=0;//此数组存储汉字对应的笔画
end;
name:=Trim(edit1.Text); //把输入的名字赋值给name字符串
j:=1;
tmp:= length(name) div 2-1 ;
for i:=0 to tmp do//依次取出每个汉字
begin
arr[i]:=name[j]+name[j+1];
inc(j,2);
end;
for i:=0 to tmp do
arr2[i]:= GetBiHua(arr[i]); //调用函数把每个字取笔画
//显示每个汉字的笔画
edit2.Text:=inttostr(arr2[0]);
edit3.Text:=inttostr(arr2[1]);
edit4.Text:=inttostr(arr2[2]);
edit5.Text:=inttostr(arr2[3]);
第三步:
在窗体加载时读取xm目录下的所有文件,并把文件名依次显示在ComboBox1中。在ComboBox1的OnSelect事件中,把对应的TXT文件的内容显示在Memo2中,在“筛选”按钮中,依次取出Memo2每行的值,然后拆分姓名为一个一个的汉字,并调用函数GetBiHua获取每一个汉字的笔画,然后根据测字算命书上列举的符合全“吉”的排列组合进行筛选,如果满足条件则把姓名显示在Memo3中。下面给出较为难理解的代码:
tmppath:=Form1.GetSpecialFolderDir(37)+'\xm'; //取得xm的路径,这里是c:/winnt/system32
//Memo1获取xm目录下的所有文件名(含扩展名)
FileListBox1.Directory:=tmppath;
memo1.Text:=FileListBox1.Items.GetText;
//依次把memo1的每一行取出来写到ComboBox1列表中
ComboBox1.Clear;
for i:=0 to memo1.Lines.Count-1 do
begin
str1:=memo1.Lines[i] ;
str1:= LeftStr(str1,1); //去掉扩展名,只保留文件名
ComboBox1.Items.Add(str1);
end;
ComboBox1.Text:=ComboBox1.Items[0];//默认显示第一个文件名
ComboBox1Select(nil);
if (Label3.Font.Color=clRed) then
Label3.Font.Color:=clBlue
else
Label3.Font.Color:=clRed;