unit uCCTEdit;interfaceuses
  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;implementationprocedure 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.
--------------------------------------------------------------------
不知道问题出在哪,请高手帮助

解决方案 »

  1.   

    很明顯了:“control has no parent window”---控制沒有父類窗口
      

  2.   

    你試著加一句:TEdit.Parent:=self;或TEdit.Parent:=Form1; 
    给控件赋值一个父窗体
      

  3.   

    照著上面的思路進行修改procedure TForm1.Button1Click(....) 
    var 
    AButton:TButton; 
    begin 
    AButton:=TButton.Create(self); 
    AButton.Parent:=Form1; 
    ..... 
    ..... 
    ..... 
    end; 
      

  4.   

    在public中重写构造函数
    constructor Create(AOWner : TComponent); override;
    constructor TCCTEdit.Create(AOWner: TComponent);
    begin
      inherited Create(AOWner);
    end;
      

  5.   

    问一问LZ:
    WM_GetFocus是什么消息?
    Messages单元里貌似没有这个消息
      

  6.   

    那你先把你的GetFouse消息处理注释掉,再试试,因为纵观你的代码,会在控件创建时就被执行到的最可能就是GetFouse过程了。
      

  7.   

    太晚了,没时间帮你调代码,告诉你一个方法,你不要直接把控件往窗体上拖,你可以用代码动态创建,这样你就可以通过调试找BUG了,自己搞一下吧。
      

  8.   

    测试出报错的地方是
    procedure TCCTEdit.Change;
    的过程,当把change过程屏掉后,再往窗口上拖时就不再报错,请高手指教此处应该如何修改?
      

  9.   

    TFrmChangeDown  是个窗口类吗?FrmChangeDown.HWND:= Handle;   这句,你想干吗?Handle也可以乱赋值吗~~
      

  10.   


    HWND是定义的一个变量,在FrmChangeDown里发消息给TCCTEdit
      

  11.   

    建议在创建FrmChangeDown窗体的时候,给它指定一个Owner
      

  12.   

    应该就是FrmChangeDown没有父窗口导置的,改成这样应该可以吧:
    FrmChangeDown:= TFrmChangeDown.Create(Owner);
      

  13.   


    这段代码很成问题。
    在GetText消息中去设置Text,取Text。。