我到华为面试,人家问我的问题? ( 积分: 50 )

  • 主题发起人 13708782004
  • 开始时间
procedure TControl.SetTextBuf(Buffer: PChar);
begin
Perform(WM_SETTEXT, 0, Longint(Buffer));
Perform(CM_TEXTCHANGED, 0, 0);
end
这是caption更改时候调用的函数,buffer就是caption的存放地,
他是一个内存变量。
当你改变caption的时候,触发这个函数,caption的内存块
作为变量传入。
 
嗯, 侯捷, 我的偶像…… [:D]
 
侯捷到底是谁????
汗!
 
呵呵,遇到这类变态的考官, 就回答绝对正确的答案,

或者,你问他一个Delphi问题,
如果他答不出来, 你就说,
连这都不知道,还来当考官?
有你这种人在,华为就招不到真正的人才
 
应该说是资源文件
 
所以 存在*.dfm里面
运行的时候存在内存里 不运行的时候存在*.dfm里.....
-------------------
运行的时候不存在内存里存在哪里?
delphi的窗体被持久化后不存在*.fm里存在哪里?
这个CEO很牛X,我倒很想知道牛X在哪里。
面试是要找自己合适的人不是来为难人的,不是问出一个能让你莫名其妙的问题的人就是牛X。
GetTextBuf(Pointer(Result), Len + 1);
再往后看就到了
WindowProc(Message);delphi的消息处理机制,hook消息处理流程加入自己的消息处理(我对消息处理也不是很清楚,大概就这个意思了)。
好,查找一下WM_SETTEXT,看看他作了什么。
procedure TControl.DefaultHandler(var Message);
var
P: PChar;
begin
with TMessage(Message) do
case Msg of
WM_GETTEXT:
begin
if FText <> nil then P := FText else P := '';
Result := StrLen(StrLCopy(PChar(LParam), P, WParam - 1));
end;
WM_GETTEXTLENGTH:
if FText = nil then Result := 0 else Result := StrLen(FText);
WM_SETTEXT:
begin
P := StrNew(PChar(LParam));
StrDispose(FText);
FText := P;
SendDockNotification(Msg, WParam, LParam);
end;
end;
end;
FText?[:)]
SendDockNotification(Msg, WParam, LParam);//看名字应当是发送一个通知消息,通知UI作相应的处理。
 
zbird ,牛啊,你更胜一筹啊!
 
procedure TControl.DefaultHandler(var Message);
var
P: PChar;
begin
with TMessage(Message) do
case Msg of
WM_GETTEXT:
begin
if FText <> nil then P := FText else P := '';
Result := StrLen(StrLCopy(PChar(LParam), P, WParam - 1));
end;
WM_GETTEXTLENGTH:
if FText = nil then Result := 0 else Result := StrLen(FText);
WM_SETTEXT:
begin
P := StrNew(PChar(LParam));
StrDispose(FText);
FText := P;
SendDockNotification(Msg, WParam, LParam);
end;
end;
end;
FText?[:)]
SendDockNotification(Msg, WParam, LParam);//看名字应当是发送一个通知消息,通知UI作相应的处理。

这一段,zbird说的不对,对Tpanle这类有句柄的对象操作caption,根本不会执行到TControl的DefaultHandler,你可以看看父类TWinControl的DefaultHandler就知道了,不信你设置断点看看。只有TLabel这类没有句柄的对象
操作才能执行到TControl的DefaultHandler
 
[:)]
你看看你的断点是什么颜色的?
是不是前面一个小X,然后还是用绿色标记这一行的?
你再在单元里设置一些其他的断点看看有没有反应。
procedure DefaultHandler(var Message); override;
你自己写个控件,然后对DefaultHandler进行重载,再看看有没有执行。
 
project->options->compiler->
Use Debug DCUs 前面选中,你再试试
 
procedure TForm1.Button1Click(Sender: TObject);
begin
panel1.caption:='aa';
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Label1.caption:='aa';
end;

procedure TControl.DefaultHandler(var Message);
你在这一行
P := StrNew(PChar(LParam));
放个断点看看点击button1和button2有什么区别
 
确实是我搞错了。
procedure DefaultHandler(var Message); override;
TWinControl里面对DefaultHandler有重载,并没有执行TControl里的方法。
真正执行的代码是
procedure TWinControl.DefaultHandler(var Message);
begin
if FHandle <> 0 then
begin
with TMessage(Message) do
begin
if (Msg = WM_CONTEXTMENU) and (Parent <> nil) then
begin
Result := Parent.Perform(Msg, WParam, LParam);
if Result <> 0 then Exit;
end;
case Msg of
WM_CTLCOLORMSGBOX..WM_CTLCOLORSTATIC:
Result := SendMessage(LParam, CN_BASE + Msg, WParam, LParam);
CN_CTLCOLORMSGBOX..CN_CTLCOLORSTATIC:
begin
SetTextColor(WParam, ColorToRGB(FFont.Color));
SetBkColor(WParam, ColorToRGB(FBrush.Color));
Result := FBrush.Handle;
end;
else
if Msg = RM_GetObjectInstance then
Result := Integer(Self)
else
Result := CallWindowProc(FDefWndProc, FHandle, Msg, WParam, LParam);
end;
if Msg = WM_SETTEXT then
SendDockNotification(Msg, WParam, LParam);
end;
end
else
inherited DefaultHandler(Message);
end;
 
既然是TWinControl,这个caption已经是windows“窗体”的事了,直接看msdn。
WM_SETTEXT Message
--------------------------------------------------------------------------------
An application sends a WM_SETTEXT message to set the text of a window.
感觉到这里就真没什么好说的了。
 
赫赫,好像就是这样子的(同意zbird的最后看法)
 
楼主编的笑话居然这么多人信,华为的怎会专问DELPHI的问题
 
华为也有部分产品是用delphi进行开发的。
而且楼主也没有说专问delphi的问题,楼主说同去的被问的是“候捷”。
 
问题不是被问了什么,而是通过这个讨论学到了什么
 
我是学到东西了,的确我不知道!心服口服,以后真不敢到大公司谋职
 
好,帮顶



--------签名档---------------------------

比肩国内顶尖源码下载站点 -> 源码我爱你

http://www.source520.com
http://www.source520.net

80G源码电子书免费免注册下载,大量精辟技术文档库随时更新
******************************************************************
附:为了站点持续发展,现有本站近年来收藏的大量大型商业源码低价出售,
详情请进入以下链接查看:
http://www.source520.com/building_delphi.htm

浏览商业代码请从如下URL进入查看实物:
1.商业源码库1: ftp://source520see3:browse@61.152.199.245/
2.商业源码库2: ftp://source520see2:browse@61.152.199.245/
 
厉害。

对这些真不懂。
 
顶部