.net下的winform开发程序还是用delphi2005的vcl for .net好! ( 积分: 0 )

  • 主题发起人 主题发起人 mrzj
  • 开始时间 开始时间
M

mrzj

Unregistered / Unconfirmed
GUEST, unregistred user!
我学了段时间的C#,发现其设计思想和delphi真是一点都不同,如说这两个软件都主要出自一手之手,我是不信的,因为二者间的内涵差距太大了。
我下面只讲C#和delphi2005的vcl for .net,它们历史产品我就不提,还有我只提开发exe方式的应用程序,不提网站应用方面的开发,以下提到的delphi全是指delphi2005的vcl for .net。
C#的思想真是继承了vc、java,编程的界面里也引入了delphi的样子。但是C#的控件和delphi的控件真是貌似神离,其内涵是完全不同。
delphi和C#在开发应用软件这方面,C#的设计思想、学习难度都是比delphi难的,C#的控件全是一个多用,要想撑握好还是不容易的,而delphi基本上全是单一的。
就说数据库操作相关的这部分,C#下的大部分控件都是可以绑定数据集的,而每个数据集又可以有多个数据视图,就拿最简单的SQL语句"select * from table1 /n/r select * from table2"一起来执行,这对C#来讲都是两个结果集,如果不切换结果集的话永远都是取第一个select的结果。
而delphi就不是这样,delphi3什么样,到了delphi的vcl for .net基本上还是什么样,其讲究的是单线联系,还拿上面那个SQL语句"select * from table1"#13#10"select * from table2"一起来执行,肯定取得的是第二个结果集,如果你即想取得第一个结果集又想取得第二个结果集,在delphi里就把它分开二次执行就行了。
在通常情况下,C#是有了CS文件是没用的(里面上来就写程序逻辑代码的CS文件),CS文件里必须要有类才有意义,而同样是.net的delphi就没这穷讲究,只要有pas文件就成了,因为其设计思想就是一个unit就是基类,unit就把class给包含了,这个unit单元包含了类的大多数基本特征,如私有的、公共的、构造与析构函数等,它有这么多类的特征在使的时候却不用create,真是方便。
我目前的理解就是开发同样功能、同样界面的程序,delphi比C#高好几倍。我下面用事实说话,看代码,有不同意见的各位C#高手也应用事实说话,看能否也用一条C#语句把下面的功能给实现了,然后在反驳我的观点。
我下面举一个我写的C#函数,这函数在delphi里用一条语句就可以实现,但是在C#里就要写一大堆。其功能是根据关键字和其值在相对应的dataGrid里选中首条符合的记录。
//mrzj 2005.1.17
//在dataGrid中当前的DataView中查找第一个符合条件记录的行号
//查询字段指的是数据库的字段
//分号是分隔符
//找到返回的行数
//返回值<0,没找到
//例:FindRecord(dataGrid1,"编号;部门名称","8;18");
public int FindRecord(DataGrid dg,string keyfield,string valstr)
{
//startline默认值为0
return FindRecord(dg,keyfield,valstr,0);
}
//在dataGrid中当前的DataView中查找第一个符合条件记录的行号,从startline行开始往后找
public int FindRecord(DataGrid dg,string keyfield,string valstr,int startline)
{
char delimChar = ';';
string[] fields=null;
string[] values=null;

fields=keyfield.Split(delimChar);
values=valstr.Split(delimChar);
int count=fields.GetLength(0);
//查找的字段与值的个数不匹配
if (values.GetLength(0)!=count) return -1;
DataRowView drv = (DataRowView)dg.BindingContext[dg.DataSource,dg.DataMember].Current;
DataColumn[] myKey = new DataColumn[count];
object[] Vals = new object[count];
int i=0;
for (i=0;i<count;i++)
{
myKey=drv.Row.Table.Columns[fields];
Vals =values;
}
drv.Row.Table.PrimaryKey = myKey;
DataRow foundRow = drv.Row.Table.Rows.Find(Vals);
//没有找到记录
if (foundRow==null) return -2;
int tmpint=startline;
if (tmpint<0) tmpint=0;
for(i=tmpint;
i<drv.Row.Table.Rows.Count;i++)
{
if (drv.Row.Table.Rows==foundRow) break;
}
return i;
}
我认为borland公司现在也很彷徨,所以在delphi2005里提供了三种开发方法,其中的二种都照搬vs.net,只有这vcl for .net才保持了原来delphi的传统,希望borland公司内部能统一意见,选定vcl for .net为以后的发展方向。
 
我学了段时间的C#,发现其设计思想和delphi真是一点都不同,如说这两个软件都主要出自一手之手,我是不信的,因为二者间的内涵差距太大了。
我下面只讲C#和delphi2005的vcl for .net,它们历史产品我就不提,还有我只提开发exe方式的应用程序,不提网站应用方面的开发,以下提到的delphi全是指delphi2005的vcl for .net。
C#的思想真是继承了vc、java,编程的界面里也引入了delphi的样子。但是C#的控件和delphi的控件真是貌似神离,其内涵是完全不同。
delphi和C#在开发应用软件这方面,C#的设计思想、学习难度都是比delphi难的,C#的控件全是一个多用,要想撑握好还是不容易的,而delphi基本上全是单一的。
就说数据库操作相关的这部分,C#下的大部分控件都是可以绑定数据集的,而每个数据集又可以有多个数据视图,就拿最简单的SQL语句"select * from table1 /n/r select * from table2"一起来执行,这对C#来讲都是两个结果集,如果不切换结果集的话永远都是取第一个select的结果。
而delphi就不是这样,delphi3什么样,到了delphi的vcl for .net基本上还是什么样,其讲究的是单线联系,还拿上面那个SQL语句"select * from table1"#13#10"select * from table2"一起来执行,肯定取得的是第二个结果集,如果你即想取得第一个结果集又想取得第二个结果集,在delphi里就把它分开二次执行就行了。
在通常情况下,C#是有了CS文件是没用的(里面上来就写程序逻辑代码的CS文件),CS文件里必须要有类才有意义,而同样是.net的delphi就没这穷讲究,只要有pas文件就成了,因为其设计思想就是一个unit就是基类,unit就把class给包含了,这个unit单元包含了类的大多数基本特征,如私有的、公共的、构造与析构函数等,它有这么多类的特征在使的时候却不用create,真是方便。
我目前的理解就是开发同样功能、同样界面的程序,delphi比C#高好几倍。我下面用事实说话,看代码,有不同意见的各位C#高手也应用事实说话,看能否也用一条C#语句把下面的功能给实现了,然后在反驳我的观点。
我下面举一个我写的C#函数,这函数在delphi里用一条语句就可以实现,但是在C#里就要写一大堆。其功能是根据关键字和其值在相对应的dataGrid里选中首条符合的记录。
//mrzj 2005.1.17
//在dataGrid中当前的DataView中查找第一个符合条件记录的行号
//查询字段指的是数据库的字段
//分号是分隔符
//找到返回的行数
//返回值<0,没找到
//例:FindRecord(dataGrid1,"编号;部门名称","8;18");
public int FindRecord(DataGrid dg,string keyfield,string valstr)
{
//startline默认值为0
return FindRecord(dg,keyfield,valstr,0);
}
//在dataGrid中当前的DataView中查找第一个符合条件记录的行号,从startline行开始往后找
public int FindRecord(DataGrid dg,string keyfield,string valstr,int startline)
{
char delimChar = ';';
string[] fields=null;
string[] values=null;

fields=keyfield.Split(delimChar);
values=valstr.Split(delimChar);
int count=fields.GetLength(0);
//查找的字段与值的个数不匹配
if (values.GetLength(0)!=count) return -1;
DataRowView drv = (DataRowView)dg.BindingContext[dg.DataSource,dg.DataMember].Current;
DataColumn[] myKey = new DataColumn[count];
object[] Vals = new object[count];
int i=0;
for (i=0;i<count;i++)
{
myKey=drv.Row.Table.Columns[fields];
Vals =values;
}
drv.Row.Table.PrimaryKey = myKey;
DataRow foundRow = drv.Row.Table.Rows.Find(Vals);
//没有找到记录
if (foundRow==null) return -2;
int tmpint=startline;
if (tmpint<0) tmpint=0;
for(i=tmpint;
i<drv.Row.Table.Rows.Count;i++)
{
if (drv.Row.Table.Rows==foundRow) break;
}
return i;
}
我认为borland公司现在也很彷徨,所以在delphi2005里提供了三种开发方法,其中的二种都照搬vs.net,只有这vcl for .net才保持了原来delphi的传统,希望borland公司内部能统一意见,选定vcl for .net为以后的发展方向。
 
我觉得c#和delphi在语言在细节上有很多一致性:
1. 在OO语言中加上了property概念,而不是像java/c++一样靠命名规范
2. 使用对象函数指针来实现事件,而java必须依赖接口和内部类
3. out参数,params参数
4. 派生类可以使用new来断开继承关系
至于,类库/控件设计风格上。我觉得delphi完全是VB风格(大家不要仍鸡蛋)。一个控件类中集成很多功能,以方便可视化编程,降低使用难度和学习难度。但是一个类完成的功能太多,后果就是类的复用程度降低。所以java/c++等,他们的类库中类的颗粒度比较小,方便在不同的应用程序中进行组合。
至于数据库,delphi是以记录为基本操作单位,每次只能访问当前纪录(像dbase/foxpro)。C#以记录集为基本操作单位,没有当前纪录的概念,以无状态、无长连接为目标。我想这和delphi出现的时代,有很大关系。既然无状态,就不会在DataTable中保存当前纪录,想象如果一个DataTable在多个线程中共享,每个线程可能都需要一个当前纪录。所以DataTable中的查找方法,和数据库中的类似:DataTable.Select()。是查询出一个结果集。
vcl for .net的目的不是将vcl技术带入.net大家族,而是让基于vcl的程序能够在.net中得以运行。所以不要指望vcl for .net会带来更多的东西,也不要指望.net社群的人会关注vcl。
由于vcl的模型和.net的控件模型无法兼容,borland无法做到vcl基于.net现有的控件,当然也无法让.net的控件基于vcl。.net中Winforms的所有控件都关联着窗口句炳,而vcl允许图形控件。单单这点,就无法使vcl和.net的控件兼容。
我个人觉得,.net要更先进一些,但是在WinForms数据库编程领域不太成熟。这需要一段时间。
 

Similar threads

D
回复
0
查看
815
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部