DBGrid显示时,如何让光标停留在第一行第一列的第一个字符的位置?

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      I: Integer;
    begin
      SendMessage(DBGrid1.Handle, WM_LBUTTONDOWN, 0, $00200020);
      SendMessage(DBGrid1.Handle, WM_LBUTTONUP, 0, $00200020);
      DBGrid1.EditorMode := True;
      for I := 0 to DBGrid1.ComponentCount - 1 do
        if DBGrid1.Components[I] is TCustomEdit then
        begin
          TEdit(DBGrid1.Components[I]).SelStart := 0;
          Break;
        end;
    end;
      

  2.   

    好久没来CSDN了,竟然发现伴水老大回来了,而且还亲自回答了我的问题,真是三生有幸啊!
    以后我天天上CSDN来。
      

  3.   

    有问题还要请教伴水,还望老兄您不吝赐教。
    1。SendMessage(DBGrid1.Handle, WM_LBUTTONDOWN, 0, $00200020);
    $00200020是什么意思?如果是$00200020,则运行效果是光标停到第二列。
    如果改成0,则实现效果。
    2。  for I := 0 to DBGrid1.ComponentCount - 1 do
        if DBGrid1.Components[I] is TCustomEdit then
        begin
          TEdit(DBGrid1.Components[I]).SelStart := 0;
          TEdit(DBGrid1.Components[I]).Setfocus;//这样写为什么不行?
          Break;
        end;
    3。如果这段代码放在form.onshow事件中,执行是有效果的,但是我由于实际需要,把这段代码放在了TTabcontrol的onchange事件中,而在窗体show的时候让TTabcontrol触发onchange事件,结果就看不到效果。真的是很奇怪。代码如下。
    procedure TfrmBase.FormShow(Sender: TObject);
    begin
      tabBase.TabIndex := fBaseindex; //fBaseindex是别的窗体传进的参数。
      tabBase.OnChange(tabBase);
      grd.DefaultDrawing := false;
      grd.Options := [dgediting,dgTitles,dgColumnResize,dgColLines,
        dgRowLines,dgTabs,dgConfirmDelete,dgCancelOnExit];
    end;procedure TfrmBase.tabBaseChange(Sender: TObject);
    var i : integer;
    begin
      dm.tbbase.active := false;
      case tabBase.TabIndex of
      0:
        dm.tbBase.TableName := 'tb_anyou';
      1:
        dm.tbBase.TableName := 'tb_cbbm';
      2:
        dm.tbBase.TableName := 'tb_cbr';
      3:
        dm.tbBase.TableName := 'tb_wzzj';
      4:
        dm.tbBase.TableName := 'tb_pztj';
      5:
        dm.tbBase.TableName := 'tb_zwmc';
      6:
        dm.tbBase.TableName := 'tb_tzsl';
      7:
        dm.tbBase.TableName := 'tb_dcxwdd';
      8:
        dm.tbBase.TableName := 'tb_clyj';
      end;
      try
        dm.tbbase.active := true;
        for i := 0 to grd.Columns.Count -1 do
          grd.Columns[i].Title.alignment := taCenter;
        SendMessage(grd.Handle, WM_LBUTTONDOWN,0,0);
        SendMessage(grd.Handle, WM_LBUTTONUP,0,0);
        grd.EditorMode := true;
        for i:=0 to grd.ComponentCount-1 do
          if grd.Components[i] is TInplaceEdit  then
          begin
            TInplaceEdit(grd.Components[i]).SelStart := 0 ;
            TInplaceEdit(grd.Components[i]).Brush.Color := clinfobk;
            break;
          end;
        self.caption := '基础档案——' + tabBase.Tabs[tabBase.tabindex];
      except
        application.MessageBox('数据表打开失败!','提示',mb_ok + mb_iconInformation);
      end;
    end;
      

  4.   

    看来这个牛角尖是钻对了。
      tabBase.TabIndex := fBaseindex; 
      tabBase.OnChange(tabBase);
    如果这段代码放在主窗口的Onshow中,一切OK,一点问题都没有。如果DBGrid在子窗口上, 要实现光标停留在第一行第一列的第一个字符的位置,这段代码放在Onshow中是没效果的,可以看到第一行第一列背景变成黄色,但是得不到焦点。这里面肯定有猫腻,谁又能来给我开开窍呢?
      

  5.   

    把主要的代码贴出来吧主窗体中调用子窗体并显示的代码。
    procedure TfrmMain.Action13Execute(Sender: TObject);
    begin
      if not assigned(frmbase) then
      begin
        frmBase := TfrmBase.create(application,(sender as TAction).groupindex);
        frmBase.Caption := '基础档案——' + (Sender as TAction).Caption;
      end;
    end;
    子窗体中部分变量和函数声明如下
      private
        fbaseindex : integer;
        { Private declarations }
      public
        constructor Create(Aowner : TComponent;bindex : integer);overload;
      published
        property Baseindex : integer read fBaseindex write fBaseindex;
      end;
    底下是代码:
    constructor Tfrmbase.Create(Aowner : TComponent;bindex : integer);
    begin
      inherited create(AOwner);
      fBaseindex := bindex;
    end;
    procedure TfrmBase.FormShow(Sender: TObject);
    begin
      tabBase.TabIndex := fBaseindex; 
      tabBase.OnChange(tabBase);
    end;procedure TfrmBase.tabBaseChange(Sender: TObject);
    var i : integer;
    begin
      dm.tbbase.active := false;
      case tabBase.TabIndex of
      0:
        dm.tbBase.TableName := 'tb_anyou';
      1:
        dm.tbBase.TableName := 'tb_cbbm';
      2:
        dm.tbBase.TableName := 'tb_cbr';
      3:
        dm.tbBase.TableName := 'tb_wzzj';
      4:
        dm.tbBase.TableName := 'tb_pztj';
      5:
        dm.tbBase.TableName := 'tb_zwmc';
      6:
        dm.tbBase.TableName := 'tb_tzsl';
      7:
        dm.tbBase.TableName := 'tb_dcxwdd';
      8:
        dm.tbBase.TableName := 'tb_clyj';
      end;
      try
        dm.tbbase.active := true;
        for i := 0 to grd.Columns.Count -1 do
          grd.Columns[i].Title.alignment := taCenter;
        SendMessage(grd.Handle, WM_LBUTTONDOWN,0,0);
        SendMessage(grd.Handle, WM_LBUTTONUP,0,0);
        grd.EditorMode := true;
        for i:=0 to grd.ComponentCount-1 do
          if grd.Components[i] is TInplaceEdit  then
          begin
            TInplaceEdit(grd.Components[i]).SelStart := 0 ;
            TInplaceEdit(grd.Components[i]).Brush.Color := clinfobk;
            break;
          end;
      except
        application.MessageBox('数据表打开失败!','提示',mb_ok + mb_iconInformation);
      end;
    end;
      

  6.   

    1、参考帮助
    WM_LBUTTONDOWN  
    fwKeys = wParam;        // key flags 
    xPos = LOWORD(lParam);  // horizontal position of cursor 
    yPos = HIWORD(lParam);  // vertical position of cursor
    lParam为表示坐标,前两个字节表示X,后两个字节表示Y $0000 0000
    如果你是每次都重新打开,那么就不需要定位了,默认就是在首行首列~~2、SetFocus之前最好做CanFocus的判断
    这类问题不要问,你自己测试一下不就知道了,何必费口舌~~3、同上
    //参考代码~~
    procedure TForm1.TabControl1Change(Sender: TObject);
    var
      I: Integer;
    begin
      Table1.Close;
      case TTabControl(Sender).TabIndex of
        0: Table1.TableName := 'biolife.db';
        1: Table1.TableName := 'animals.dbf';
      end;
      Table1.Open;  if DBGrid1.CanFocus then DBGrid1.SetFocus;
      DBGrid1.EditorMode := True;
      for I := 0 to DBGrid1.ComponentCount - 1 do
        if DBGrid1.Components[I] is TCustomEdit then
        begin
          TEdit(DBGrid1.Components[I]).SelStart := 0;
          Break;
        end;
    end;procedure TForm1.FormShow(Sender: TObject);
    begin
      TabControl1Change(TabControl1);
    end;
      

  7.   

    谢谢伴水的回答。
    你的代码放在主窗体中执行是没问题的。
    但是我的程序是MDI,这段代码是放在子窗体中运行的。子窗体中是看不到效果的,可以看到第一行第一列背景变成黄色,但是得不到焦点。我现在就是搞不明白为什么会这样,也许效果的实现并不是目的,搞清原理才是最主要的。
      

  8.   

    //前提要早说 -_-!!!!
    //人设计出来的东西没这样多原理可讲~~procedure TForm2.FormShow(Sender: TObject);
    begin
      if CanFocus then SetFocus;
      TabControl1Change(TabControl1);
    end;