我做了一个由三个控件组成的控件,希望各位高手给我找找毛病 (200分)

  • 主题发起人 主题发起人 蔓草
  • 开始时间 开始时间

蔓草

Unregistered / Unconfirmed
GUEST, unregistred user!
我做了一个由三个控件组成的控件,但是放在我的程序里用的时候经常出现内存错误,
我想一定是我控件的原因,希望各位高手给我找找毛病,挑出毛病的我一定给200分
决不失言!我在程序里的一个窗体上大概放了10多个这样的控件,程序有时候运行出现内存错误,
有时候就是好的,到底是什么原因呢?
 
这个控件主要是类似combobox的 !还有一个自己的button
 
我都看昏了
 
这么多,我回去看看,最好把你的调用代码贴出来,有时是调用方法不对导致的错误的
 
我测试了一下,没有任何内存、资源泄露,一切正常
应该是你其他东西导致出错的。[:)]
 
我放了十多个控件后删除其中的一个出现这个错误“access violation at address 00000000
,Read of address FFFFFFFF。
 
procedure TMyComboBox.CreateWnd;
begin
下面这两句任意注释掉一句
inherited;
// inherited CreateWnd;
Windows.SetParent(Handle, 0);//设其Parent为桌面
CallWindowProc(DefWndProc, Handle, wm_SetFocus, 0, 0);
end;
改完后再测一下吧!
 
TO蔓草:
我根据你的功能重新写了一个TListEdit:
type
TListEdit = class(TCustomMemo)
private
FListEditPM: TListEditPM;
FButtonVisible: Boolean;
FButtonFlat: Boolean;
FOnButtonClick: TNotifyEvent;
FListString: TStrings;
procedure SetButtonVisible(const Value: Boolean);
procedure SetButtonBounds;
procedure SetButtonFlat(const Value: Boolean);
function GetButtonHint: string;
procedure SetButtonHint(const Value: string);
procedure WM_LBUTTONDBLCLK(var Msg: TWMMouse); message WM_LBUTTONDBLCLK;
procedure WM_KEYDOWN(var Msg: TWMKey); message WM_KEYDOWN;
procedure SetListString(const Value: TStrings);
procedure OnListItemSelect(const AStr: string);
function ShowHideSelectList: Boolean;
protected
FButton: TSpeedButton;
procedure BtnClickHandler(Sender: TObject); virtual;
procedure UpdateFormatRect;
procedure WMSize(var Msg: TWMSize); message WM_SIZE;
procedure WMSetCursor(var Msg: TWMSetCursor); message WM_SETCURSOR;
procedure CMEnabledChanged(var Msg: TWMNoParams); message CM_ENABLEDCHANGED;
procedure CreateHandle; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
published
property ButtonVisible: Boolean read FButtonVisible write SetButtonVisible default True;
property ButtonFlat: Boolean read FButtonFlat write SetButtonFlat;
property ButtonHint: string read GetButtonHint write SetButtonHint;
property ListString: TStrings read FListString write SetListString;
...
其中大部份代码是我以前写的现在正在用的一个控件中移过来的,所以BUG方面应该比较少
有兴趣的话告诉我EMAIL,给你发一份。[:)]
 
放了十多个控件后删除其中的一个出现这个错误“access violation at address 00000000
,Read of address FFFFFFFF。
以上问题很大的可能是你 CREATE后没有.DISCORTY.FREE
 
如果不开delphi6而直接运行程序,出现如下错误
应用程序错误,
0x0046e078指令引用的0x00f6148c内存。该内存不能为‘read’。

如果打开delphi6,在直接运行应用程序,没有错误,如果
不开delphi6,先运行一个delphi6编译的其他程序后,在运行程序,
则一切正常,到底是什么原因呢?
我调用控件的主要代码是
procedure Tfrmmain.CSJYSEnter(Sender: TObject);
begin
Tmylist(TWinControl(sender).Owner).listItems.Clear;
Tmylist(TWinControl(sender).Owner).listItems.AddStrings(ds.GetSheZhi(Tmylist(TWinControl(sender).Owner).dbname))//这里更新下拉矿内容;
end;

procedure Tfrmmain.csjysKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (key=38) or (key=40) then exit;
Tmylist(TWinControl(sender).Owner).Listitems.Clear;
Tmylist(TWinControl(sender).Owner).Listitems.Assign(ds.SZfill(Tmylist(TWinControl(sender).Owner).DbName,Tmylist(TWinControl(sender).Owner).Text));
end;
这个地方还有一个问题
procedure Tfrmmain.memeo1Exit(Sender: TObject);
begin
if activecontrol.Name<>mylisy1.name then////当焦点在mylisy1的时候,activecontrol.name等于'',不是mylist1,为什么?
panel2.Visible:=false;
end;

还有这个控件不能和combobox混用,否则出现问题!


 
蔓草的MAIL是 lazycat521@263.net。
 
各位富佬们,我是蔓草的朋友,我替她回答这个问题,大家快帮忙,谢谢了。
 
已发出,请查妹儿。
 
:xianjun:你的控件和我的有差别,当下拉框出现的时候,我控件的焦点是在text上的,
而你控件的焦点是在下拉框上的,但是还是非常感谢你,把你告诉我的那句该掉以后,
效果好多了,好象没有什么问题了!
 
好长啊,现在的美女不得了,好厉害哦
还“HKTools”?[:D]
 
问题解决了也不给加分! 这什么世道啊? [:D][:D][:D]
 
你在TMyComboBox.Create的时候留下了隐患。
TMyComboBox中的Private变量FEdit的Owner不是TMyComboBox,当你删除了TMyComboBox的时候
并没有删除那个FEdit,如果程序某个地方还用到FEdit的时候当然会出现Access voliation了。

constructor TMyComboBox.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FEdit:=TTestCombobox(AOwner);

ControlStyle:=ControlStyle + [csNoDesignVisible, csReplicatable,
csAcceptsControls];
Height:=70;
color:=clAqua;
Visible := False;
Parent:=TWinControl(AOwner);

end;
 
balaschen:
我想给我的控件增加一个setfocus,但是当我调用的时候焦点不是在text里,下拉框
也没有拉出来,应该怎么改?

大家有人知道吗?
 
加这么几句应该就可以了:
procedure SetFocus; override;

procedure Tmylist.SetFocus;
begin
inherited;
FText.ShowCombobox;
FText.SetFocus;
end;
 
后退
顶部