1. 程式人生 > >DBGRID控制元件裡可以實現SHIFT複選嗎?怎麼設定?

DBGRID控制元件裡可以實現SHIFT複選嗎?怎麼設定?

////////////////////////////////////////////////
//    功能概述:公用的列表框選擇框,是用DBGrid網格
//
//    注意事項:希望用Query查詢列表
//
//    編寫時間:shuszj
//
//    編寫人員:2002.04.02
//
////////////////////////////////////////
unit uSelect_DBGrid;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ImgList, Grids, DBGrids, ComCtrls, StdCtrls, Mask, 
  ToolWin, DBTables, USELECT, XPMenu, Buttons, ExtCtrls, ADODB;

const
  WM_SelectShare = WM_USER +10;          //公用列表

type
  TSzjDBGrid = class(TDBGrid);
  TFmSelect_DBGrid = class(TFmSelect)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure DBGrid1CellClick(Column: TColumn);
    procedure DBGrid1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure SpeedButton1Click(Sender: TObject);
  private
    m_sOne, m_sTwo :Integer;              //記下點選的當前的記錄的行
    m_OneBMark, m_TwoBMark :TBookmark;    //記下點選的標籤
    { Private declarations }
  public
    { Public declarations }
    procedure FPostion(Lft,Tp:integer);
  end;

var
  FmSelect_DBGrid: TFmSelect_DBGrid;

implementation

{$R *.dfm}

{ TFmSelect_DBGrid }

procedure TFmSelect_DBGrid.FPostion(Lft, Tp: integer);
begin
  Self.Top :=Tp;
  Self.Left :=Lft;
end;

procedure TFmSelect_DBGrid.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  inherited;
  Action :=caFree;
  FmSelect_DBGrid :=nil;
end;

procedure TFmSelect_DBGrid.FormCreate(Sender: TObject);
begin
  inherited;
//  SetWindowLong(Self.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);       //在工作列遮蔽
end;

procedure TFmSelect_DBGrid.DBGrid1CellClick(Column: TColumn);
begin
  inherited;
  if (gSDataSet is TTable) or (gSDataSet is TQuery) then
  begin  
    if ThirdQuery.IsEmpty then
      Exit;
    m_OneBMark :=ThirdQuery.GetBookmark;
  end
  else
    if (gSDataSet is TADOTable) or (gSDataSet is TADOQuery) then
    begin
      if ADOThirdQuery.IsEmpty then
        Exit;
      m_OneBMark :=ADOThirdQuery.GetBookmark;
    end;
  m_sOne :=TSzjDBGrid(DBGrid1).Row;
end;

procedure TFmSelect_DBGrid.DBGrid1MouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  inherited;
  if (gSDataSet is TTable) or (gSDataSet is TQuery) then
    if Button =mbleft then
    begin
      if ssShift in Shift then
      begin
        m_TwoBMark :=ThirdQuery.GetBookmark;
        m_sTwo :=TSzjDBGrid(DBGrid1).Row;
        if (m_sOne=0) or (m_OneBMark =nil) then
          Exit;
        with ThirdQuery do
        begin
          if m_sOne < m_sTwo then
          begin
            GotoBookmark(m_OneBMark);
            while not eof do
            begin
              DBGrid1.SelectedRows.CurrentRowSelected :=True;
              if CompareBookmarks(m_TwoBMark,GetBookmark) =0 then  
                Exit;
              Next;
            end;
          end
          else
          begin
            GotoBookmark(m_TwoBMark);
            while not eof do
            begin
              DBGrid1.SelectedRows.CurrentRowSelected :=True;
              if CompareBookmarks(m_OneBMark,GetBookmark) =0 then
                Exit;
              Next;
            end;
          end;
        end;
      end
      else
        CheckBox1.Checked :=False;
    end
  else
    if (gSDataSet is TADOTable) or (gSDataSet is TADOQuery) then
      if Button =mbleft then
      begin
        if ssShift in Shift then
        begin
          m_TwoBMark :=ThirdQuery.GetBookmark;
          m_sTwo :=TSzjDBGrid(DBGrid1).Row;
          if (m_sOne=0) or (m_OneBMark =nil) then
            Exit;
          with ThirdQuery do
          begin
            if m_sOne < m_sTwo then
            begin
              GotoBookmark(m_OneBMark);
              while not eof do
              begin
                DBGrid1.SelectedRows.CurrentRowSelected :=True;
                if CompareBookmarks(m_TwoBMark,GetBookmark) =0 then  
                  Exit;
                Next;
              end;
            end
            else
            begin
              GotoBookmark(m_TwoBMark);
              while not eof do
              begin
                DBGrid1.SelectedRows.CurrentRowSelected :=True;
                if CompareBookmarks(m_OneBMark,GetBookmark) =0 then
                  Exit;
                Next;
              end;
            end;
          end;
        end
        else
          CheckBox1.Checked :=False;
      end   
end;

procedure TFmSelect_DBGrid.SpeedButton1Click(Sender: TObject);
begin
  inherited;
  if (gSDataSet is TTable) or (gSDataSet is TQuery) then
    if ThirdQuery.IsEmpty then
    begin
      Close;
      Exit;
    end
  else
    if (gSDataSet is TADOTable) or (gSDataSet is TADOQuery) then
      if ADOThirdQuery.IsEmpty then
      begin
        Close;
        Exit;
      end;
  gValue:=gSDataSet.Fields[0].AsString;
  SendMessage(gHandle,WM_SelectShare,0,0);
  Close;
end;

end.
仔細看一下上面這個單元,裡面就有寫