Sender指事件的触发者参考如下代码 //.... procedure ButtonClick(Sender: TObject); public //.... procedure TForm1.ButtonClick(Sender: TObject); begin ShowMessage('你点击的是:' + TButton(Sender).Name); //通过Sender你可以知道是谁触发了事件 end;procedure TForm1.FormCreate(Sender: TObject); begin Button1.OnClick := ButtonClick; Button2.OnClick := ButtonClick; //两个按钮的点击事件都指向同一个地址 end; //....
No.11 Result函数指针 function FuncName: Boolean; begin FuncName := True; //不建议//并且放在赋值号右边不能当普通变量 /////// Result := True; //建议//扩充性好 end;function FuncSum(A: array of Integer): Integer; var I: Integer; begin Result := 0; for I := Low(A) to High(A) do Result := Result + A[I]; //可不能用 FuncSum := FuncSum + A[I]; end;
不过maxint应该是Maximum values for integer data types 吧? 怎么会在这里用呢? No.10 利用MaxInt常量 begin Caption := Copy(Edit1.Text, 3, Length(Edit1.Text) - 3 + 1); //不建议 /////// Caption := Copy(Edit1.Text, 3, MaxInt); //建议//嘻嘻,少计算一次 end;这个i实在是don't know!麻烦您给详细的介绍一下吧?
Yeah.. MaxInt = 2147483647; I think you can Use 10000 and so on to replace the MaxInt;
No12 枚举窗体中的控件,为相同控件的同一属性赋值: for i:=0 to self.componentcount-1 do begin if (self.components[i] is TEdit) then (self.components[i] as TEdit).Text:=''; end;
No.7 利用Sender参数,使代码通用 procedure TForm1.Edit1Change(Sender: TObject); begin if Edit1.Text = '' then //不建议 Edit1.Color := clRed; /////// if TEdit(Sender).Text = '' then //不建议,复制到XX_XChange中很容易错 TEdit(Sender).Color := clRed; /////// if Sender is TEdit then if TEdit(Sender).Text = '' then TEdit(Sender).Color := clRed; end;No13 创建对象 vat x:Tx; x:=Tx.Create; //不建议,x可能被多次创建 x..... x.Free;//不建议,x还指向某处 //////// vat x:Tx; if not assigend(x) then x:=Tx.Create; //建议,x为nil时才创建 x..... x.free; x:=nil; //建议,释放后指向nil,或用FreeAndNil(x)代替以上两句
No.14 对数据进行统计 // for sql server select (case grouping(name) when 1 then name else '合计' end) as name , sum(score) as score from table group by name with rollup 结果形式: name score a 10 b 20 合计 30
No12 枚举窗体中的控件,为相同控件的同一属性赋值: for i:=0 to self.componentcount-1 do //不建议,万一某个component被释放 begin if (self.components[i] is TEdit) then (self.components[i] as TEdit).Text:=''; end; ////// for i:=self.componentcount-1 downto 0 do //建议,呵呵 begin if (self.components[i] is TEdit) then (self.components[i] as TEdit).Text:=''; end;
对no.5和6的补充 No.5 使用Self指针 begin Edit1.Parent := Form1; //不建议//Form1只是一个变量//如果没有分配资源怎么办? /////// Edit1.Parent := Self; //建议,真正的面向对象思路。在类的方法中,不应该直接调用类的实例。 end;No.6 遍历数据集 var I: Integer; begin Query1.First; for I := 0 to Query1.RecordCount - 1 do begin //不建议//容易被影响 Query1.Next; {}; end; ///// Query1.First; while not Query1.Eof do begin //建议,recordcount只支持少数某些本地数据库,对于c/s数据库并不支持,我遇到过用recordcount取不出数据的情况。 { } Query1.Next; end; end;
//....
procedure ButtonClick(Sender: TObject);
public
//....
procedure TForm1.ButtonClick(Sender: TObject);
begin
ShowMessage('你点击的是:' + TButton(Sender).Name);
//通过Sender你可以知道是谁触发了事件
end;procedure TForm1.FormCreate(Sender: TObject);
begin
Button1.OnClick := ButtonClick;
Button2.OnClick := ButtonClick;
//两个按钮的点击事件都指向同一个地址
end;
//....
function FuncName: Boolean;
begin
FuncName := True; //不建议//并且放在赋值号右边不能当普通变量
///////
Result := True; //建议//扩充性好
end;function FuncSum(A: array of Integer): Integer;
var I: Integer;
begin
Result := 0;
for I := Low(A) to High(A) do
Result := Result + A[I]; //可不能用 FuncSum := FuncSum + A[I];
end;
怎么会在这里用呢?
No.10 利用MaxInt常量
begin
Caption := Copy(Edit1.Text, 3, Length(Edit1.Text) - 3 + 1); //不建议
///////
Caption := Copy(Edit1.Text, 3, MaxInt); //建议//嘻嘻,少计算一次
end;这个i实在是don't know!麻烦您给详细的介绍一下吧?
Copy('1234567', 3, 6) = '34567'
Copy('1234567', 3, 7) = '34567'
//....
Copy('1234567', 3, Length('1234567') - 3 + 1) = '34567'
//....
Copy('1234567', 3, Length('1234567')) = '34567'
//....
Copy('1234567', 3, MaxInt) = '34567'//常量比函数处理要快
MaxInt = 2147483647;
I think you can Use 10000 and so on to replace the MaxInt;
枚举窗体中的控件,为相同控件的同一属性赋值:
for i:=0 to self.componentcount-1 do
begin
if (self.components[i] is TEdit) then
(self.components[i] as TEdit).Text:='';
end;
Table1.FieldByName('姓名').AsString //不建议
Table1.FieldValues['姓名'] //Borland建议的方法。以及ParamValues[]
procedure TForm1.Edit1Change(Sender: TObject);
begin
if Edit1.Text = '' then //不建议
Edit1.Color := clRed;
///////
if TEdit(Sender).Text = '' then //不建议,复制到XX_XChange中很容易错
TEdit(Sender).Color := clRed;
///////
if Sender is TEdit then
if TEdit(Sender).Text = '' then
TEdit(Sender).Color := clRed;
end;No13 创建对象
vat x:Tx;
x:=Tx.Create; //不建议,x可能被多次创建
x.....
x.Free;//不建议,x还指向某处
////////
vat x:Tx;
if not assigend(x) then
x:=Tx.Create; //建议,x为nil时才创建
x.....
x.free;
x:=nil; //建议,释放后指向nil,或用FreeAndNil(x)代替以上两句
对数据进行统计 // for sql server
select
(case grouping(name) when 1 then name else '合计' end) as name
, sum(score) as score
from table
group by name with rollup
结果形式:
name score
a 10
b 20
合计 30
枚举窗体中的控件,为相同控件的同一属性赋值:
for i:=0 to self.componentcount-1 do //不建议,万一某个component被释放
begin
if (self.components[i] is TEdit) then
(self.components[i] as TEdit).Text:='';
end;
//////
for i:=self.componentcount-1 downto 0 do //建议,呵呵
begin
if (self.components[i] is TEdit) then
(self.components[i] as TEdit).Text:='';
end;
取得多次返回的数据集
ADODataSet1.Recordset := ADOQuery.NextRecordset(0);
ADODataSet2.Recordset := ADOQuery.NextRecordset(0);
//...
Table1['姓名'] := Edit1.Text; //建议//简短、扩充性好
Table1['日期'] := Date;No.13
Table1.FieldByName('姓名').AsString //不建议
Table1.FieldValues['姓名'] //Borland建议的方法。以及ParamValues[]
// 请解释一下
No.4 :扩充性好主要在哪些情况下呢?
No.13 : 为什么要这样呢?
No.5 使用Self指针
begin
Edit1.Parent := Form1; //不建议//Form1只是一个变量//如果没有分配资源怎么办?
///////
Edit1.Parent := Self; //建议,真正的面向对象思路。在类的方法中,不应该直接调用类的实例。
end;No.6 遍历数据集
var
I: Integer;
begin
Query1.First;
for I := 0 to Query1.RecordCount - 1 do begin //不建议//容易被影响
Query1.Next;
{};
end;
/////
Query1.First;
while not Query1.Eof do begin //建议,recordcount只支持少数某些本地数据库,对于c/s数据库并不支持,我遇到过用recordcount取不出数据的情况。
{ }
Query1.Next;
end;
end;
如果你即使用BCB又使用Delphi建议你使用No.13
因为 默认属性 在BCB中没有No.4
Table1['姓名'] := Edit1.Text; //可以理解成Talbe1.FieldValues['姓名'] := Edit1.Text;
Table1['日期'] := Date;No.13
Table1.FieldByName('姓名').AsString //不建议
Table1.FieldValues['姓名'] //Borland建议的方法。以及ParamValues[]//默认属性 举例:
Memo1.Lines[0] //可以理解成Memo1.Lines.Strings[0]//请看No.4和No.13延伸用法
Table1.Edit1;
Table1['姓名'] := Table2['姓名']; //不建议
Table1['日期'] := Table2['日期'];
Table1['部门'] := Table2['部门'];
///////
Table1['姓名;日期;部门'] := Table2['姓名;日期;部门']; //建议使用
No.16 创建全局对象之前、先判断是否已经被实例化
begin
Form2 := TForm2.Create(Self); //不建议
////////
if not Assigend(Form2) then
Form2 := TForm2.Create(Self); //建议//避免重复创建
end;//另外 释放 对象 时 最好 将 对象变量 赋值为 nil
计算字符串表达式
[由 li_zhifu(东北人) 提供]
在Win2K下在Delphi中Import ActiveX Control,选Microsoft Script Control 1.0,安装,在应用程序中
ScriptControl1.Language:='JavaScript';
ShowMessage(ScriptControl1.Eval('2*3+5'));
就可以了。
在Win98中可以把Win2K下的msscript.ocx拷过来用。
此控件可以进行复杂的运算,如支持'(',组合运算等。甚至可以对整型数进行位运算。
动态生成SQL语句 // for sql server
create procedure SelectTable
@tablename varchar(255)
AS
declare @cmd varchar(255)
set @cmd = 'select * from ' + @tablename
exec (@cmd)