ComboBoxの選択候補が無い場合のドロップダウン制御について


smatsu  2014-01-17 21:28:10  No: 45910

こんにちは。

ComboBoxのItemsが0個の場合に▼をクリックすると、空白枠がドロップダウンされます。
これを表示させない方法があれば教えていただけないでしょうか。

開発環境はDelphi5です。

よろしくお願いいたします。


Quest  2014-01-18 03:15:57  No: 45911

ComboBoxのDropDownイベントに

if ComboBox1.Items.Count = 0 then
  Abort;

とすれば、一応空白枠はでませんが
出そうとした「気配」は残ります(^^;
やってみれば「気配」の意味がわかってもらえると思います。
Delphi6で試しました。


Quest  2014-01-18 03:41:24  No: 45912

「気配」を消すようにしてみました。
「消した」というのが見えますが(^^;

type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    procedure ComboBox1DropDown(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    WM_CLOSEUP: cardinal;
  public
    { Public declarations }
  protected
    procedure WndProc(var Msg: TMessage); override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ComboBox1DropDown(Sender: TObject);
begin
  if ComboBox1.Items.Count = 0 then
  begin
    PostMessage(Handle, WM_CLOSEUP, 0, 0);
    Abort;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  WM_CLOSEUP := RegisterWindowMessage('WM_CLOSEUP_TEST');
end;

procedure TForm1.WndProc(var Msg: TMessage);
begin
  if Msg.Msg = WM_CLOSEUP then
    ComboBox1.DroppedDown := False
  else
    inherited WndProc(Msg);
end;


monaa  2014-01-18 05:42:59  No: 45913

こんな感じでDropDown自体発生させないのはどうでしょうか?

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
    OriginProc: TWndMethod;
    procedure SubClassProc(var msg: TMessage);
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  ComboBox1.Items.Add('test');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  OriginProc :=ComboBox1.WindowProc;
  ComboBox1.WindowProc :=SubClassProc;
end;

procedure TForm1.SubClassProc(var msg: TMessage);
begin
  case msg.Msg of
    WM_LBUTTONDBLCLK,WM_LBUTTONDOWN:begin
      if ComboBox1.Items.Count=0 then
        Exit;
    end;
  end;
  OriginProc(msg);
end;

end.


tor  2014-01-18 06:30:05  No: 45914

選択できるものがなければコンボボックスをトにするというのはナシ?
ボタンが見た目押せるようになっているのに、押しても何も起こらないというのはそれはそれでユーザが戸惑うかと。

ッッヲサコンボボックスの項目を設定した後で……
テツアョナヲサコスヲサテツアョノョテヲサヲサヲサーサ
スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアエッーアッイーィ月ゥ アキコウクコーク  書込者ノト:ロ 」。。「 ン
モコ 

みなさんありがとうございます。

今回はさんのメッセージを捕まえる方法で回避することにしました。

ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加