var lpos,cpos,linelength:integer;
procedure Tsb_byywh_zj.DBMemo3KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
   Lpos:=SendMessage(dbMemo3.Handle,EM_LINEFROMCHAR,dbMemo3.SelStart,0);
   Cpos:=SendMessage(dbMemo3.Handle,EM_LINEINDEX,Lpos,0);
   LineLength:=SendMessage(dbMemo3.Handle,EM_LINELENGTH,Cpos,0);
   Cpos:=dbMemo3.SelStart-CPos;
   //======以上代码是用几个变量取文本框中一行字符的个数===========
end;
其中可以是dbmemo1,dbmemo1,dbmemo1等等?怎么封装这些不同的对象呢?〉
请高手帮忙?因为在好多地方要用到这些东西

解决方案 »

  1.   

    看不太明白,
    是不是几个同类的部件要使用一个事件,但是要得到其中的内容?如果是这样的话使用sender应该可以解决。
      Lpos:=SendMessage(TdbMemo(sender).Handle,EM_LINEFROMCHAR,dbMemo3.SelStart,0);
       Cpos:=SendMessage(TdbMemo(sender).Handle,EM_LINEINDEX,Lpos,0);
       LineLength:=SendMessage(TdbMemo(sender).Handle,EM_LINELENGTH,Cpos,0);
       Cpos:=TdbMemo(sender).SelStart-CPos;
    把所有DBDemo的keydown事件指向这一个。
      

  2.   

    public
        { Public declarations }
        procedure KeyDown(Sender: TObject; var Key: Word;var lpos,cpos,linelength:integer;
                   Shift: TShiftState);//声明一个过程
    procedure Tsb_byywh_zj.KeyDown(Sender: TObject; var Key: Word; var lpos,cpos,linelength:integer;
      Shift: TShiftState);
    begin
      with Sender As TDBMemo do
      begin
        Lpos:=SendMessage(Handle,EM_LINEFROMCHAR,SelStart,0);
        Cpos:=SendMessage(Handle,EM_LINEINDEX,Lpos,0);
        LineLength:=SendMessage(Handle,EM_LINELENGTH,Cpos,0);
        Cpos:=SelStart-CPos;
      end;
       //======以上代码是用几个变量取文本框中一行字符的个数===========
    end;
    大哥我试了可是出这样一个问题:method 'keydown' hide virtual method of base type 
    'TwinControl'是怎么回事呀?你可以在窗体上新建一个dbdemo试一下,我不知道是怎么回事?谢谢!!!!
      

  3.   

    简单的方法就是你为一个dbdemo创建onkeydown事件,然后选择其他的dbmemo,在选中的dbmemo的onkeydown事件中选择开始创建的那个事件。怎么说得这么咬嘴?你这样声明的不对,因为它是form的keydown了,而且应该是published的。
      

  4.   

    简单的说    { Public declarations }
        procedure KeyDown(Sender: TObject; var Key: Word;var lpos,cpos,linelength:integer;
                   Shift: TShiftState);//声明一个过程
    procedure Tsb_byywh_zj.KeyDown(Sender: TObject; var Key: Word; var lpos,cpos,linelength:integer;
      Shift: TShiftState);
    begin
      with Sender As TDBMemo do
      begin
        Lpos:=SendMessage(Handle,EM_LINEFROMCHAR,SelStart,0);
        Cpos:=SendMessage(Handle,EM_LINEINDEX,Lpos,0);
        LineLength:=SendMessage(Handle,EM_LINELENGTH,Cpos,0);
        Cpos:=SelStart-CPos;
      end;
    end;
    ========================
    已经没问题.只是form本身已经继承了twincontrol的keydown事件了.所以你只有用其他的过程名称了.