通用下拉选择框

object FormChoose: TFormChoose
  Left = 331
  Top = 269
  BorderStyle = bsDialog
  Caption = #36873#25321
  ClientHeight = 242
  ClientWidth = 439
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  OnClose = FormClose
  PixelsPerInch = 96
  TextHeight = 13
  object Panel1: TPanel
    Left = 0
    Top = 201
    Width = 439
    Height = 41
    Align = alBottom
    BevelOuter = bvNone
    TabOrder = 0
    object BitBtn2: TRzBitBtn
      Left = 208
      Top = 8
      FrameColor = 7617536
      Caption = #36807#28388
      Color = 15791348
      HotTrack = True
      TabOrder = 1
      OnClick = BitBtn2Click
      Glyph.Data = {
        36040000424D3604000000000000360000002800000010000000100000000100
        2000000000000004000000000000000000000000000000000000FFFFFF00FFFF
        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000
        0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
        FF000000000000000000000000000000000000000000FFFFFF0000000000FFFF
        FF00000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
        FF0000000000FFFFFF00000000000000000000000000FFFFFF0000000000FFFF
        FF00000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
        FF0000000000FFFFFF00000000000000000000000000FFFFFF00000000000000
        00000000000000000000000000000000000000000000FFFFFF00000000000000
        00000000000000000000000000000000000000000000FFFFFF00000000000000
        0000FFFFFF00000000000000000000000000000000000000000000000000FFFF
        FF000000000000000000000000000000000000000000FFFFFF00000000000000
        0000FFFFFF00000000000000000000000000C6C6C6000000000000000000FFFF
        FF000000000000000000000000000000000000000000FFFFFF00000000000000
        0000FFFFFF00000000000000000000000000C6C6C6000000000000000000FFFF
        FF000000000000000000000000000000000000000000FFFFFF00FFFFFF000000
        0000000000000000000000000000000000000000000000000000000000000000
        000000000000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF
        FF0000000000FFFFFF00000000000000000000000000FFFFFF0000000000FFFF
        FF00000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
        FF000000000000000000000000000000000000000000FFFFFF00000000000000
        0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
        FF00FFFFFF00000000000000000000000000FFFFFF00FFFFFF00FFFFFF000000
        00000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
        FF00FFFFFF0000000000FFFFFF0000000000FFFFFF00FFFFFF00FFFFFF000000
        0000FFFFFF0000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
        FF00FFFFFF00000000000000000000000000FFFFFF00FFFFFF00FFFFFF000000
        00000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00}
    end
    object BitBtn3: TRzBitBtn
      Left = 360
      Top = 8
      FrameColor = 7617536
      Caption = #21462#28040
      Color = 15791348
      HotTrack = True
      TabOrder = 0
      OnClick = BitBtn3Click
      Kind = bkCancel
    end
    object BitBtn1: TRzBitBtn
      Left = 284
      Top = 8
      FrameColor = 7617536
      Caption = #30830#23450
      Color = 15791348
      HotTrack = True
      TabOrder = 2
      OnClick = BitBtn1Click
      Kind = bkOK
    end
  end
  object Panel2: TPanel
    Left = 0
    Top = 0
    Width = 439
    Height = 201
    Align = alClient
    BevelOuter = bvNone
    Caption = 'Panel2'
    TabOrder = 1
  end
  object DataSource1: TDataSource
    Left = 168
    Top = 160
  end
end

//单元设计: 陈新光(CXG)
//设计时间: 2009-10-5 21:11:46
//单元功用: 公用选择窗体

unit uChoose;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, Grids, DBGrids, DB, StdCtrls, Buttons
  ,ADODB
  ,remoteudpdataset, GridsEh, DBGridEh, RzButton
  ,EhLibCDS
  ;

type
  TFormChoose = class(TForm)
    Panel1: TPanel;
    DataSource1: TDataSource;
    BitBtn2: TRzBitBtn;
    BitBtn3: TRzBitBtn;
    Panel2: TPanel;
    BitBtn1: TRzBitBtn;
    procedure BitBtn3Click(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    FDataSet: TDataSet;
    procedure DBGridKeyPress(Sender: TObject; var Key: Char);
    procedure DBGridDblClick(Sender: TObject);   
  public
    { Public declarations }
  end;

var
  FormChoose: TFormChoose;
  FEdit: boolean;

procedure Execute(ADataSet: TDataSet);
procedure AdjustDropDownForm(AControl: TControl);

implementation

uses
  uPublicQuery
  ,uFunction
  ;

{$R *.dfm}

var
  DBGrid1: TDBGridEh;

procedure AdjustDropDownForm(AControl: TControl);  //设置下拉窗口位置。
var
  WorkArea: TRect;
  HostP, PDelpta: TPoint;
begin
  SystemParametersInfo(SPI_GETWORKAREA, 0, @WorkArea, 0);

  GetCursorPos(HostP); //根据点击的鼠标位置决定显示的位置
  PDelpta := AControl.ClientToScreen(Point(0, 0));

  AControl.Left := HostP.x - 2;
  AControl.Top := HostP.y - 3;

  if (AControl.Width > WorkArea.Right - WorkArea.Left) then
    AControl.Width := WorkArea.Right - WorkArea.Left;

  if (AControl.Left + AControl.Width > WorkArea.Right) then
    AControl.Left := WorkArea.Right - AControl.Width;
  if (AControl.Left < WorkArea.Left) then
    AControl.Left := WorkArea.Left;

  if (AControl.Top + AControl.Height > WorkArea.Bottom) then
  begin
    if (HostP.y - WorkArea.Top > WorkArea.Bottom - HostP.y ) then
      AControl.Top := HostP.y - AControl.Height;
  end;

  if (AControl.Top < WorkArea.Top) then
  begin
    AControl.Height := AControl.Height - (WorkArea.Top - AControl.Top);
    AControl.Top := WorkArea.Top;
  end;

  if (AControl.Top + AControl.Height > WorkArea.Bottom) then
  begin
    AControl.Height := WorkArea.Bottom - AControl.Top;
  end;
end;

procedure Execute(ADataSet: TDataSet);
begin
  if ADataSet = nil then Exit;
  if FormChoose = nil then
    FormChoose := TFormChoose.Create(nil);
  with FormChoose do
  begin
    DBGrid1 := TDBGridEh.Create(FormChoose);
    DBGrid1.Parent := Panel2;
    DBGrid1.ReadOnly := True;
    DBGrid1.Flat := true;
    DBGrid1.Align := alClient;
    DBGrid1.ReadOnly := True;
    uFunction.SetFilter(DBGrid1);
    uFunction.ShowMutiColSort(DBGrid1);
    uFunction.ShowRecno(DBGrid1);
    DBGrid1.Options := DBGrid1.Options + [dgRowSelect];
    DBGrid1.OnKeyPress := DBGridKeyPress;
    DBGrid1.OnDblClick := DBGridDblClick;
    fDataSet := ADataSet;
    DataSource1.DataSet := FDataSet;
    DBGrid1.DataSource := DataSource1;
  end;
  FEdit := False;
  AdjustDropDownForm(FormChoose);
  uFunction.SetDataset(FormChoose.FDataSet);
  try
    FormChoose.ShowModal;
  finally
    FreeAndNil(FormChoose);
  end;
end;

procedure TFormChoose.BitBtn3Click(Sender: TObject);
begin
  ModalResult := mrCancel;
end;

procedure TFormChoose.BitBtn1Click(Sender: TObject);
begin
  if not FDataSet.IsEmpty then
    FEdit := True;
  ModalResult := mrOk;
end;

procedure TFormChoose.DBGridKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #13 then
    BitBtn1Click(nil);
end;

procedure TFormChoose.DBGridDblClick(Sender: TObject);
begin
  BitBtn1Click(nil);
end;

procedure TFormChoose.BitBtn2Click(Sender: TObject);
begin
  uPublicQuery.Execute(FDataSet);
end;

procedure TFormChoose.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

end.

原文地址:https://www.cnblogs.com/hnxxcxg/p/2940627.html