📄 rxlookup.pas
字号:
property DragMode;
property EmptyValue;
property EmptyItemColor;
property Enabled;
property FieldsDelimiter;
property Font;
property IgnoreCase;
{$IFDEF RX_D4}
property Anchors;
property BiDiMode;
property Constraints;
property DragKind;
property ParentBiDiMode;
{$ENDIF}
{$IFDEF WIN32}
{$IFNDEF VER90}
property ImeMode;
property ImeName;
{$ENDIF}
{$ENDIF}
property IndexSwitch;
property ItemHeight;
property ListStyle;
property LookupField;
property LookupDisplay;
property LookupDisplayIndex;
property LookupSource;
property ParentColor;
property ParentCtl3D;
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;
property OnMouseMove;
property OnMouseUp;
{$IFDEF WIN32}
property OnStartDrag;
{$ENDIF}
{$IFDEF RX_D5}
property OnContextPopup;
{$ENDIF}
{$IFDEF RX_D4}
property OnEndDock;
property OnStartDock;
{$ENDIF}
end;
{ TPopupDataWindow }
TPopupDataWindow = class(TRxPopupDataList)
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;
{ TRxLookupEdit }
TRxLookupEdit = class(TCustomComboEdit)
private
FChanging: Boolean;
FIgnoreChange: Boolean;
FDropDownCount: Integer;
FDropDownWidth: Integer;
FPopupOnlyLocate: Boolean;
FOnCloseUp: TNotifyEvent;
FOnDropDown: TNotifyEvent;
function GetListStyle: TLookupListStyle;
procedure SetListStyle(Value: TLookupListStyle);
function GetFieldsDelim: Char;
procedure SetFieldsDelim(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: string;
procedure SetLookupValue(const Value: string);
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;
{$IFDEF WIN32}
function AcceptPopup(var Value: Variant): Boolean; override;
procedure SetPopupValue(const Value: Variant); override;
function GetPopupValue: Variant; override;
{$ELSE}
function AcceptPopup(var Value: string): Boolean; override;
procedure SetPopupValue(const Value: string); override;
function GetPopupValue: string; override;
{$ENDIF}
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property LookupValue: string 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 GetFieldsDelim write SetFieldsDelim default DefFieldsDelim;
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 Ctl3D;
property DirectInput;
property DragCursor;
property DragMode;
property EditMask;
property Enabled;
property Font;
property HideSelection;
{$IFDEF RX_D4}
property Anchors;
property BiDiMode;
property Constraints;
property DragKind;
property ParentBiDiMode;
{$ENDIF}
{$IFDEF WIN32}
{$IFNDEF VER90}
property ImeMode;
property ImeName;
{$ENDIF}
{$ENDIF}
property MaxLength;
property OEMConvert;
property ParentColor;
property ParentCtl3D;
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;
property OnMouseMove;
property OnMouseUp;
{$IFDEF WIN32}
property OnStartDrag;
{$ENDIF}
{$IFDEF RX_D5}
property OnContextPopup;
{$ENDIF}
{$IFDEF RX_D4}
property OnEndDock;
property OnStartDock;
{$ENDIF}
end;
implementation
uses DBConsts, Dialogs, {$IFNDEF WIN32} Str16, {$ENDIF} VCLUtils, rxStrUtils,
{$IFNDEF RX_D3} BdeUtils, {$ENDIF} MaxMin, ClipIcon;
{ TDataSourceLink }
procedure TDataSourceLink.ActiveChanged;
begin
if FDataControl <> nil then FDataControl.DataLinkActiveChanged;
end;
procedure TDataSourceLink.LayoutChanged;
begin
if FDataControl <> nil then FDataControl.CheckDataLinkActiveChanged;
end;
procedure TDataSourceLink.RecordChanged(Field: TField);
begin
if FDataControl <> nil then FDataControl.DataLinkRecordChanged(Field);
end;
procedure TDataSourceLink.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;
{ TLookupSourceLink }
procedure TLookupSourceLink.ActiveChanged;
begin
if FDataControl <> nil then FDataControl.ListLinkActiveChanged;
end;
procedure TLookupSourceLink.LayoutChanged;
begin
if FDataControl <> nil then FDataControl.ListLinkActiveChanged;
end;
procedure TLookupSourceLink.DataSetChanged;
begin
if FDataControl <> nil then FDataControl.ListLinkDataChanged;
end;
{ TRxLookupControl }
const
SearchTickCount: Longint = 0;
{$IFNDEF WIN32}
procedure GetFieldList(DataSet: TDataSet; List: TList;
const FieldNames: string);
var
Pos: Integer;
begin
Pos := 1;
while Pos <= Length(FieldNames) do
List.Add(DataSet.FieldByName(ExtractFieldName(FieldNames, Pos)));
end;
{$ENDIF}
constructor TRxLookupControl.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
if NewStyleControls then ControlStyle := [csOpaque]
else ControlStyle := [csOpaque, csFramed];
ParentColor := False;
TabStop := True;
FFieldsDelim := DefFieldsDelim;
FLookupSource := TDataSource.Create(Self);
FDataLink := TDataSourceLink.Create;
FDataLink.FDataControl := Self;
FLookupLink := TLookupSourceLink.Create;
FLookupLink.FDataControl := Self;
FListFields := TList.Create;
FEmptyValue := EmptyStr;
FEmptyItemColor := clWindow;
FValue := FEmptyValue;
{$IFDEF RX_D3}
FLocate := CreateLocate(nil);
{$ELSE}
FLocate := TDBLocate.Create;
{$ENDIF}
FIndexSwitch := True;
FIgnoreCase := True;
end;
destructor TRxLookupControl.Destroy;
begin
FListFields.Free;
FListFields := nil;
FLookupLink.FDataControl := nil;
FLookupLink.Free;
FLookupLink := nil;
FDataLink.FDataControl := nil;
FDataLink.Free;
FDataLink := nil;
FLocate.Free;
FLocate := nil;
inherited Destroy;
end;
function TRxLookupControl.CanModify: Boolean;
begin
Result := FListActive and not ReadOnly and ((FDataLink.DataSource = nil) or
(FMasterField <> nil) and FMasterField.CanModify);
end;
procedure TRxLookupControl.Change;
begin
if Assigned(FOnChange) then FOnChange(Self);
end;
function TRxLookupControl.ValueIsEmpty(const S: string): Boolean;
begin
Result := (S = FEmptyValue);
end;
function TRxLookupControl.StoreEmpty: Boolean;
begin
Result := (FEmptyValue <> EmptyStr);
end;
{$IFDEF WIN32}
procedure TRxLookupControl.CheckNotFixed;
begin
if FLookupMode then _DBError(SPropDefByLookup);
if FDataLink.DataSourceFixed then _DBError(SDataSourceFixed);
end;
procedure TRxLookupControl.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 TRxLookupControl.GetKeyValue: Variant;
begin
if ValueIsEmpty(Value) then Result := NULL
else Result := Value;
end;
procedure TRxLookupControl.SetKeyValue(const Value: Variant);
begin
Self.Value := Value;
end;
{$ENDIF}
procedure TRxLookupControl.CheckNotCircular;
begin
{
if FDataLink.Active and FDataLink.DataSet.IsLinkedTo(LookupSource) then
_DBError(SCircularDataLink);
}
if FDataLink.Active and ((DataSource = LookupSource) or
(FDataLink.DataSet = FLookupLink.DataSet)) then
_DBError(SCircularDataLink);
end;
procedure TRxLookupControl.CheckDataLinkActiveChanged;
var
TestField: TField;
begin
if FDataLink.Active and (FDataFieldName <> '') then begin
TestField := FDataLink.DataSet.FieldByName(FDataFieldName);
if Pointer(FDataField) <> Pointer(TestField) then begin
FDataField := nil;
FMasterField := nil;
CheckNotCircular;
FDataField := TestField;
FMasterField := FDataField;
DataLinkRecordChanged(nil);
end;
end;
end;
procedure TRxLookupControl.DataLinkActiveChanged;
begin
FDataField := nil;
FMasterField := nil;
if FDataLink.Active and (FDataFieldName <> '') then begin
CheckNotCircular;
FDataField := FDataLink.DataSet.FieldByName(FDataFieldName);
FMasterField := FDataField;
end;
{$IFDEF WIN32}
SetLookupMode((FDataField <> nil) and FDataField.Lookup);
{$ENDIF}
DataLinkRecordChanged(nil);
end;
procedure TRxLookupControl.DataLinkRecordChanged(Field: TField);
begin
if (Field = nil) or (Field = FMasterField) then begin
if FMasterField <> nil then begin
SetValueKey(FMasterField.AsString);
end else SetValueKey(FEmptyValue);
end;
end;
{$IFDEF RX_D4}
function TRxLookupControl.ExecuteAction(Action: TBasicAction): Boolean;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -