⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uctrlcustomize.pas

📁 delphi 源码 小型企业管理软件
💻 PAS
字号:

unit uCtrlCustomize;

interface
uses Classes,dialogs,windows,SysUtils,Controls,wwdblook,Wwdbcomb,DB,
  JvDBGrid,DBGrids,KsSkinComboBoxs;

Type
  //对 wwDBComboBox 控件进行定制,以便回车或焦点离开后取得相关查询值
  TMywwDBLookupCombo=class
  private
    FwwDBLookupCombo: TwwDBLookupCombo;
    FDataFieldname,FLookFieldname,FLookFieldname2: string;
    FDataset, FLookDataset: TDataset;
    ValueChanged, isDroppedDown: Boolean;
    procedure SetValue;
    procedure NewwwDBLookupComboChange(Sender: TObject);
    procedure NewwwDBLookupComboExit(Sender: TObject);
    procedure NewwwDBLookupComboKeyPress(Sender: TObject; var Key: Char);
    procedure ClickOnActiveRecord;
  public
    constructor Create(AwwDBLookupCombo:TwwDBLookupCombo);
  end;

  //用户按下标题栏时,按当前列排序
  TMyjvDBGrid=class
  private
    FjvDBGrid: TjvDBGrid;
    procedure NewjvDBGridTitleClick(Column: TColumn);
    procedure NewjvDBGridKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    function ColumnByName(Fieldname: string): TColumn;
  public
    constructor Create(AjvDBGrid:TjvDBGrid);
  end;

implementation

uses Graphics,ADODB, uDM, Grids, uFunc;

{ TMywwDBComboBox }

type
  THackTwwDBCustomLookupCombo=class(TwwDBCustomLookupCombo)
  end;
  THackTwwPopupGrid=class(TwwPopupGrid)
  end;

procedure TMywwDBLookupCombo.NewwwDBLookupComboExit(Sender: TObject);
begin
  if ValueChanged then SetValue;
end;

//自动点击当前记录,以免使用键盘上下键选取后,下拉框关闭后记录发生跑位
procedure TMywwDBLookupCombo.ClickOnActiveRecord;
var
  HackGrid: THackTwwPopupGrid;
  GridCoord: TGridCoord;
  ActiveRecord: integer;
  curY: integer;
begin
    HackGrid := THackTwwPopupGrid(THackTwwDBCustomLookupCombo(FwwDBLookupCombo).FGrid);
    ActiveRecord := HackGrid.Datalink.ActiveRecord;
    CurY := 0;
    while true do begin
      CurY := CurY +3;
      GridCoord := HackGrid.MouseCoord(10,CurY);
      if GridCoord.Y = ActiveRecord then begin
        HackGrid.MouseDown(mbLeft,[],10,CurY);
        HackGrid.MouseUP(mbLeft,[],10,CurY);
        Break;
      end;
    end;

//    showmessage(Format('%d:%d:%d'
//      ,[GridCoord.x,GridCoord.y
//       ,HackGrid.Datalink.ActiveRecord
//       ]));
end;

procedure TMywwDBLookupCombo.NewwwDBLookupComboKeyPress(Sender: TObject; var Key: Char);

begin
  if (key=#13) then begin
    ClickOnActiveRecord;
//    SetValue;
    ValueChanged := False;
//    Key := #0;
  end;
end;

procedure TMywwDBLookupCombo.NewwwDBLookupComboChange(Sender: TObject);
begin
  ValueChanged := True;

end;

constructor TMywwDBLookupCombo.Create(AwwDBLookupCombo: TwwDBLookupCombo);
begin
  FwwDBLookupCombo := AwwDBLookupCombo;
  ValueChanged := False;

  FDataFieldname := FwwDBLookupCombo.DataField ;
  FLookFieldname := FwwDBLookupCombo.LookupField ;

  //FLookFieldname2:用于在参照表中反查数据库栏位的栏位名
  //例如,编辑框显示客户名称,下拉框显示客户代码和客户名称两列数据
  //      此时用户可能需要在编辑框中输入客户代码,然后由程序自动反查客户名称填入
  //为此征用了一般不用的 HelpKeyword 栏位
  FLookFieldname2:= FwwDBLookupCombo.HelpKeyword ;
  FwwDBLookupCombo.AutoSelect := True;
  FwwDBLookupCombo.Options := [loColLines];//[loColLines,loTitles];

  FLookDataset := FwwDBLookupCombo.LookupTable ;
  if FLookDataset=nil then exit;
  if not FLookDataset.Active then FLookDataset.Active := True;

  if FwwDBLookupCombo.DataSource=nil then exit;
  FDataset := FwwDBLookupCombo.DataSource.DataSet ;

  FwwDBLookupCombo.OnChange := NewwwDBLookupComboChange;
  FwwDBLookupCombo.OnExit := NewwwDBLookupComboExit;
  FwwDBLookupCombo.OnKeyPress := NewwwDBLookupComboKeyPress;
end;

procedure TMywwDBLookupCombo.SetValue;
begin
  //如果用户未有输入,直接退出
  if FwwDBLookupCombo.Value='' then exit;

  //首先看用户是否直接输入了符合条件(即在查询表中存在的)的 FLookFieldname 栏位的值
  if FLookDataset.Locate(FLookFieldname,FwwDBLookupCombo.Value,[])
  then exit;

  //然后看用户是否直接输入了符合条件(即在查询表中存在的)的 FLookFieldname2 栏位的值
  if (FLookFieldname2<>'') and
    FLookDataset.Locate(FLookFieldname2,FwwDBLookupCombo.Value,[])
  then begin    //是,反查并回填
    FDataset.Edit;
    FDataset.FieldByName(FDataFieldname).Value :=
      FLookDataset.FieldByName(FLookFieldname).Value
  end else begin //否,发出异常
    if not Sure('您输入了尚不存在的值,确定要这样做吗?')
    then FwwDBLookupCombo.SetFocus ;
  end;
end;

{ TMyjvDBGrid }

constructor TMyjvDBGrid.Create(AjvDBGrid: TjvDBGrid);
var
  i: integer;
begin
  FjvDBGrid := AjvDBGrid;

  FjvDBGrid.AlternateRowColor := clInfobk;
  FjvDBGrid.TitleButtons := True;
  FjvDBGrid.OnTitleClick := NewjvDBGridTitleClick ;
  FjvDBGrid.OnKeyDown := NewjvDBGridKeyDown ; //CTRL+F

  for i:=0 to FjvDBGrid.Columns.Count-1 do
    FjvDBGrid.Columns[i].Color := clWindow;
end;

function TMyjvDBGrid.ColumnByName(Fieldname:string): TColumn;
var
  i: integer;
begin
  Result := FjvDBGrid.Columns[0];
  for i:=0 to FjvDBGrid.Columns.Count-1 do
    if SameText(FjvDBGrid.Columns[i].FieldName,Fieldname) then begin
      Result := FjvDBGrid.Columns[i];
      Exit;
    end;
end;

procedure TMyjvDBGrid.NewjvDBGridKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if ((Key=ord('F')) or (Key=ord('f'))) and (GetKeyState(VK_CONTROL)<0) then begin
    key :=0;
    DM.wwLocateDialog1.Caption := ColumnByName(FjvDBGrid.SelectedField.FieldName).Title.Caption ;
    DM.wwLocateDialog1.DataSource := FjvDBGrid.Datasource;
    DM.wwLocateDialog1.SearchField := FjvDBGrid.SelectedField.FieldName ;
    DM.wwLocateDialog1.Execute ;
  end
end;

procedure TMyjvDBGrid.NewjvDBGridTitleClick(Column: TColumn);
begin
  if Column.Field.FieldKind <> fkData then exit; 
  if FjvDBGrid.SortMarker=smDown then
    TADOQuery(FjvDBGrid.DataSource.DataSet).Sort := Column.FieldName
  else
    TADOQuery(FjvDBGrid.DataSource.DataSet).Sort := Column.FieldName + ' DESC';
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -