Delphi中如何在程序中动态指定记录文件包含纪录的类型?(还有与之相关的动态打开)

时间:2022-07-20 17:33:40
最近的一个程序中需要用到如下的操作:

问题一:
如何在程序中动态指定了数据类型后,生成相应的记录文件和记录文件类型?
比如我在某个编辑框中指明了记录的字段ID(整型),Name(字符型)。然后按某个按钮去生成这种类型的记录、记录文件类型、记录文件。难题在于:我觉得记录文件类型和它的字段都是在程序的最前面声明的。如何在程序执行过程中动态的实现这个效果呢?

问题二:
如何判断记录文件的类型?即:一个不清楚它包含纪录类型的记录文件(当然文件后缀可以一样),如何打开?(这个问题和上面的问题有点类似)

请各位多多指点,分不够再加。多谢!

25 个解决方案

#1


1.应该实现不了吧.我记得好像在  Delphi 深度探索(第二版)那本书后面讲的装饰者模式可以实现类似的功能.用类来组合.
2.不清楚啊..

#2


用数据库可以吗?根据用户的输入,动态建表。然后对它操作,最后存储。这样你的第2个问题也解决了。

#3


恩    数据库吧,好象符合你的要求。

#4


up
我也是觉得……如果用做dll的方法可以,但是只是这么想,实际操作不清楚……

#5


up一下,是用记录文件类型。
不能用数据库。麻烦各位指点一下,分不够再加。

#6


up

#7


用可变长记录类型不知道可不可以满足你的要求:

#8


记录文件和记录文件类型 
是不是指数据表的字段名和字段类型,
请楼主说清楚一些!

#9


把所有可能字段全都考虑进去,绝对互斥的写成共用结构
,然后给各个结构加上标志,证明该字段是否有用,
当然为了节约空间,注意两个地方,一是,结构字段标志要放在一个专门的结构或数组中,存入文件的时候写在最前面,这样你每次打开就先读这个数组或结构,第二,由于各结构空间不固定,最好使用动态分配内存的方法

#10


回复人: hqhhh(枫叶) ( ) 信誉:100  
 记录文件和记录文件类型 
 是不是指数据表的字段名和字段类型,
 请楼主说清楚一些!

 不是,记录文件是指Delphi可以操作的3种文件之一:文本/纪录/无类型文件。
 记录文件由长度固定的若干条记录组成,可以很方便的对他们进行操作。
 每条记录又可以包括若干个属性。比如id=1 ,name ='lee',sex='male'等。

#11


To  notruiyi(notruiyi):
你的大体意思我明白了,是不是不管你怎么自定义里面谁处于有用态,这个文件类型是始终不变的。所以我们
可以所有自定义格式的文件,并且判断里面那些有用?
但是还有如下问题不清楚:
1.什么是绝对互斥的共用结构?
2.如何动态分配内存?我只知道记录文件声明时要指明它的类型,string类型要指明它的宽度。但是如何在程序中动态分配呢?也就是说,刚才的方法解决了如何动态制定每条记录中的字段的问题,但字段类型动态获取我不太清楚,请详谈,谢谢。

#12


delphi我才学了一个多月,我不知道里面有没有共用体,
动态分配内存?实在不行你就做成类,用create动态创建需要的数据,
结构中的字段自动是引用类型

#13


我也只是一个月多一点。
做成类的话也需要指明类型啊,而且是动态指定类型……总之就是在程序过程中搞出一系列指定名称和类型的纪录文件来。

#14


up

#15


up

#16


用xml存储试试看吧

#17


type
 T_person = Record

 d_frist_name:string;
 d_last_name:string;
 birth_date:TDate;

 case d_is_Manager:Boolean of
   false:d_annual_salary:double;
   true:(
         d_country:string;
         d_entry_date:TDate;
         d_Hourly_salay:double
         );
end;

#18


type
 T_person = Record

 d_frist_name:string;
 d_last_name:string;
 d_birth_date:TDate;

 case d_is_Manager:Boolean of
   false:(d_annual_salary:double);
   true:(
         d_country:string;
         d_entry_date:TDate;
         d_Hourly_salay:double
         );
end;

#19


这个定义方式如果可以执行的话,应该是可以解决动态分配类型的问题的;问题是
1.你有没有试过这样分配,而且定义出这种纪录的文件类型来?
2.程序中能够动态指定出d_is_Manager并分配么?
就是说你实际是否这么做过动态分配?

原谅我问的罗索,我曾经打算用variant,觉得一准行,十拿九稳。但后来发现variant不支持纪录。

#20


var person_list :file of T_person;

#21


我从object pascal语言参考手册上找到的

#22


你自己试一下,我没用过,应该可行吧,另外,d_is_manager应该是记录的一个成员吧、
你可以在集成环境里试一下,看T_person对象后面的点后面会不会出现这个 d_is_manager

#23


首先对不起各位,实在抱歉,我封闭培训了两周,两天前刚刚放出来。

notruiyi:我试了这个方法了,也查了帮助,但这个方法只能给一个变量动态赋类型(语法规定的,有且只有一个动态类型区)。如果目标就是一个记录文件中又一个动态变量的话,那这个办法堪称完美,但是它不能解决给纪录里所有类型赋动态类型的问题……又一个希望破灭了 :(

up一下,大家还有没有其他的办法啊?!谢谢各位了!

#24


好像难度比较大,如果必须要这样做,我觉得数据结构设计的就不合理了,导致你的代码很难实现,但仅对于这个问题,方法可能不多。

#25


楼上说的是,我打算明天告诉头头,这样实现不了,我要换成数据库!实在是顶不住了!



不过也怪不得别人,我自己选的要用纪录的……


也不能怪我啊……我才学delphi俩月……    :(

#1


1.应该实现不了吧.我记得好像在  Delphi 深度探索(第二版)那本书后面讲的装饰者模式可以实现类似的功能.用类来组合.
2.不清楚啊..

#2


用数据库可以吗?根据用户的输入,动态建表。然后对它操作,最后存储。这样你的第2个问题也解决了。

#3


恩    数据库吧,好象符合你的要求。

#4


up
我也是觉得……如果用做dll的方法可以,但是只是这么想,实际操作不清楚……

#5


up一下,是用记录文件类型。
不能用数据库。麻烦各位指点一下,分不够再加。

#6


up

#7


用可变长记录类型不知道可不可以满足你的要求:

#8


记录文件和记录文件类型 
是不是指数据表的字段名和字段类型,
请楼主说清楚一些!

#9


把所有可能字段全都考虑进去,绝对互斥的写成共用结构
,然后给各个结构加上标志,证明该字段是否有用,
当然为了节约空间,注意两个地方,一是,结构字段标志要放在一个专门的结构或数组中,存入文件的时候写在最前面,这样你每次打开就先读这个数组或结构,第二,由于各结构空间不固定,最好使用动态分配内存的方法

#10


回复人: hqhhh(枫叶) ( ) 信誉:100  
 记录文件和记录文件类型 
 是不是指数据表的字段名和字段类型,
 请楼主说清楚一些!

 不是,记录文件是指Delphi可以操作的3种文件之一:文本/纪录/无类型文件。
 记录文件由长度固定的若干条记录组成,可以很方便的对他们进行操作。
 每条记录又可以包括若干个属性。比如id=1 ,name ='lee',sex='male'等。

#11


To  notruiyi(notruiyi):
你的大体意思我明白了,是不是不管你怎么自定义里面谁处于有用态,这个文件类型是始终不变的。所以我们
可以所有自定义格式的文件,并且判断里面那些有用?
但是还有如下问题不清楚:
1.什么是绝对互斥的共用结构?
2.如何动态分配内存?我只知道记录文件声明时要指明它的类型,string类型要指明它的宽度。但是如何在程序中动态分配呢?也就是说,刚才的方法解决了如何动态制定每条记录中的字段的问题,但字段类型动态获取我不太清楚,请详谈,谢谢。

#12


delphi我才学了一个多月,我不知道里面有没有共用体,
动态分配内存?实在不行你就做成类,用create动态创建需要的数据,
结构中的字段自动是引用类型

#13


我也只是一个月多一点。
做成类的话也需要指明类型啊,而且是动态指定类型……总之就是在程序过程中搞出一系列指定名称和类型的纪录文件来。

#14


up

#15


up

#16


用xml存储试试看吧

#17


type
 T_person = Record

 d_frist_name:string;
 d_last_name:string;
 birth_date:TDate;

 case d_is_Manager:Boolean of
   false:d_annual_salary:double;
   true:(
         d_country:string;
         d_entry_date:TDate;
         d_Hourly_salay:double
         );
end;

#18


type
 T_person = Record

 d_frist_name:string;
 d_last_name:string;
 d_birth_date:TDate;

 case d_is_Manager:Boolean of
   false:(d_annual_salary:double);
   true:(
         d_country:string;
         d_entry_date:TDate;
         d_Hourly_salay:double
         );
end;

#19


这个定义方式如果可以执行的话,应该是可以解决动态分配类型的问题的;问题是
1.你有没有试过这样分配,而且定义出这种纪录的文件类型来?
2.程序中能够动态指定出d_is_Manager并分配么?
就是说你实际是否这么做过动态分配?

原谅我问的罗索,我曾经打算用variant,觉得一准行,十拿九稳。但后来发现variant不支持纪录。

#20


var person_list :file of T_person;

#21


我从object pascal语言参考手册上找到的

#22


你自己试一下,我没用过,应该可行吧,另外,d_is_manager应该是记录的一个成员吧、
你可以在集成环境里试一下,看T_person对象后面的点后面会不会出现这个 d_is_manager

#23


首先对不起各位,实在抱歉,我封闭培训了两周,两天前刚刚放出来。

notruiyi:我试了这个方法了,也查了帮助,但这个方法只能给一个变量动态赋类型(语法规定的,有且只有一个动态类型区)。如果目标就是一个记录文件中又一个动态变量的话,那这个办法堪称完美,但是它不能解决给纪录里所有类型赋动态类型的问题……又一个希望破灭了 :(

up一下,大家还有没有其他的办法啊?!谢谢各位了!

#24


好像难度比较大,如果必须要这样做,我觉得数据结构设计的就不合理了,导致你的代码很难实现,但仅对于这个问题,方法可能不多。

#25


楼上说的是,我打算明天告诉头头,这样实现不了,我要换成数据库!实在是顶不住了!



不过也怪不得别人,我自己选的要用纪录的……


也不能怪我啊……我才学delphi俩月……    :(