隐藏ComboBox按钮Delphi而不将Style设置为csSimple

时间:2011-11-28 19:42:25

标签: delphi combobox sendmessage postmessage

我试图隐藏从TComboBox派生的第三方组件中的下拉按钮。

我尝试将样式设置为csSimple,但此解决方案对我不起作用...第三方组件中的代码在各个位置检查csSimple。我不想改变这段代码。

从其他帖子中我可以看到,其他人建议使用不同的组件,例如文本框,或覆盖下拉箭头以隐藏它。我也想避免这些解决方案。

还有其他方法吗?我想也许有一种方法可以使用PostMessage / SendMessage来做到这一点,但我不知道要传递什么作为params。

谢谢

1 个答案:

答案 0 :(得分:0)

来自AlphaControls的Serge Goncharov提出了一个非常黑暗(但可操作)的解决方案。它涉及访问TDBLookupControl,FDataList和FButtonWidth的前两个私有变量。

他的解决方案如下:

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DBCtrls, sDBLookupComboBox, StdCtrls, sCheckBox, XPMan,
  sSkinProvider, sSkinManager;

type
  TForm1 = class(TForm)
    DBLookupComboBox1: TDBLookupComboBox;
    CheckBox1: TCheckBox;
    procedure CheckBox1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  StoredWidth: integer;

implementation

{$R *.dfm}

type
  TAccessLookUpCombo = class(TDBLookupControl)
  public
    FDataList: TPopupDataList;
    FButtonWidth: Integer;
  end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  if CheckBox1.Checked then
    TAccessLookUpCombo(DBLookupComboBox1).FButtonWidth := StoredWidth
  else begin
    StoredWidth := TAccessLookUpCombo(DBLookupComboBox1).FButtonWidth;
    TAccessLookUpCombo(DBLookupComboBox1).FButtonWidth := 0;
  end;
  DBLookupComboBox1.Invalidate;
end;

end.

使用TAccessLookUpCombo(DBLookupComboBox1)构造,可以访问父级的TDBLookupControl顶级值。确实非常难看,但它确实有效。