在Delphi中,Create一般是用来构造对象用的,TMyDBGrid.Create构造一个TMyDBGrid的实例,
而CreateWnd而是用来创建一个实例对应的窗体,其实就是通知Windows给TMyDBGrid的实例分
配一个窗口句柄,比如下面一段代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text:=IntToStr(Edit1.Handle);
Edit1.Ctl3D:=not Edit1.Ctl3D;
end;
整个窗体上放一个TEdit实例和一个TButton实例,当单击Button时会用Edit来显示它自身
的Handle属性,然后改变它的Ctl3D属性,实验发现每按一次,显示的内容都会变,可见一个
窗口控件在生存期中并不唯一使用同一个Handle,某些属性比如Ctl3D属性的改变会导致
Windows重新为其分配句柄,而分配句柄的过程就是由CreateWnd来完成的:
procedure TWinControl.CreateWnd;
var
Params: TCreateParams;
TempClass: TWndClass;
ClassRegistered: Boolean;
begin
CreateParams(Params);
with Params do
begin
if (WndParent = 0) and (Style and WS_CHILD <> 0) then
if (Owner <> nil) and (csReading in Owner.ComponentState) and
(Owner is TWinControl) then
WndParent := TWinControl(Owner).Handle
else
raise EInvalidOperation.CreateFmt(SParentRequired, [Name]);
FDefWndProc := WindowClass.lpfnWndProc;
ClassRegistered := GetClassInfo(WindowClass.hInstance, WinClassName, TempClass);
if not ClassRegistered or (TempClass.lpfnWndProc <> @InitWndProc) then
begin
if ClassRegistered then Windows.UnregisterClass(WinClassName,
WindowClass.hInstance);
WindowClass.lpfnWndProc := @InitWndProc;
WindowClass.lpszClassName := WinClassName;
if Windows.RegisterClass(WindowClass) = 0 then RaiseLastOSError;
end;
CreationControl := Self;
CreateWindowHandle(Params);
//这里根据调用的方法的名称就看得出来它是分配句柄用的.
if FHandle = 0 then RaiseLastOSError;
end;
StrDispose(FText);
FText := nil;
UpdateBounds;
Perform(WM_SETFONT, FFont.Handle, 1);
if AutoSize then AdjustSize;
end;
再看看CreateWindowHandle的源码:
procedure TWinControl.CreateWindowHandle(const Params: TCreateParams);
begin
with Params do
FHandle := CreateWindowEx(ExStyle, WinClassName, Caption, Style,
X, Y, Width, Height, WndParent, 0, WindowClass.hInstance, Param);
end;
只不过的重新调用CreateWindowEx这个API函数.
根据以上的说明,可知一个Delphi窗口对象,它在生存期Create只会执一次,但CreateWnd可
能执行多次,我来知道你为什么会在CreateWnd方法中改变标题(看得出来好象是要显示当
前是哪一例被排序)我觉得应该定义一个成员来保存当前排序的列号,在需要时把这个序号
赋成0或其他值,如果需要初始化这个成员则直接在Create构造函数中赋值.而在绘制表格时
才将排序列标题加上一'▲'号输出,这样并不改变列的标题值本身,可以保证无论排序到哪
列都不会出现显示几个'▲'的情况!