📄 uctrlcustomize.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 + -