📄 tntjvdblookup.pas
字号:
property Enabled;
property FieldsDelimiter;
property Font;
property IgnoreCase;
property Anchors;
property BiDiMode;
property Constraints;
property DragKind;
property ParentBiDiMode;
property HintColor;
property ImeMode;
property ImeName;
property IndexSwitch;
property ItemHeight;
property ListStyle;
property LookupField;
property LookupDisplay;
property LookupDisplayIndex;
property LookupFormat;
property LookupSource;
property ParentColor;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property ReadOnly;
property ShowHint;
property TabOrder;
property TabStop;
property Visible;
property OnChange;
property OnClick;
property OnCloseUp: TNotifyEvent read FOnCloseUp write FOnCloseUp;
property OnDropDown: TNotifyEvent read FOnDropDown write FOnDropDown;
property OnDragDrop;
property OnDragOver;
property OnEndDrag;
property OnEnter;
property OnExit;
property OnGetImage;
property OnKeyDown;
property OnKeyPress;
property OnKeyUp;
property OnMouseDown;
{$IFDEF VCL}
property OnMouseEnter;
property OnMouseLeave;
{$ENDIF VCL}
property OnMouseMove;
property OnMouseUp;
property OnMouseWheelDown;
property OnMouseWheelUp;
property OnStartDrag;
property OnContextPopup;
property OnEndDock;
property OnStartDock;
end;
TJvPopupDataWindow = class(TTntJvPopupDataList)
private
FEditor: TWinControl;
FCloseUp: TCloseUpEvent;
protected
procedure InvalidateEditor;
procedure Click; override;
procedure DisplayValueChanged; override;
function GetPicture(Current, Empty: Boolean; var TextMargin: Integer): TGraphic; override;
procedure KeyPress(var Key: Char); override;
procedure PopupMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure CloseUp(Accept: Boolean); virtual;
public
constructor Create(AOwner: TComponent); override;
procedure Hide;
procedure Show(Origin: TPoint);
property OnCloseUp: TCloseUpEvent read FCloseUp write FCloseUp;
end;
TTntJvDBLookupEdit = class(TTntJvCustomComboEdit)
private
FChanging: Boolean;
FIgnoreChange: Boolean;
FDropDownCount: Integer;
FDropDownWidth: Integer;
FPopupOnlyLocate: Boolean;
FOnCloseUp: TNotifyEvent;
FOnDropDown: TNotifyEvent;
function GetListStyle: TLookupListStyle;
procedure SetListStyle(Value: TLookupListStyle);
function GetFieldsDelimiter: Char;
procedure SetFieldsDelimiter(Value: Char);
function GetLookupDisplay: string;
procedure SetLookupDisplay(const Value: string);
function GetDisplayIndex: Integer;
procedure SetDisplayIndex(Value: Integer);
function GetLookupField: string;
procedure SetLookupField(const Value: string);
function GetLookupSource: TDataSource;
procedure SetLookupSource(Value: TDataSource);
procedure SetDropDownCount(Value: Integer);
function GetLookupValue: WideString;
procedure SetLookupValue(const Value: WideString);
function GetOnGetImage: TGetImageEvent;
procedure SetOnGetImage(Value: TGetImageEvent);
protected
procedure Change; override;
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
procedure KeyPress(var Key: Char); override;
procedure ShowPopup(Origin: TPoint); override;
procedure HidePopup; override;
procedure PopupChange; override;
procedure PopupDropDown(DisableEdit: Boolean); override;
function AcceptPopup(var Value: Variant): Boolean; override;
procedure SetPopupValue(const Value: Variant); override;
function GetPopupValue: Variant; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property LookupValue: WideString read GetLookupValue write SetLookupValue;
published
property DropDownCount: Integer read FDropDownCount write SetDropDownCount default 8;
property DropDownWidth: Integer read FDropDownWidth write FDropDownWidth default 0;
property ListStyle: TLookupListStyle read GetListStyle write SetListStyle default lsFixed;
property FieldsDelimiter: Char read GetFieldsDelimiter write SetFieldsDelimiter default DefFieldsDelimiter;
property LookupDisplay: string read GetLookupDisplay write SetLookupDisplay;
property LookupDisplayIndex: Integer read GetDisplayIndex write SetDisplayIndex default 0;
property LookupField: string read GetLookupField write SetLookupField;
property LookupSource: TDataSource read GetLookupSource write SetLookupSource;
property PopupOnlyLocate: Boolean read FPopupOnlyLocate write FPopupOnlyLocate default True;
property Alignment;
property AutoSelect;
property BorderStyle;
property ButtonHint;
property CharCase;
property ClickKey;
property Color;
property DirectInput;
property DragCursor;
property DragMode;
property EditMask;
property Enabled;
property Font;
{$IFDEF VCL}
property Flat;
property ParentCtl3D;
{$ENDIF VCL}
property HideSelection;
property Anchors;
property BiDiMode;
property Constraints;
property DragKind;
property ParentBiDiMode;
property HintColor;
property ImeMode;
property ImeName;
property MaxLength;
property OEMConvert;
property ParentColor;
property ParentFont;
property ParentShowHint;
property PopupAlign;
property PopupMenu;
property ReadOnly;
property ShowHint;
property TabOrder;
property TabStop;
property Text;
property Visible;
property OnCloseUp: TNotifyEvent read FOnCloseUp write FOnCloseUp;
property OnDropDown: TNotifyEvent read FOnDropDown write FOnDropDown;
property OnGetImage: TGetImageEvent read GetOnGetImage write SetOnGetImage;
property OnButtonClick;
property OnChange;
property OnClick;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEndDrag;
property OnEnter;
property OnExit;
property OnKeyDown;
property OnKeyPress;
property OnKeyUp;
property OnMouseDown;
{$IFDEF VCL}
property OnMouseEnter;
property OnMouseLeave;
{$ENDIF VCL}
property OnMouseMove;
property OnMouseUp;
property OnStartDrag;
property OnContextPopup;
property OnEndDock;
property OnStartDock;
end;
{$IFDEF UNITVERSIONING}
const
UnitVersioning: TUnitVersionInfo = (
RCSfile: '$RCSfile: JvDBLookup.pas,v $';
Revision: '$Revision: 1.55 $';
Date: '$Date: 2005/09/09 10:04:38 $';
LogPath: 'JVCL'run'
);
{$ENDIF UNITVERSIONING}
implementation
uses
{$IFDEF HAS_UNIT_VARIANTS}
Variants,
{$ENDIF HAS_UNIT_VARIANTS}
{$IFDEF COMPILER6_UP}
VDBConsts,
{$ENDIF COMPILER6_UP}
DBConsts, SysUtils, Math,
JvJCLUtils, JvJVCLUtils, JvThemes, JvTypes, JvConsts, JvResources,
TntWideStrUtils, TntControls, TntGraphics, TntDB;
procedure CheckLookupFormat(const AFormat: WideString);
var
P: PWideChar;
begin
{ AFormat is passed to a Format function, but the only allowed
format specifiers are %s, %S and %% }
P := WStrScan(PWideChar(AFormat), '%');
while Assigned(P) do
begin
Inc(P);
if P^ = #0 then
//raise EJVCLException.CreateRes(@RsEInvalidFormatNotAllowed)
raise Exception.Create('Invalid format: % not allowed')
else
if (P^ <> '%') and (P^ <> 's') and (P^ <> 'S') then
//raise EJVCLException.CreateResFmt(@RsEInvalidFormatsNotAllowed,
raise Exception.Create(Format('Invalid format: %s not allowed',
[WideQuotedStr(WideString('%') + P^,'"')]));
P := WStrScan(P + 1, '%');
end;
end;
function GetSpecifierCount(const AFormat: WideString): Integer;
var
P: PWideChar;
begin
{ GetSpecifierCount counts the nr of format specifiers in AFormat }
Result := 0;
P := WStrScan(PWideChar(AFormat), '%');
while Assigned(P) do
begin
Inc(P);
if P^ = #0 then
Exit
else
if (P^ = 's') or (P^ = 'S') then
Inc(Result);
P := WStrScan(P + 1, '%');
end;
end;
//=== { TJvDataSourceLink } ==================================================
procedure TJvDataSourceLink.ActiveChanged;
begin
if FDataControl <> nil then
FDataControl.DataLinkActiveChanged;
end;
procedure TJvDataSourceLink.LayoutChanged;
begin
if FDataControl <> nil then
FDataControl.CheckDataLinkActiveChanged;
end;
procedure TJvDataSourceLink.RecordChanged(Field: TField);
begin
if FDataControl <> nil then
FDataControl.DataLinkRecordChanged(Field);
end;
procedure TJvDataSourceLink.FocusControl(Field: TFieldRef);
begin
if (Field^ <> nil) and (FDataControl <> nil) and
(Field^ = FDataControl.FDataField) and FDataControl.CanFocus then
begin
Field^ := nil;
FDataControl.SetFocus;
end;
end;
//=== { TTntLookupSourceLink } ==================================================
procedure TTntLookupSourceLink.ActiveChanged;
begin
if FDataControl <> nil then
FDataControl.ListLinkActiveChanged;
end;
procedure TTntLookupSourceLink.LayoutChanged;
begin
if FDataControl <> nil then
FDataControl.ListLinkActiveChanged;
end;
procedure TTntLookupSourceLink.DataSetChanged;
begin
if FDataControl <> nil then
FDataControl.ListLinkDataChanged;
end;
//=== { TTntJvLookupControl } ===================================================
var
SearchTickCount: Longint = 0;
procedure TTntJvLookupControl.CreateWindowHandle(const Params: TCreateParams);
begin
CreateUnicodeHandle(Self, Params, '');
end;
procedure TTntJvLookupControl.DefineProperties(Filer: TFiler);
begin
inherited;
TntPersistent_AfterInherited_DefineProperties(Filer, Self);
end;
constructor TTntJvLookupControl.Create(AOwner: TComponent);
const
LookupStyle = [csOpaque];
begin
inherited Create(AOwner);
if NewStyleControls then
ControlStyle := LookupStyle
else
ControlStyle := LookupStyle + [csFramed];
IncludeThemeStyle(Self, [csNeedsBorderPaint]);
ParentColor := False;
TabStop := True;
FFieldsDelimiter := DefFieldsDelimiter;
FLookupSource := TDataSource.Create(Self);
FDataLink := TJvDataSourceLink.Create;
FDataLink.FDataControl := Self;
FLookupLink := TTntLookupSourceLink.Create;
FLookupLink.FDataControl := Self;
FListFields := TList.Create;
FEmptyValue := '';
FEmptyStrIsNull := True; // Polaris
FEmptyItemColor := clWindow;
FValue := FEmptyValue;
FLocate := CreateTntLocate(nil);
FIndexSwitch := True;
FIgnoreCase := True;
end;
destructor TTntJvLookupControl.Destroy;
begin
FListFields.Free;
FListFields := nil;
if FLookupLink <> nil then
FLookupLink.FDataControl := nil;
FLookupLink.Free;
FLookupLink := nil;
if FDataLink <> nil then
FDataLink.FDataControl := nil;
FDataLink.Free;
FDataLink := nil;
FLocate.Free;
FLocate := nil;
inherited Destroy;
end;
function TTntJvLookupControl.CanModify: Boolean;
begin
Result := FListActive and not ReadOnly and ((FDataLink.DataSource = nil) or
(FMasterField <> nil) and FMasterField.CanModify);
end;
procedure TTntJvLookupControl.Change;
begin
if Assigned(FOnChange) then
FOnChange(Self);
end;
function TTntJvLookupControl.ValueIsEmpty(const S: WideString): Boolean;
begin
Result := (S = FEmptyValue);
end;
function TTntJvLookupControl.StoreEmpty: Boolean;
begin
Result := (FEmptyValue <> '');
end;
procedure TTntJvLookupControl.CheckNotFixed;
begin
if FLookupMode then
_DBError(SPropDefByLookup);
if FDataLink.DataSourceFixed then
_DBError(SDataSourceFixed);
end;
procedure TTntJvLookupControl.SetLookupMode(Value: Boolean);
begin
if FLookupMode <> Value then
if Value then
begin
FMasterField := FDataField.DataSet.FieldByName(FDataField.KeyFields);
FLookupSource.DataSet := FDataField.LookupDataSet;
FLookupFieldName := FDataField.LookupKeyFields;
FLookupMode := True;
FLookupLink.DataSource := FLookupSource;
end
else
begin
FLookupLink.DataSource := nil;
FLookupMode := False;
FLookupFieldName := '';
FLookupSource.DataSet := nil;
FMasterField := FDataField;
end;
end;
function TTntJvLookupControl.GetKeyValue: Variant;
begin
{ (rb) EmptyStr is provided for backwards compatibility only in D7 }
if ValueIsEmpty(Value) then
if (Value = EmptyStr) and FEmptyStrIsNull then
Result := Null // Polaris
else
Result := FEmptyValue // Polaris
else
Result := Value;
end;
procedure TTntJvLookupControl.SetKeyValue(const Value: Variant);
begin
if VarIsNull(Value) then
Self.Value := FEmptyValue // Polaris
else
Self.Value := Value;
// Self.Value := Value;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -