我对第七条Sender的用法还不熟,能再展开一点讲吗?谢谢!

解决方案 »

  1.   

    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;
    //....
      

  2.   

    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;
      

  3.   

    不过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!麻烦您给详细的介绍一下吧?
      

  4.   

    Copy('1234567', 3, 5) = '34567'
    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'//常量比函数处理要快
      

  5.   

    Yeah..
     MaxInt = 2147483647;
     I think you can Use 10000 and so on to replace the MaxInt;
      

  6.   

    No12
    枚举窗体中的控件,为相同控件的同一属性赋值:
    for i:=0 to self.componentcount-1 do
    begin
      if (self.components[i] is TEdit) then
         (self.components[i] as TEdit).Text:='';
    end;
      

  7.   

    No.13
    Table1.FieldByName('姓名').AsString //不建议
    Table1.FieldValues['姓名'] //Borland建议的方法。以及ParamValues[]
      

  8.   

    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)代替以上两句
      

  9.   

    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
      

  10.   

    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;
      

  11.   

    No.15
    取得多次返回的数据集
    ADODataSet1.Recordset := ADOQuery.NextRecordset(0);
    ADODataSet2.Recordset := ADOQuery.NextRecordset(0);
      

  12.   

    No.4 字段赋值
    //...
    Table1['姓名'] := Edit1.Text; //建议//简短、扩充性好
    Table1['日期'] := Date;No.13
    Table1.FieldByName('姓名').AsString //不建议
    Table1.FieldValues['姓名'] //Borland建议的方法。以及ParamValues[]
    // 请解释一下
      No.4  :扩充性好主要在哪些情况下呢?
      No.13 : 为什么要这样呢?
      

  13.   

    对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;
      

  14.   

    其实No.4和No.13是处理同一个属性TDataSet.FieldValues;
    如果你即使用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['姓名;日期;部门']; //建议使用
      

  15.   

    //对 newwen 所述整理"No13 创建对象"
    No.16 创建全局对象之前、先判断是否已经被实例化
    begin
      Form2 := TForm2.Create(Self); //不建议
    ////////
      if not Assigend(Form2) then
        Form2 := TForm2.Create(Self); //建议//避免重复创建
    end;//另外 释放 对象 时 最好 将 对象变量 赋值为 nil
      

  16.   

    No.17
    计算字符串表达式
    [由 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拷过来用。 
    此控件可以进行复杂的运算,如支持'(',组合运算等。甚至可以对整型数进行位运算。
      

  17.   

    No.18
    动态生成SQL语句 // for sql server
    create procedure SelectTable
     @tablename varchar(255)
    AS
    declare @cmd varchar(255)
    set @cmd = 'select * from ' + @tablename
    exec (@cmd)