Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2009, 23:43   #1
DemonXT
Пользователь
 
Аватар для DemonXT
 
Регистрация: 31.03.2009
Сообщений: 40
Вопрос Помогите настроить ComboBox

У меня есть TComboBox -> cbFormat. Внутри есть какой-то список. Можно сделать так, чтоб в случае его активности была возможность выбрать элементов из списка, а в случае потери фокуса нет?
Делаю так:
Код:
procedure Tfm.FormCreate(Sender: TObject);
begin
  cbFormat.Style:=csSimple;
end;

procedure Tfm.cbFormatEnter(Sender: TObject);
begin
  cbFormat.Style:=csOwnerDrawFixed;
end;

procedure Tfm.cbFormatExit(Sender: TObject);
begin
  cbFormat.Style:=csSimple;
end;
но почему-то при фокусе на компоненте он исчезают!
DemonXT вне форума Ответить с цитированием
Старый 17.05.2009, 02:54   #2
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Попробуйте так:
Код:
...
procedure TForm1.cbFormatEnter(Sender: TObject);
begin
 cbFormat.Style:= csDropDownList;
 cbFormat.Style:=csOwnerDrawFixed;
end;
...
Что бы cbFormat начинал работать сразу при появлении формы установите фокус к примеру на Edit или ещё как какой-нибудь объект.
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 17.05.2009, 11:03   #3
DemonXT
Пользователь
 
Аватар для DemonXT
 
Регистрация: 31.03.2009
Сообщений: 40
Вопрос

Цитата:
Сообщение от Terran Посмотреть сообщение
Попробуйте так:
Код:
...
procedure TForm1.cbFormatEnter(Sender: TObject);
begin
 cbFormat.Style:= csDropDownList;
 cbFormat.Style:=csOwnerDrawFixed;
end;
...
Не помогло.

Цитата:
Что бы cbFormat начинал работать сразу при появлении формы установите фокус к примеру на Edit или ещё как какой-нибудь объект.
У меня примерно так и настроено.
Наблюдается странная картина: при переключении на cbFormat его стиль меняется, но он становится какой-то неактивный! Не реагирует н на мышку ни на клавиатуру!
DemonXT вне форума Ответить с цитированием
Старый 19.05.2009, 13:19   #4
DemonXT
Пользователь
 
Аватар для DemonXT
 
Регистрация: 31.03.2009
Сообщений: 40
По умолчанию

Неужели никто не сталкивался с подобной проблемой?
Может посоветуете TComboBox от сторонних разработчиков.
DemonXT вне форума Ответить с цитированием
Старый 19.05.2009, 14:27   #5
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

Дык, может так:
Код:
procedure TForm1.cbFormatEnter(Sender: TObject);
begin
 cbFormat.Style:=csDropDown;
end;
Или я не понял вопрос?
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Neeter вне форума Ответить с цитированием
Старый 19.05.2009, 15:04   #6
DemonXT
Пользователь
 
Аватар для DemonXT
 
Регистрация: 31.03.2009
Сообщений: 40
Восклицание

Цитата:
Сообщение от Neeter Посмотреть сообщение
Или я не понял вопрос?
Дело в том, что поменять стиль не проблема, но вот почему-то компанент после этого становиться неактивным. Не реагирует вообще не на какие контролы!
DemonXT вне форума Ответить с цитированием
Старый 19.05.2009, 15:12   #7
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

Почему же, я когда изменил на csDropDown, все работать стало, вы нажмите на текст в combobox'е и потом уже можно будет открыть его список
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Neeter вне форума Ответить с цитированием
Старый 20.05.2009, 11:10   #8
DemonXT
Пользователь
 
Аватар для DemonXT
 
Регистрация: 31.03.2009
Сообщений: 40
По умолчанию

Цитата:
Сообщение от Neeter Посмотреть сообщение
Почему же, я когда изменил на csDropDown, все работать стало, вы нажмите на текст в combobox'е и потом уже можно будет открыть его список
Дело в том, что в моём случае при щелчке мыши на компонент он замирает! Переключения с csSimple на csDropDown происходит, но сфокусироваться на компоненте и выбрать элементы из списка невозможно!
Для наглядности привожу полный код:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  Tfm = class(TForm)
    cbFormat: TComboBox;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure cbFormatEnter(Sender: TObject);
    procedure cbFormatExit(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  fm: Tfm;

implementation

{$R *.dfm}

procedure Tfm.cbFormatEnter(Sender: TObject);
begin
  cbFormat.Clear;
  cbFormat.Items.Append('A');
  cbFormat.Items.Append('B');
  cbFormat.Items.Append('C');
  cbFormat.Style:=csOwnerDrawFixed;
end;

procedure Tfm.cbFormatExit(Sender: TObject);
begin
  cbFormat.Style:=csSimple;
end;

procedure Tfm.FormActivate(Sender: TObject);
begin
  Memo1.SetFocus;
end;

procedure Tfm.FormCreate(Sender: TObject);
begin
  cbFormat.Style:=csSimple;
end;

end.
Убедитесь сами.
DemonXT вне форума Ответить с цитированием
Старый 20.05.2009, 15:44   #9
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

DemonXT, попробуйте так:
Код:
Procedure TForm1.cbFormatEnter(Sender: TObject);
Begin
  cbFormat.Clear;
  cbFormat.Style:= csDropDownList;
  cbFormat.Style:=csOwnerDrawFixed;
  cbFormat.Items.Append('A');
  cbFormat.Items.Append('B');
  cbFormat.Items.Append('C');
End;
Я у себя проверил. Всё хорошо работает и открывается. Всё выбирается с помощью мышки и клавиатуры. Только если с помощью TAB'a переключать фокус, то тогда он не действует...
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 20.05.2009, 15:56   #10
DemonXT
Пользователь
 
Аватар для DemonXT
 
Регистрация: 31.03.2009
Сообщений: 40
Хорошо

Всем спасибо. С проблемой справился. Помогли на другом форуме.
На сколько я понял просто так сменить стиль у ComboBox-a нельзя. При принудительной смени VCL пересоздаёт его с новым стилем. Из-за чего фокус идёт в некуда.
Привожу рабочее решение, может кому пригодиться (c) GunSmoker:
Код:
const
  WM_SETCBSTYLE = WM_USER + 1;

type
  Tfm = class(TForm)
    ...
  private
    { Private declarations }
    procedure WMSetCBStyle(var Msg: TMessage); message WM_SETCBSTYLE;
    ...
  end;

...

procedure Tfm.cbFormatEnter(Sender: TObject);
begin
  if cbFormat.Style = csDropDown then
    Exit;
  PostMessage(Handle, WM_SETCBSTYLE, 1, 0);
end;

procedure Tfm.cbFormatExit(Sender: TObject);
begin
  if cbFormat.Style = csSimple then
    Exit;
  PostMessage(Handle, WM_SETCBSTYLE, 0, 0);
end;

procedure Tfm.WMSetCBStyle(var Msg: TMessage);
begin
  cbFormat.OnEnter := nil;
  cbFormat.OnExit := nil;
  try
    if Msg.wParam <> 0 then
      cbFormat.Style := csDropDown
    else
      cbFormat.Style := csSimple;
  finally
    cbFormat.OnEnter := cbFormatEnter;
    cbFormat.OnExit := cbFormatExit;
  end;
end;
DemonXT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите настроить Visual C++ 6.0 Illia Visual C++ 2 30.01.2009 20:58
помогите настроить topserver pasha814 PHP 5 22.01.2008 06:51
Помогите настроить Чат по Локалке HAMMAN Свободное общение 1 17.07.2007 20:29
ПОМОГИТЕ НАСТРОИТЬ Borland Dragon-z Общие вопросы C/C++ 1 26.12.2006 21:00