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#和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为以后的发展方向。