怎样使一个控件获不到焦点?(50分)

  • 主题发起人 主题发起人 shuiquan
  • 开始时间 开始时间
type
TMyControl=class(TControl)
...
procedure WndProc(var Message:TMessage);override;
...
end;

procedure TMyControl.WndProc(var Message:TMessage);
begin
if Message.Msg=... then
Exit //列出可能是控件获焦点的消息。
else
inherited WndProc(Message);
end;
 
control1.canfocus:=false;
Indicates whether a control can receive focus.
 
把enabled置为false。
 
比较同意lhxu的看法。
 
control1.canfocus 是ReadOnly,不能让控件获不到焦点
 
当焦点进入的时候使它失去焦点
 
处理焦点变化的消息,判断是那一个空间获得了焦点,在座响应的处理
 
实际上我问题来自于我需要一个显示多行文字的标签,我就用Memo控件代替,将Memo
的Borderstyle设为none;但这样有一个问题,Memo获得用户焦点后,会有光标等问题
如果把Memo.Enable:=False,则又有一个问题:Memo中的文字变成了暗灰色;
其实,有一个方法可以解决,就是把Memo放在Panel中,把panel.Enable设为False;
但我觉得这种方法太苯,那位能给一个完美的答案?
 
在memo获得焦点时,让它再失去焦点
procedure TForm1.Memo1Enter(Sender: TObject);
begin
Windows.SetFocus(GetNextDlgTabItem(
Handle,Memo1.Handle,True));
end;
 
那就用richedit,
同样设置enabled:=false和
tabstop:=false;
 
ahfei,没有更好的方法?
 
这个办法不好吗?解决你所有的问题
对了,那个boolean参数你设为false的话,就是反响设置焦点,既焦点落回到
上一个,也许这样更好
 
可是问题是label,panel都支持多行文本啊,何必那么费劲的要用
wincontrol类来代替control类呢?
我装过rxlib,所以一直可以在label中可以输入多行文字,
如果你不能输的话可以装rxlib在试,或者在notepad中写,在拷贝过来。
 
就为这个?这样就行了.
label1.Caption:='这是'#13'一个多行'#13'文本!';
 
还有一点,就是如果设计时用的话,要用view as text方式修改label.caption,而不
能使用属性窗口。
 
用Label就好了,何必要用Memo呢。
 
侵蚀一下如下程序,是否能大道理的要求
unit FCForm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls, Mask;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
StatusBar1: TStatusBar;
Button1: TButton;
Memo1: TMemo;
RadioButton1: TRadioButton;
MaskEdit1: TMaskEdit;
procedure Button1Click(Sender: TObject);
procedure Button1KeyPress(Sender: TObject;
var Key: Char);
public
procedure CmFocusChanged (var Msg: TCmFocusChanged);
message cm_FocusChanged;
end;

var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.CmFocusChanged (var Msg: TCmFocusChanged);
begin
if msg.Sender.name='Memo1' then
begin
button1.SetFocus;
if button1.Focused then
showmessage('gkfhjg');
end;
StatusBar1.SimpleText := Msg.Sender.Name;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage('gfjg');
end;

procedure TForm1.Button1KeyPress(Sender: TObject;
var Key: Char);
begin
if key=#13 then
button1click(self);
end;

end.
 
unit FCForm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls, Mask;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
StatusBar1: TStatusBar;
Button1: TButton;
Memo1: TMemo;
RadioButton1: TRadioButton;
MaskEdit1: TMaskEdit;
public
procedure CmFocusChanged (var Msg: TCmFocusChanged);
message cm_FocusChanged;
end;

var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.CmFocusChanged (var Msg: TCmFocusChanged);
begin
if msg.Sender.name='Memo1' then
begin
edit1.Setfocus;
if edit1.Focused then
showmessage('gkfhjg');
end;
end;

end.
 
后退
顶部