关于消息截获的问题,困扰我好几天了。(200分)

  • 主题发起人 xingkong97
  • 开始时间
X

xingkong97

Unregistered / Unconfirmed
GUEST, unregistred user!
在窗体中有一个控件TCombobox,单击箭头可以出现下拉菜单内容,但是现在我在窗体中设置了另一个控件,且该控件在运行期间可编辑,即csDesigning in ComponentState,但是我发现在运行期,TCombobox控件只能通过双击来显示下拉列表框的内容,也就是说单击消息被那个控件截获了,我试了很多方法,比如重写wndproc或者发送一个使其显示下拉框的消息,但是都不行。
不过如果关闭该控件的运行起状态,那么TCombobox又恢复了正常。
请问各位,该怎么解决啊?
 
抽象一个公共父类,TCombobox跟另一个控件同时从那获得单击事件
 
来自:guanyue7613, 时间:2008-11-19 12:48:51, ID:3930918
抽象一个公共父类,TCombobox跟另一个控件同时从那获得单击事件
--------------------------------------------------------------
不知道什么意思?能说得清楚些吗?
 
肯定要改你设置的那个控件了,它提前截取到单击事件,然后不再Dispatch了,你如何得到消息
 
我在里面加了Dispatch了,但是没用。
算了,换个思路吧。
 
自己在写一个Hook Mouse的,如果mouse_click,那么当下面的窗口是你说的类型时,模拟
DBL_click即可!
 
我也觉得换个思路更容易解决问题。还有,如果没有什么很特殊的需求,没有必要自己写一个新的控件,D已有的就足够了,当然,可能需要加上一些特殊的代码。
 
来自:wql, 时间:2008-11-19 17:29:37, ID:3930989
自己在写一个Hook Mouse的,如果mouse_click,那么当下面的窗口是你说的类型时,模拟
DBL_click即可!
-----------------------------------------------------
这个方法我也试过,不是模拟,模拟在wndproc中是不行的,只能发送消息。
我在单击的时候将单击的消息 message.msg替换成wm_lbuttondbclick,但是发现wparam和lparam都和真正的双击是不一样的,根本就不行啊。所以放弃了。
来自:szhcracker, 时间:2008-11-19 17:31:28, ID:3930991
我也觉得换个思路更容易解决问题。还有,如果没有什么很特殊的需求,没有必要自己写一个新的控件,D已有的就足够了,当然,可能需要加上一些特殊的代码。
---------------------------------------------------------------
你觉得D的控件真的够了吗?当你有更深一步的应用的时候你会发现,需要重写或改进的控件太多了啊。
 
不是模拟在wndproc中,而是就在dll中
 
来自:wql, 时间:2008-11-20 8:56:19, ID:3931081
不是模拟在wndproc中,而是就在dll中
-------------------------------------------------
你说得这个有什么用呢?我是要传递消息啊。
 
你是不是 做 运行期 调整 控件位置 属性啊
有很多此类控件
啊 例如 StretchHandle,dram(这个太强大了)

unit u_InfoPanel;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, Dialogs, ExtCtrls, StdCtrls, Buttons, ComCtrls, TypInfo,
StretchHandle;
type
TControlRec = record
Control: TControl;
FieldName: string;
end;
TInfoPanel_HFG = class(TCustomPanel)
private
FControlRecList: array of TControlRec;
FControl_OnChange: TNotifyEvent;
FControl_OnClick: TNotifyEvent;
FControl_OnDblClick: TNotifyEvent;
FControl_OnEnter: TNotifyEvent;
FControl_OnExit: TNotifyEvent;
FControl_OnKeyDown: TKeyEvent;
FControl_OnKeyPress: TKeyPressEvent;
FControl_OnKeyUp: TKeyEvent;
FControl_OnMouseUp: TMouseEvent;
FControl_OnMouseDown: TMouseEvent;

Fold_C_OnMouseDown: TMouseEvent;
FStretchHandle: TStretchHandle;
procedure setControl_OnMouseDown(v: TMouseEvent);
protected
{ Protected declarations }

procedure setEvent(con: TControl;
eventName: string);
procedure setEventALL(con: TControl);
procedure StretchHandleMouseDown(Sender: TObject;
Button: TMouseButton;
Shift: TShiftState;
X, Y: Integer);
public
procedure addControl_withStr(V: string;
FieldName: string = '');

procedure begin
Design;
procedure EndDesign;
procedure LoadControl(ss: TStrings);
procedure SaveControl(ss: TStrings);
procedure ClearControl;
published
property C_OnChange: TNotifyEvent read FControl_OnChange write FControl_OnChange;
property C_OnClick: TNotifyEvent read FControl_OnClick write FControl_OnClick;
property C_OnDblClick: TNotifyEvent read FControl_OnDblClick write FControl_OnDblClick;
property C_OnEnter: TNotifyEvent read FControl_OnEnter write FControl_OnEnter;
property C_OnExit: TNotifyEvent read FControl_OnExit write FControl_OnExit;
property C_OnKeyDown: TKeyEvent read FControl_OnKeyDown write FControl_OnKeyDown;
property C_OnKeyPress: TKeyPressEvent read FControl_OnKeyPress write FControl_OnKeyPress;
property C_OnKeyUp: TKeyEvent read FControl_OnKeyUp write FControl_OnKeyUp;
property C_OnMouseUp: TMouseEvent read FControl_OnMouseUp write FControl_OnMouseUp;
property C_OnMouseDown: TMouseEvent read FControl_OnMouseDown write setControl_OnMouseDown;
end;

function ComponentToString(Component: TComponent): string;
function StringToComponent(Value: string): TComponent;


implementation


function ComponentToString(Component: TComponent): string;
var
BinStream: TMemoryStream;
StrStream: TStringStream;
s: string;
begin
BinStream := TMemoryStream.Create;
try
StrStream := TStringStream.Create(s);
try
BinStream.WriteComponent(Component);
BinStream.Seek(0, soFrombegin
ning);
ObjectBinaryToText(BinStream, StrStream);
StrStream.Seek(0, soFrombegin
ning);
Result := StrStream.DataString;
finally
StrStream.Free;
end;
finally
BinStream.Free
end;
end;

function StringToComponent(Value: string): TComponent;
var
StrStream: TStringStream;
BinStream: TMemoryStream;
begin
StrStream := TStringStream.Create(Value);
try
BinStream := TMemoryStream.Create;
try
ObjectTextToBinary(StrStream, BinStream);
BinStream.Seek(0, soFrombegin
ning);
Result := BinStream.ReadComponent(nil);
finally
BinStream.Free;
end;
finally
StrStream.Free;
end;
end;

{ TInfoPanel_HFG }

procedure TInfoPanel_HFG.addControl_withStr(V: string;
FieldName: string = '');
var
c: TComponent;
l: integer;
con: TControl;

begin

c := StringToComponent(v);
if c is TControl then
with TControl(c)do
begin
Parent := Self;
end;

l := length(FControlRecList);
SetLength(FControlRecList, l + 1);
con := TControl(c);
FControlRecList[l].Control := Con;
FControlRecList[l].FieldName := FieldName;
setEventALL(con);
end;

procedure TInfoPanel_HFG.begin
Design;
begin
if FStretchHandle <> nil then
exit;
FStretchHandle := TStretchHandle.Create(nil);
Fold_C_OnMouseDown := C_OnMouseDown;
C_OnMouseDown := StretchHandleMouseDown;
end;

procedure TInfoPanel_HFG.ClearControl;
var
i: integer;
begin
for i := high(FControlRecList)do
wnto 0do
begin
FControlRecList.Control.Free;
FControlRecList.FieldName := '';
end;

SetLength(FControlRecList, 0);
end;

procedure TInfoPanel_HFG.EndDesign;
begin
if FStretchHandle = nil then
exit;
FreeAndNil(FStretchHandle);
C_OnMouseDown := Fold_C_OnMouseDown;
end;

procedure TInfoPanel_HFG.LoadControl(ss: TStrings);
var
i: integer;
strLine: string;
slTmp: TStringList;
procedure CreatCon;
var
strFieldName: string;
begin

if slTmp.Count > 3 then
begin
strFieldName := slTmp[0];
setlength(strFieldName, length(strFieldName) - 1);
strFieldName := copy(strFieldName, 2, System.MaxInt);
slTmp.Delete(0);
addControl_withStr(slTmp.Text, strFieldName);
end;
end;
begin
ClearControl;
slTmp := TStringList.Create;
for i := 0 to ss.Count - 1do
begin
strLine := ss;
if strLine <> '' then
if (strLine[1] = '[') and (strLine[length(strLine)] = ']') then
begin
CreatCon;
slTmp.Clear;
slTmp.Add(strLine);
Continue;
end;
slTmp.Add(strLine);
end;
CreatCon
end;

procedure TInfoPanel_HFG.SaveControl(ss: TStrings);
var
i: integer;
begin
ss.Clear;
for i := 0 to high(FControlRecList)do
begin
ss.Add('[' + FControlRecList.FieldName + ']');
ss.Add(ComponentToString(FControlRecList.Control))
end;
end;

procedure TInfoPanel_HFG.setControl_OnMouseDown(v: TMouseEvent);
var
i: integer;
begin
FControl_OnMouseDown := v;
for i := 0 to high(FControlRecList)do
setEvent(FControlRecList.Control, 'OnMouseDown');
end;

procedure TInfoPanel_HFG.setEvent(con: TControl;
eventName: string);
begin
if IsPublishedProp(con, eventName) then
begin
if IsPublishedProp(self, 'C_' + eventName) then
begin

SetMethodProp(con, eventName, GetMethodProp(self, 'C_' + eventName));
end;
end;

end;

procedure TInfoPanel_HFG.setEventALL(con: TControl);
begin
setEvent(con, 'OnChange');
setEvent(con, 'OnClick');
setEvent(con, 'OnDblClick');
setEvent(con, 'OnEnter');
setEvent(con, 'OnKeyUp');
setEvent(con, 'OnKeyDown');
setEvent(con, 'OnKeyPress');
setEvent(con, 'OnMouseUp');
setEvent(con, 'OnMouseDown');
end;

procedure TInfoPanel_HFG.StretchHandleMouseDown(Sender: TObject;
Button: TMouseButton;
Shift: TShiftState;
X, Y: Integer);
begin
FStretchHandle.Detach;
FStretchHandle.Attach(TControl(sender));
end;

initialization
RegisterClass(TLabel);
RegisterClass(TEdit);
RegisterClass(TComboBox);
RegisterClass(TButton);
RegisterClass(TSpeedButton);
RegisterClass(TDateTimePicker);
end.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
949
SUNSTONE的Delphi笔记
S
D
回复
0
查看
892
DelphiTeacher的专栏
D
顶部