急,急,急新写的TEdit控件拖到窗口上提示“control has no parent window”

lancechu 2010-08-16 10:24:32
unit uCCTEdit;

interface

uses
SysUtils, Classes, Controls, StdCtrls, Messages, Forms, Windows, uDateType, uDownForm;

type
TFiledType = (CTSNO,CTSNM,LKM,PTSNO,PTSNM,ORD,CORD,CT,CCT,BD,AE);
TCCTEdit = class(TEdit)
private
{ Private declarations }
FInfoArr: TCustInfoArr;
FFieldName: TFiledType;
FrmChangeDown: TFrmChangeDown;
FRecords: Integer;
FRows: Integer;
procedure SetInfoArr(const Value: TCustInfoArr);
procedure SetFieldName(const Value: TFiledType);
procedure GetFouse(var message: TMessage);message WM_GetFocus;
procedure GetText(var Amessage: TMessage);message WM_GetText;
procedure SetRecords(const Value: Integer);
procedure SetRows(const Value: Integer);
protected
{ Protected declarations }
FCanChange: Boolean;
procedure SearchResult(const AStr: String);
public
{ Public declarations }
procedure Change;override;
procedure KeyPress(var Key: Char); override;
procedure KeyUp(var Key: Word; Shift: TShiftState); override;
published
{ Published declarations }
property Rows: Integer read FRows write SetRows default 5;
property Records: Integer read FRecords write SetRecords default 20;
property InfoArr: TCustInfoArr read FInfoArr write SetInfoArr;
property FieldName: TFiledType read FFieldName write SetFieldName default CTSNO;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Standard', [TCCTEdit]);
end;

{ TCCTEdit }

procedure TCCTEdit.Change;
begin
inherited;
if not Assigned(FrmChangeDown) then
FrmChangeDown:= TFrmChangeDown.Create(nil);
try
if (Text <> '') and (not FCanChange) then
begin
FrmChangeDown.HWND:= Handle;
FrmChangeDown.CustInfoArr:= FInfoArr;
FrmChangeDown.SG.RowCount:= FRows;
FrmChangeDown.Show;
SearchResult(Text);
// FrmChangeDown.Top := Tform(Self.Parent).Top+self.Top+45;;
// FrmChangeDown.Left := Tform(Self.Parent).left+self.left+4;;
FrmChangeDown.Top := Top+45;;
FrmChangeDown.Left := left+4;;
end
else
FrmChangeDown.Hide;
finally
SendMessage(Handle,WM_GetFocus,0,0);
end;
end;

procedure TCCTEdit.GetFouse(var message: TMessage);
begin
if CanFocus then SetFocus;
end;

procedure TCCTEdit.GetText(var Amessage: TMessage);
var
saveChange: TNotifyEvent;
CustInfo: TCustInfoArr;
begin
saveChange:= OnChange;
OnChange:= nil;
FCanChange:= True;
CustInfo:= TCustInfoArr(Amessage.WParam);
Text:= '';
case FieldName of
CTSNO: Text:= CustInfo[0].CTSNM;
CTSNM: Text:= custInfo[0].CTSNMP;
end;
SelStart:= Length(Text);
OnChange:= saveChange;
FCanChange:= False;
end;

procedure TCCTEdit.KeyPress(var Key: Char);
begin
inherited;
if Key = #27 then //esc
begin
if Assigned(FrmChangeDown) then
FrmChangeDown.Hide;
end;
if Key = #13 then
begin
FrmChangeDown.SGKeyPress(nil,Key);
end;
end;

procedure TCCTEdit.KeyUp(var Key: Word; Shift: TShiftState);
begin
inherited;
if (Key = vk_up) or (Key = vk_down) then
begin
FrmChangeDown.Show;
SendMessage(FrmChangeDown.Handle,WM_SetSGFocus,0,0);
end;
end;

procedure TCCTEdit.SearchResult(const AStr: String);
var
i, iRow, iCol : integer;
begin
iRow := 0;
iCol := 0;
with FrmChangeDown.SG do
begin
for I := 0 to ColCount - 1 do
Cols[I].Clear;
end;
FrmChangeDown.SG.Cells[0, iRow] := '编号';
Inc(iCol);
FrmChangeDown.SG.Cells[iCol, iRow] := '客户名称';
Inc(iCol);
FrmChangeDown.SG.Cells[iCol, iRow] := '名称简码';
Inc(iRow); //1
Dec(iCol);
Dec(iCol); //0
for i:= 0 to Length(InfoArr) - 1 do
begin
if (Pos(AStr,FInfoArr[i].CTSNM) > 0) or
(Pos(AStr,FInfoArr[i].CTSNMP) > 0) then
begin
FrmChangeDown.SG.Cells[0,iRow]:= IntToStr(I);
Inc(iCol);
FrmChangeDown.SG.Cells[iCol,iRow]:= FInfoArr[i].CTSNM;
inc(iCol);
FrmChangeDown.SG.Cells[iCol,iRow]:= FInfoArr[i].CTSNMP;
Inc(iRow);
Dec(iCol);
Dec(iCol);
end;
end;
end;

procedure TCCTEdit.SetFieldName(const Value: TFiledType);
begin
FFieldName := Value;
end;

procedure TCCTEdit.SetInfoArr(const Value: TCustInfoArr);
begin
FInfoArr := Value;
end;

procedure TCCTEdit.SetRecords(const Value: Integer);
begin
FRecords := Value;
end;

procedure TCCTEdit.SetRows(const Value: Integer);
begin
FRows := Value;
end;

end.
--------------------------------------------------------------------
不知道问题出在哪,请高手帮助
...全文
222 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
12rain 2010-08-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 lancechu 的回复:]
procedure TCCTEdit.GetText(var Amessage: TMessage);
var
saveChange: TNotifyEvent;
CustInfo: TCustInfoArr;
begin
saveChange:= OnChange;
OnChange:= nil;
FCanChange:= True;
CustInfo:= TCustInfoArr(Amessage.WParam);
Text:= '';
case FieldName of
CTSNO: Text:= CustInfo[0].CTSNM;
CTSNM: Text:= custInfo[0].CTSNMP;
end;
SelStart:= Length(Text);
OnChange:= saveChange;
FCanChange:= False;
end;
[/Quote]

这段代码很成问题。
在GetText消息中去设置Text,取Text。。
12rain 2010-08-21
  • 打赏
  • 举报
回复
另外这类问题应该很好查。

调试控件,写个简单的小程序,
动态创建控件。
不要在设计期,这样很难跟踪错误
lancechu 2010-08-19
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 taxi 的回复:]
应该就是FrmChangeDown没有父窗口导置的,改成这样应该可以吧:
FrmChangeDown:= TFrmChangeDown.Create(Owner);
[/Quote]

还是不行
taxi 2010-08-18
  • 打赏
  • 举报
回复
应该就是FrmChangeDown没有父窗口导置的,改成这样应该可以吧:
FrmChangeDown:= TFrmChangeDown.Create(Owner);
JPEXE 2010-08-18
  • 打赏
  • 举报
回复
建议在创建FrmChangeDown窗体的时候,给它指定一个Owner
lancechu 2010-08-17
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 newfang 的回复:]
TFrmChangeDown 是个窗口类吗?

FrmChangeDown.HWND:= Handle; 这句,你想干吗?

Handle也可以乱赋值吗~~
[/Quote]

HWND是定义的一个变量,在FrmChangeDown里发消息给TCCTEdit
newfang 2010-08-17
  • 打赏
  • 举报
回复
TFrmChangeDown 是个窗口类吗?

FrmChangeDown.HWND:= Handle; 这句,你想干吗?

Handle也可以乱赋值吗~~
lancechu 2010-08-17
  • 打赏
  • 举报
回复
测试出报错的地方是
procedure TCCTEdit.Change;
的过程,当把change过程屏掉后,再往窗口上拖时就不再报错,请高手指教此处应该如何修改?
CaiBirdy 2010-08-17
  • 打赏
  • 举报
回复
实在不行就在所有代码前面加个设计时条件判断,直接跳出,保证全部在运行时执行。部分控件的事件时不能在设计时执行的。
lancechu 2010-08-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 jpexe 的回复:]
太晚了,没时间帮你调代码,告诉你一个方法,你不要直接把控件往窗体上拖,你可以用代码动态创建,这样你就可以通过调试找BUG了,自己搞一下吧。
[/Quote]

因为我要在整个程序中用这个控件,往窗体上拖还是比较方便的
JPEXE 2010-08-16
  • 打赏
  • 举报
回复
太晚了,没时间帮你调代码,告诉你一个方法,你不要直接把控件往窗体上拖,你可以用代码动态创建,这样你就可以通过调试找BUG了,自己搞一下吧。
lancechu 2010-08-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jpexe 的回复:]
那你先把你的GetFouse消息处理注释掉,再试试,因为纵观你的代码,会在控件创建时就被执行到的最可能就是GetFouse过程了。
[/Quote]

-----也不成,留下你的联系方式,我把代码发给你
JPEXE 2010-08-16
  • 打赏
  • 举报
回复
那你先把你的GetFouse消息处理注释掉,再试试,因为纵观你的代码,会在控件创建时就被执行到的最可能就是GetFouse过程了。
lancechu 2010-08-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jpexe 的回复:]
问一问LZ:
WM_GetFocus是什么消息?
Messages单元里貌似没有这个消息
[/Quote]

这是我自己定义的一个消息
JPEXE 2010-08-16
  • 打赏
  • 举报
回复
问一问LZ:
WM_GetFocus是什么消息?
Messages单元里貌似没有这个消息
lancechu 2010-08-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mdejtod 的回复:]
在public中重写构造函数
constructor Create(AOWner : TComponent); override;
constructor TCCTEdit.Create(AOWner: TComponent);
begin
inherited Create(AOWner);
end;
[/Quote]

------------------还是不行,能否留下QQ?
mdejtod 2010-08-16
  • 打赏
  • 举报
回复
在public中重写构造函数
constructor Create(AOWner : TComponent); override;
constructor TCCTEdit.Create(AOWner: TComponent);
begin
inherited Create(AOWner);
end;
kye_jufei 2010-08-16
  • 打赏
  • 举报
回复
照著上面的思路進行修改。。。

procedure TForm1.Button1Click(....) 
var
AButton:TButton;
begin
AButton:=TButton.Create(self);
AButton.Parent:=Form1;
.....
.....
.....
end;
kye_jufei 2010-08-16
  • 打赏
  • 举报
回复
你試著加一句:

TEdit.Parent:=self;




TEdit.Parent:=Form1; 



给控件赋值一个父窗体。。。
lancechu 2010-08-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 kye_jufei 的回复:]
很明顯了:“control has no parent window”---控制沒有父類窗口。。。
[/Quote]

如何修改呢?
加载更多回复(1)

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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