filtcomp.pas

来自「delphi编程控件」· PAS 代码 · 共 1,794 行 · 第 1/4 页

PAS
1,794
字号
procedure TListBoxFilter.ChangeAutoFilterValue;
begin
  if(OldItemIndex <> ItemIndex) And  Not (csLoading in ComponentState) then begin
    OldItemIndex := ItemIndex;
    if(ItemIndex <> -1) then begin
      if(Pos(',', Items[ItemIndex]) > 0) then
        FAutoFilter.Value := Copy(Items[ItemIndex], Pos(',', Items[ItemIndex]) + 1, 1000)
      else FAutoFilter.Value := Items[ItemIndex];
    end;
  end;
end;

procedure TListBoxFilter.SetItems(Value: TStrings);
begin
  TStringList(Items).OnChange := nil;
  Items.Assign(Value);
  TStringList(Items).OnChange := ItemsChanged;
  ItemsChanged(nil);
end;

procedure TListBoxFilter.ItemsChanged(Sender: TObject);
var
  NewItems: TStringList;
  i : Integer;
  OldItem : Integer;
begin
  NewItems := TStringList.Create;
  OldItem := ItemIndex;
  try
    for i := 0 to Items.Count - 1 do
      if(Pos(',', Items[i]) > 0) then
        NewItems.Add(Copy(Items[i], 1, Pos(',', Items[i]) - 1))
      else NewItems.Add(Items[i]);
    inherited Items := NewItems;
  finally
    NewItems.Free;
  end;
  if(OldItem < Items.Count) then begin
     OldItemIndex := -1;
    ItemIndex := OldItem;
  end;
end;

procedure TListBoxFilter.WndProc(var Message: TMessage);
begin
  inherited;
  if(Message.Msg = LB_SETCURSEL) then
    ChangeAutoFilterValue;
end;

procedure TListBoxFilter.Click;
begin
  inherited;
  ChangeAutoFilterValue;
end;

procedure TListBoxFilter.KeyPress(var Key: Char);
begin
  inherited;
  ChangeAutoFilterValue;
end;

function TListBoxFilter.GetOnBeforeFilterChange : TNotifyEvent;
begin
  Result := FAutoFilter.OnBeforeChange;
end;

function TListBoxFilter.GetOnAfterFilterChange : TNotifyEvent;
begin
  Result := FAutoFilter.OnAfterChange;
end;

procedure TListBoxFilter.SetOnBeforeFilterChange(Value : TNotifyEvent);
begin
  FAutoFilter.OnBeforeChange := Value;
end;

procedure TListBoxFilter.SetOnAfterFilterChange(Value : TNotifyEvent);
begin
  FAutoFilter.OnAfterChange := Value;
end;

{TComboBoxFilter}
constructor TComboBoxFilter.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  parent := TWinControl(Aowner);
  FItems := TStringList.Create;
  TStringList(FItems).OnChange := ItemsChanged;

  FAutoFilter := TAutoFilter.Create(self);
end;

destructor TComboBoxFilter.Destroy;
begin
  FItems.Free;
  FAutoFilter.Free;
  inherited;
end;

procedure TComboBoxFilter.Loaded;
begin
  inherited;
  OldItemIndex := -2;
  ChangeAutoFilterValue;
end;

procedure TComboBoxFilter.ChangeAutoFilterValue;
begin
  if(OldItemIndex <> ItemIndex) And  Not (csLoading in ComponentState) then begin
    OldItemIndex := ItemIndex;
    if(ItemIndex <> -1) then begin
      if(Pos(',', Items[ItemIndex]) > 0) then
        FAutoFilter.Value := Copy(Items[ItemIndex], Pos(',', Items[ItemIndex]) + 1, 1000)
      else FAutoFilter.Value := Items[ItemIndex];
    end;
  end;
end;

procedure TComboBoxFilter.SetItems(Value: TStrings);
begin
  TStringList(Items).OnChange := nil;
  Items.Assign(Value);
  TStringList(Items).OnChange := ItemsChanged;
  ItemsChanged(nil);
end;

procedure TComboBoxFilter.ItemsChanged(Sender: TObject);
var
  NewItems: TStringList;
  i : Integer;
  OldItem : Integer;
begin
  NewItems := TStringList.Create;
  OldItem := ItemIndex;
  try
    for i := 0 to Items.Count - 1 do
      if(Pos(',', Items[i]) > 0) then
        NewItems.Add(Copy(Items[i], 1, Pos(',', Items[i]) - 1))
      else NewItems.Add(Items[i]);
    inherited Items := NewItems;
  finally
    NewItems.Free;
  end;
  if(OldItem < Items.Count) then begin
     OldItemIndex := -1;
    ItemIndex := OldItem;
  end;
end;

procedure TComboBoxFilter.WndProc(var Message: TMessage);
begin
  inherited;
  if(Message.Msg = CB_SETCURSEL) then
    ChangeAutoFilterValue;
end;

procedure TComboBoxFilter.Click;
begin
  inherited;
  ChangeAutoFilterValue;
end;

procedure TComboBoxFilter.KeyPress(var Key: Char);
begin
  inherited;
  ChangeAutoFilterValue;
end;

function TComboBoxFilter.GetOnBeforeFilterChange : TNotifyEvent;
begin
  Result := FAutoFilter.OnBeforeChange;
end;

function TComboBoxFilter.GetOnAfterFilterChange : TNotifyEvent;
begin
  Result := FAutoFilter.OnAfterChange;
end;

procedure TComboBoxFilter.SetOnBeforeFilterChange(Value : TNotifyEvent);
begin
  FAutoFilter.OnBeforeChange := Value;
end;

procedure TComboBoxFilter.SetOnAfterFilterChange(Value : TNotifyEvent);
begin
  FAutoFilter.OnAfterChange := Value;
end;

{TMaskEditFilter}
constructor TMaskEditFilter.Create(AOwner : TComponent);
begin
  inherited;
  FAutoFilter := TAutoFilter.Create(self);
  FRefreshType := rtOnChange;
end;

destructor TMaskEditFilter.Destroy;
begin
  FAutoFilter.Free;
  inherited;
end;

procedure TMaskEditFilter.Change;
begin
  inherited;
  if(FRefreshType = rtOnChange) And (Modified Or (csLoading in ComponentState)) then begin
    Modified := False;
    FAutoFilter.Value := Text;
  end;
end;

function TMaskEditFilter.GetOnBeforeFilterChange : TNotifyEvent;
begin
  Result := FAutoFilter.OnBeforeChange;
end;

function TMaskEditFilter.GetOnAfterFilterChange : TNotifyEvent;
begin
  Result := FAutoFilter.OnAfterChange;
end;

procedure TMaskEditFilter.SetOnBeforeFilterChange(Value : TNotifyEvent);
begin
  FAutoFilter.OnBeforeChange := Value;
end;

procedure TMaskEditFilter.SetOnAfterFilterChange(Value : TNotifyEvent);
begin
  FAutoFilter.OnAfterChange := Value;
end;

procedure TMaskEditFilter.CMExit(var Message: TCMExit);
begin
  inherited;
  if(FRefreshType = rtOnExit) And Modified then begin
    Modified := False;
    FAutoFilter.Value := Text;
  end;
end;

{TLookupListFilter}
constructor TLookupListFilter.Create(AOwner : TComponent);
begin
  inherited Create(AOwner);
  FAutoFilter := TAutoFilter.Create(self);
end;

destructor TLookupListFilter.Destroy;
begin
  FAutoFilter.Free;
  inherited;
end;

function TLookupListFilter.GetOnBeforeFilterChange : TNotifyEvent;
begin
  Result := FAutoFilter.OnBeforeChange;
end;

function TLookupListFilter.GetOnAfterFilterChange : TNotifyEvent;
begin
  Result := FAutoFilter.OnAfterChange;
end;

procedure TLookupListFilter.SetOnBeforeFilterChange(Value : TNotifyEvent);
begin
  FAutoFilter.OnBeforeChange := Value;
end;

procedure TLookupListFilter.SetOnAfterFilterChange(Value : TNotifyEvent);
begin
  FAutoFilter.OnAfterChange := Value;
end;

procedure TLookupListFilter.KeyValueChanged;
begin
  inherited;
  if VarIsNull(KeyValue) then
    FAutoFilter.Value := ''
  else FAutoFilter.Value := String(KeyValue);
end;

{TLookupComboFilter}
constructor TLookupComboFilter.Create(AOwner : TComponent);
begin
  inherited Create(AOwner);
  FAutoFilter := TAutoFilter.Create(self);
end;

destructor TLookupComboFilter.Destroy;
begin
  FAutoFilter.Free;
  inherited;
end;

function TLookupComboFilter.GetOnBeforeFilterChange : TNotifyEvent;
begin
  Result := FAutoFilter.OnBeforeChange;
end;

function TLookupComboFilter.GetOnAfterFilterChange : TNotifyEvent;
begin
  Result := FAutoFilter.OnAfterChange;
end;

procedure TLookupComboFilter.SetOnBeforeFilterChange(Value : TNotifyEvent);
begin
  FAutoFilter.OnBeforeChange := Value;
end;

procedure TLookupComboFilter.SetOnAfterFilterChange(Value : TNotifyEvent);
begin
  FAutoFilter.OnAfterChange := Value;
end;

procedure TLookupComboFilter.KeyValueChanged;
begin
  inherited;
  if VarIsNull(KeyValue) then
    FAutoFilter.Value := ''
  else FAutoFilter.Value := String(KeyValue);
end;

{TImageListBoxFilter}
constructor TImageListBoxFilter.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FAutoFilter := TAutoFilter.Create(self);
end;

destructor TImageListBoxFilter.Destroy;
begin
  FAutoFilter.Free;
  inherited;
end;

function TImageListBoxFilter.GetOnBeforeFilterChange : TNotifyEvent;
begin
  Result := FAutoFilter.OnBeforeChange;
end;

function TImageListBoxFilter.GetOnAfterFilterChange : TNotifyEvent;
begin
  Result := FAutoFilter.OnAfterChange;
end;

procedure TImageListBoxFilter.SetOnBeforeFilterChange(Value : TNotifyEvent);
begin
  FAutoFilter.OnBeforeChange := Value;
end;

procedure TImageListBoxFilter.SetOnAfterFilterChange(Value : TNotifyEvent);
begin
  FAutoFilter.OnAfterChange := Value;
end;

procedure TImageListBoxFilter.UpdateData;
begin
  if ItemIndex >= 0 then begin
    if Not FUseValues then
      AutoFilter.Value := Items[ItemIndex]
    else AutoFilter.Value := Values[ItemIndex];
  end else AutoFilter.Value := '';
end;

procedure TImageListBoxFilter.Click;
begin
  inherited Click;
  UpdateData;
end;

procedure TImageListBoxFilter.KeyDown(var Key: Word; Shift: TShiftState);
begin
  inherited KeyDown(Key, Shift);
  if Key in [VK_PRIOR, VK_NEXT, VK_END, VK_HOME, VK_LEFT, VK_UP,
    VK_RIGHT, VK_DOWN] then
     UpdateData;
end;

procedure TImageListBoxFilter.KeyPress(var Key: Char);
begin
  inherited KeyPress(Key);
  UpdateData;
end;

procedure TImageListBoxFilter.CMExit(var Message: TCMExit);
begin
  UpdateData;
  inherited;
end;

procedure TImageListBoxFilter.SetItems(Value: TStrings);
begin
  Items.Assign(Value);
  UpdateData;
end;

procedure TImageListBoxFilter.SetUseValues(Value: Boolean);
begin
  if(FUseValues <> Value)then begin
    FUseValues := Value;
    UpdateData;
  end;
end;

{TImageComboBoxFilter}
constructor TImageComboBoxFilter.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FAutoFilter := TAutoFilter.Create(self);
end;

destructor TImageComboBoxFilter.Destroy;
begin
  FAutoFilter.Free;
  inherited;
end;

function TImageComboBoxFilter.GetOnBeforeFilterChange : TNotifyEvent;
begin
  Result := FAutoFilter.OnBeforeChange;
end;

function TImageComboBoxFilter.GetOnAfterFilterChange : TNotifyEvent;
begin
  Result := FAutoFilter.OnAfterChange;
end;

procedure TImageComboBoxFilter.SetOnBeforeFilterChange(Value : TNotifyEvent);
begin
  FAutoFilter.OnBeforeChange := Value;
end;

procedure TImageComboBoxFilter.SetOnAfterFilterChange(Value : TNotifyEvent);
begin
  FAutoFilter.OnAfterChange := Value;
end;

procedure TImageComboBoxFilter.UpdateData;
begin
  if ItemIndex >= 0 then begin
    if Not FUseValues then
      AutoFilter.Value := Items[ItemIndex]
    else AutoFilter.Value := Values[ItemIndex];
  end else AutoFilter.Value := '';
end;

procedure TImageComboBoxFilter.Click;

⌨️ 快捷键说明

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