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.
--------------------------------------------------------------------
不知道问题出在哪,请高手帮助
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.
--------------------------------------------------------------------
不知道问题出在哪,请高手帮助
给控件赋值一个父窗体
var
AButton:TButton;
begin
AButton:=TButton.Create(self);
AButton.Parent:=Form1;
.....
.....
.....
end;
constructor Create(AOWner : TComponent); override;
constructor TCCTEdit.Create(AOWner: TComponent);
begin
inherited Create(AOWner);
end;
WM_GetFocus是什么消息?
Messages单元里貌似没有这个消息
procedure TCCTEdit.Change;
的过程,当把change过程屏掉后,再往窗口上拖时就不再报错,请高手指教此处应该如何修改?
HWND是定义的一个变量,在FrmChangeDown里发消息给TCCTEdit
FrmChangeDown:= TFrmChangeDown.Create(Owner);
这段代码很成问题。
在GetText消息中去设置Text,取Text。。