Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ReadOnly for TComboBox [D6, Win95/98]


Elast ©   (2005-03-12 10:00:00) 

Уважаемые мастера! При попытке реализовать сабж следующим кодом ничего не происходит, т.е. я хотел запретить выпадение списка ListBox

.....
type

 TfdComboBox = class(TComboBox)
 private
   FReadOnly : Boolean;
   procedure SetReadOnly(const Value: Boolean);
 protected
 public
   constructor Create (AOwner : TComponent); override;
   destructor Destroy; override;
   property ReadOnly: Boolean read FReadOnly write SetReadOnly default False;
 end;

implementation

constructor TfdComboBox.Create(AOwner: TComponent);
begin
 inherited;
 FReadOnly := False;
end;

destructor TfdComboBox.Destroy;
begin
 inherited;
end;

procedure TfdComboBox.SetReadOnly(const Value: Boolean);
begin
 if FReadOnly <> Value then begin
   FReadOnly := Value;
   if HandleAllocated then    
     SendMessage(Handle, EM_SETREADONLY, Ord(Value), 0);
 end;
end;

...........

type
 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   procedure FormCreate(Sender: TObject);
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
   FfdComboBox : TfdComboBox;
 public
   { Public declarations }
 end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 FfdComboBox := TfdComboBox.Create(Self);
 with FfdComboBox do begin
   Parent := Self;
   Style := csDropDownList;
   Items.Add('qqqqqqqqq');
   Items.Add('wwwwwwwww');
   Items.Add('eeeeeeeee');
   Left  := 10;
   Top   := 10;
   Width := 200;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 FfdComboBox.ReadOnly := True;
end;

Возможно ли это? Или проще установить Enabled := False и перерисовать Canvas объекта, но тоже не получается.


Юрий Зотов   (2005-03-12 19:52:00) [1]

Добавьте в protected:
procedure KeyPress(var Key: Char); override;

procedure TfdComboBox.KeyPress(var Key: Char);
begin
 if FReadOnly then
   Key := #0
 else
   inherited
end;


Elast   (2005-03-12 18:59:00) [2]

2 Юрий Зотов
Большое спасибо. Это то, что я хотел, но обнаружилось, что ComboBox при новом стиле можно корректировать клавишей
BackSpace - :-(


Юрий Зотов   (2005-03-12 17:52:00) [3]

> Elast

Конструктор и деструктор - выкинуть (лишние), остальное так:

 TfdComboBox = class(TComboBox)
 private
   FReadOnly: boolean;
   FSaveStyle: TComboBoxStyle;
   procedure SetReadOnly(const Value: Boolean);
 protected
   procedure CreateWnd; override;
   procedure SetStyle(Value: TComboBoxStyle); override;
 published
   property ReadOnly: Boolean read FReadOnly write SetReadOnly default False;
 end;

procedure TfdComboBox.CreateWnd;
begin
 inherited;
 if FReadOnly then
   SendMessage(EditHandle, EM_SETREADONLY, 1, 0)
end;

procedure TfdComboBox.SetReadOnly(const Value: Boolean);
begin
 if FReadOnly <> Value then
 begin
   FReadOnly := Value;
   SendMessage(EditHandle, EM_SETREADONLY, Integer(FReadOnly), 0);
   if FReadOnly then
   begin
     FSaveStyle := Style;
     Style := csSimple
   end
   else
     Style := FSaveStyle
 end
end;

procedure TfdComboBox.SetStyle(Value: TComboBoxStyle);
begin
 if (Value = csSimple) or not FReadOnly then
 begin
   inherited;
   if not FReadOnly then
     FSaveStyle := Style
 end
end;


Elast   (2005-03-12 11:57:00) [4]

1. ... , т.е. я хотел запретить выпадение списка ListBox
2.Style := csDropDownList


Cobalt   (2005-03-12 10:45:00) [5]

Во-первых, поясни - как именно функционирует режим "ReadOnly" в твоём понимании?
По табу фокус должен получать?
Как зависит от стиля?


Наверх

Титульная страница Поиск, карта сайта Написать письмо