★★★★★ 菜鸟问题一个! ★★★★★ 菜鸟问题一个! ★★★★★ 菜鸟问题一个! ★★★★★

叁哥_ 2005-01-14 06:49:33

各位大哥,大姐,大姨,二姑,三婶,四伯...
小弟在这里先拜年了 ^___________^



红包 就不要,只是想请教各位高人一个问题:

请看如下语句:
Form1->Caption = "new caption";

小弟的疑问是,为什么这个语句可以“立即”改变窗口的标题呢?

按小弟的理解,“等号”只是“赋值”,如果要改变“窗口”标题,应该要调用SetWindowText的?

为什么Caption这个“变量”改变后,窗口标题也立即改变呢?变量的改变如何触发调用SetWindowText

的呢?




^________________________________________________________________^

不懂不要乱说哦~

...全文
161 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
叁哥_ 2005-01-22
  • 打赏
  • 举报
回复

首先,我很诚挚的向在坐的各位,表示道歉。


我不想多找借口,总之还望大家谅解.

===========================

SailorTPM(提早二十年退休) !

很高兴有人急人之所急,呵呵,谢谢你的答案。


我发现
oldtab(汇铁) 很能理解人啊!

我确实很怕很多人会做一些无谓的回答,然后,帖子拖得很长,就没人再愿意看了。然后...有过这种

经验,所以有点“心理阴影”所以...呵呵...抱歉了...
eccalc 2005-01-15
  • 打赏
  • 举报
回复
楼主有兴趣可以研究一下BCB\VCL\TPropertyEditor类定义,它会告诉你_Property如何触发的机理
以下是它的HPP:
class DELPHICLASS TPropertyEditor;
class PASCALIMPLEMENTATION TPropertyEditor : public Designintf::TBasePropertyEditor
{
typedef Designintf::TBasePropertyEditor inherited;

private:
Designintf::_di_IDesigner FDesigner;
TInstProp *FPropList;
int FPropCount;
AnsiString __fastcall GetPrivateDirectory();

protected:
virtual void __fastcall SetPropEntry(int Index, Classes::TPersistent* AInstance, Typinfo::PPropInfo APropInfo);
Extended __fastcall GetFloatValue(void);
Extended __fastcall GetFloatValueAt(int Index);
__int64 __fastcall GetInt64Value(void);
__int64 __fastcall GetInt64ValueAt(int Index);
System::TMethod __fastcall GetMethodValue();
System::TMethod __fastcall GetMethodValueAt(int Index);
int __fastcall GetOrdValue(void);
int __fastcall GetOrdValueAt(int Index);
AnsiString __fastcall GetStrValue();
AnsiString __fastcall GetStrValueAt(int Index);
Variant __fastcall GetVarValue();
Variant __fastcall GetVarValueAt(int Index);
System::_di_IInterface __fastcall GetIntfValue();
System::_di_IInterface __fastcall GetIntfValueAt(int Index);
void __fastcall Modified(void);
void __fastcall SetFloatValue(Extended Value);
void __fastcall SetMethodValue(const System::TMethod &Value);
void __fastcall SetInt64Value(__int64 Value);
void __fastcall SetOrdValue(int Value);
void __fastcall SetStrValue(const AnsiString Value);
void __fastcall SetVarValue(const Variant &Value);
void __fastcall SetIntfValue(const System::_di_IInterface Value);
bool __fastcall GetEditValue(/* out */ AnsiString &Value);
bool __fastcall HasInstance(Classes::TPersistent* Instance);

public:
__fastcall virtual TPropertyEditor(const Designintf::_di_IDesigner ADesigner, int APropCount);
__fastcall virtual ~TPropertyEditor(void);
virtual void __fastcall Activate(void);
virtual bool __fastcall AllEqual(void);
virtual bool __fastcall AutoFill(void);
virtual void __fastcall Edit(void);
virtual Designintf::TPropertyAttributes __fastcall GetAttributes(void);
Classes::TPersistent* __fastcall GetComponent(int Index);
virtual int __fastcall GetEditLimit(void);
virtual AnsiString __fastcall GetName();
virtual void __fastcall GetProperties(Designintf::TGetPropProc Proc);
virtual Typinfo::PPropInfo __fastcall GetPropInfo(void);
Typinfo::PTypeInfo __fastcall GetPropType(void);
virtual AnsiString __fastcall GetValue();
AnsiString __fastcall GetVisualValue();
virtual void __fastcall GetValues(Classes::TGetStrProc Proc);
virtual void __fastcall Initialize(void);
void __fastcall Revert(void);
virtual void __fastcall SetValue(const AnsiString Value);
bool __fastcall ValueAvailable(void);
__property Designintf::_di_IDesigner Designer = {read=FDesigner};
__property AnsiString PrivateDirectory = {read=GetPrivateDirectory};
__property int PropCount = {read=FPropCount, nodefault};
__property AnsiString Value = {read=GetValue, write=SetValue};
private:
void *__IProperty; /* Designintf::IProperty */

public:
operator IProperty*(void) { return (IProperty*)&__IProperty; }

};
eccalc 2005-01-15
  • 打赏
  • 举报
回复
在BCB中,Borland 扩展了C++语法,在编译时,它首先将_property替换成标准的C++成员函数,然后交给Borland C++编译器!
eccalc 2005-01-15
  • 打赏
  • 举报
回复
厉害!
同时同情!
ch_builder 2005-01-15
  • 打赏
  • 举报
回复
哇,楼主,不管别人说对说错你也不应该这样说话呀,大家都是关心这个问题才过来说的,你这样的态度哪有人还敢来呀?
read的值改变了,就会触发write,这也许是_property的特殊之处吧,就象鼠标单击事件,单击了就触发了,为什么?那是一个内部机制问题
oldtab 2005-01-15
  • 打赏
  • 举报
回复
基本上,楼主是做了一个井。且预见着很多人要怎么说。
你也可以温和些啊。
深呼吸N次后,作答如下:
Caption值改变时,并不要触发什么。而是直接调用SetText过程。
或是调用SetText并在其中改变Caption的值。跟踪一下,应能看出究竟。
叁哥_ 2005-01-15
  • 打赏
  • 举报
回复
一个 一个 都 很懂 似的。

如果你们很懂,那么说说

__property AnsiString Caption = {read=GetText, write=SetText};

被bcb编译后的结果是啥样子!


怎么竟是些知其然,不只其所以然的家伙!


read=GetText write=setText 谁不知道啥意思啊!


这样说吧,:当Caption变量改变后,什么东西触发了SetText呢? 你们明白我我的问题了吧?
Maconel 2005-01-15
  • 打赏
  • 举报
回复
我的答案和上边是一样的,所以我“不懂”,那么我就“不懂不要乱说”吧。
ThinkX 2005-01-15
  • 打赏
  • 举报
回复
TempterX (兄弟) 说话太不地道。
bocwg 2005-01-14
  • 打赏
  • 举报
回复
UP
xuv2002 2005-01-14
  • 打赏
  • 举报
回复
看vcl 源码吧
__property AnsiString Caption = {read=GetText, write=SetText};
TForm->Caption 继承自TControl类

controls.pas
----


procedure TControl.SetText(const Value: TCaption);
begin
if GetText <> Value then SetTextBuf(PChar(Value));//调用SetTextBuf函数
end;

procedure TControl.SetTextBuf(Buffer: PChar);
begin
Perform(WM_SETTEXT, 0, Longint(Buffer));//处理了WM_SETTEXT消息
Perform(CM_TEXTCHANGED, 0, 0);
end;

---
再看SetWindowText的帮助


The SetWindowText function causes a WM_SETTEXT message to be sent to the specified window or control.

BeRoy 2005-01-14
  • 打赏
  • 举报
回复
Caption是个AnsiString啊
叁哥_ 2005-01-14
  • 打赏
  • 举报
回复


请问是否 Caption 是否 是个 类,而这个类重载了操作符?
叁哥_ 2005-01-14
  • 打赏
  • 举报
回复
哎!都说了,“不懂不要乱说”!

Persistent8813 2005-01-14
  • 打赏
  • 举报
回复
错了,是settext方法
Persistent8813 2005-01-14
  • 打赏
  • 举报
回复
看看__property的用法吧

__property WideString Caption = {read=GetText, write=SetText};

这句本身就调用了GetText方法了
过客猫2022 2005-01-14
  • 打赏
  • 举报
回复
有空多看看VCL源代码,你会收益非浅的:)
xuv2002(XuWei)的是正确的。

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧