![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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" в твоём понимании?
По табу фокус должен получать?
Как зависит от стиля?