看似简单。。。请进! (200分)

  • 主题发起人 主题发起人 ilook
  • 开始时间 开始时间
I

ilook

Unregistered / Unconfirmed
GUEST, unregistred user!
以下是几个典型的文件名:
2002土建专业福州市200201综合价.mdb
2001土建专业福州市200202综合价.mdb
2002土建专业福州市200203信息价.mdb
2002安装专业福州市区200204综合价.mdb
2002安装专业福州马尾区200202信息价.mdb
.....
现在进行对文件名搜索
条件:专业、地区、年份、月份、价格类别(均可选)如果没有选择条件,我将它条件对应的关健字赋值为0。因为每个文件名中必包含0。
现在一个用户要对2月份的价格进行查询,他只在搜索条件中选择02,
如果用pos(tempmonths,s)的方式会找到错误的结果如把
2002土建专业福州市200203信息价.mdb找到。因为这个文件名中包含了02的字符。
现在就要实现这样的功能:只要找到2002土建专业福州市200202综合价.mdb和2002安装专业福州马尾区200202信息价.mdb两个
文件。请记住:以上5个条件可选可不选!!这是十分重要的!!!!

以下为原来的搜索代码

if FindFirst(tempfile,faAnyFile, sr)=0 then
begin
while FindNext(sr)=0 do
begin
s:=trim(ExtractFileName(sr.Name));
if length(s)=0 then continue;
a:=pos(tempsoftsort,s);//专业类别
if a>0 then
begin
b:=pos(temparea,s);//地区
if b>0 then
begin
c:=pos(tempyears,s);//年份
if c>0 then
begin
d:=pos(tempmonths,s);//月份
if d>0 then
begin
e:=pos(temppricesort,s);//价格类别
if e>0 then
begin
找到符合条件的结果后的程序段

end;
end;
end;
end;
end;
end;
end;
 
何必这样麻烦? 程序启动的时候先扫描所有文件,然后将文件分类不好吗?
创建一个类
TMDBFile = class
FileName: string;
专业: string;
地区: string;
年份: integer;
月份: integer;
价格: string;
constructor Create(const AFileName: string);
end;

constructor TMDBFile.Create(const AFileName: string);
begin
FileName:= AFilename;
专业:= Copy(FileName, 5, Pos('专业', Filename) - 1);
地区:= ...;
年份:= ...
月份:= ...
价格:= ...
end;
然后用TList讲这些文件类管理起来
以后搜索的时候扫描一遍List就行了。

看你的代码有些累,呵呵!
 
困了,累了,喝红牛 ^_^
 
是的。本人也想有更好的办法。但水平受限呀。才接触delphi不久。知道的方法比较少
只能用最简单的方法来解决
 
何不组合年份数,如找200202,如果没有输入年份,你给它一个缺省年份数,如2002
 
我也想。要是能把月份的命名改写成中文的如一月份、二月份就省事多了。可惜已经定了。
不能改的。
 
if FindFirst(tempfile,faAnyFile, sr)=0 then
begin
while FindNext(sr)=0 do
begin
s:=trim(ExtractFileName(sr.Name));
if length(s)=0 then continue;
ss:=s;
str:='';
if year<>'' then str:=str+year else str:=str+copy(ss,1,4);
delete(ss,1,4);
if softsort<>'' then str:=str+softsort else str:=str+copy(ss,1,pos('专业',ss)+3);
delete(ss,1,pos('专业',ss)+3);
i:=0;
repeat
i:=i+1;
until ss in ['1'..'9'];

if area<>'' then str:=str+area else str:=str+copy(ss,1,i-1);
delete(ss,1,i-1);
if year<>'' then str:=str+year else str:=str+copy(ss,1,4);
if mon<>'' then str:=str+mon else str:=str+copy(ss,5,2);
delete(ss,1,6);
if pricesort<>'' then str:=pricesort else str:=str+ss;
if s=str then
begin
找到符合条件的结果后的程序段
end;
end;
end;
findclose(sr);
 
我认为,这样的设计就不合理,如果是你能决定的,还是改成一个数据库好了
 
loxtln的想法我试试看。
ysai。建立数据库太麻烦了。
 
loxtln兄的方法经过稍微改动后,几乎马上就可以了。可是突然发现
if (years.Text<>'') or (years.Text<>'不限') then str:=str+years.Text else str:=str+copy(ss,1,4);
这样的语句死活不给str赋值!
其它的格式如
if (area.Text<>'') or (area.Text<>'不限')
begin
..........
.........
str:=str+copy(ss,1,4);
end;
这样倒是可以赋值。难道我又犯了什么错误吗?[?][?]
 
up一下。谢谢!!
 
多人接受答案了。
 
后退
顶部