3

スタイルが csDropDown に設定されたコンボボックスがあります。OnSelect イベント ハンドラーでこれを実行しようとしています。

if cboEndTime.ItemIndex > -1 then
  cboEndTime.Text := AnsiLeftStr(cboEndTime.Text, 5);

しかし、それは効果がありません。

コンボ アイテムは次のようになります。

09:00 (0 分)
09:30 (30 分)
10:00 (1 時間)
10:30 (1.5 時間)
...

たとえば、2 番目の項目を選択した場合、コンボボックスのテキストが 09:30 に表示されるようにします。つまり、切り捨てられます。ItemIndex を -1 に設定します。

どうすればこれを達成できますか?

4

2 に答える 2

5

Textイベント中に行った変更OnSelectは、その後フレームワークによって上書きされるようです。Windows API か VCL のどちらかは調査していません。

1 つの解決策は、元の入力イベントの処理が完了するまで実際の変更を延期することです。このような:

const
  WM_COMBOSELECTIONCHANGED = WM_USER;

type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    procedure ComboBox1Select(Sender: TObject);
  protected
    procedure WMComboSelectionChanged(var Msg: TMessage); message WM_COMBOSELECTIONCHANGED;
  end;

implementation

{$R *.dfm}

procedure TForm1.ComboBox1Select(Sender: TObject);
begin
  PostMessage(Handle, WM_COMBOSELECTIONCHANGED, 0, 0);
end;

procedure TForm1.WMComboSelectionChanged(var Msg: TMessage);
begin
  if ComboBox1.ItemIndex<>-1 then
  begin
    ComboBox1.Text := Copy(ComboBox1.Text, 1, 1);
    ComboBox1.SelectAll;
  end;
end;
于 2013-07-08T15:34:40.203 に答える
1

スタイルを OwnerDrawFixed に設定し、独自に OnDrawItem を使用して目的のテキストをペイントすることができます。この例のルックアップはすべてを表示し、選択はトリミングされた文字列のみを表示します。

procedure TForm3.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);

  var
   C:TComboBox;

  Function Strip(const s:String):String;
    begin
       if C.DroppedDown then result := s
       else Result := Copy(s,1,pos('(',s)-1);
    end;
begin
     C := TComboBox(Control);
     C.Canvas.FillRect(Rect);
     C.Canvas.TextOut(Rect.left + 1,Rect.Top + 1, Strip(C.Items[Index] ));
end;
于 2013-07-08T14:41:02.580 に答える