动态创建编辑控件和释放的问题,代码如下.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, IniFiles, StdCtrls;
type
TForm1 = class(TForm)
ScrollBox1: TScrollBox;
Button1: TButton;
procedure FormShow(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure Button1Click(Sender: TObject);
private
lst: TList;
procedure CreateEdit;
procedure ClearEdit;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
//清除
procedure TForm1.ClearEdit;
begin
if Assigned(lst) then
begin
while lst.Count > 0 do
begin
TLabeledEdit(lst.Items[0]).Free;
lst.Delete(0);
end;
FreeAndNil(lst);
end;
end;
//创建
procedure TForm1.CreateEdit;
var
lb: TLabeledEdit;
i: integer;
begin
lst := TList.Create;
for I := 0 to 100 do
begin
lb := TLabeledEdit.Create(nil);
lb.Name := 'test' + IntToStr(i);
lb.Top := i * 40 + 20;
lb.Left := 10;
lb.Visible := True;
lb.Parent := ScrollBox1;
lst.Add(lb);
end;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
CreateEdit;
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_F1 then
begin
ClearEdit;
CreateEdit;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ClearEdit;
CreateEdit;
end;
窗口启动后将光标停留在动态创建的编辑框内,按F5,结果会连续出现两次AV错误,之后就没有,如果光标不在编辑框内则不会报AV错误.不知道什么原因.
[解决办法]
在Delphi的早期版本中确实有这个问题,
我试了下,Delphi5会AV错误,在Delphi2007下没有这个问题了
[解决办法]
在delphi 2006 下面也没有问题.
这样改下试试, 把 CreateEdit 从 FormShow放到 FormCreate 事件中
另外CreateEdit 代码改成这样试试
procedure TForm1.CreateEdit;
var
lb: array[0..100] of TLabeledEdit;
I: integer;
begin
lst := TList.Create;
for I := 0 to 100 do begin
lb[I] := TLabeledEdit.Create(nil);
lb[I].Name := 'Test' + Trim(IntToStr(I));
lb[I].Top := I * 40 + 20;
lb[I].Left := 10;
lb[I].Visible := True;
lb[I].Parent := ScrollBox1;
lst.Add(lb[I]);
end;
end;
[解决办法]
在Form上方置一个Edit控件,焦点落在其中,按F1调用ClearEdit;CreateEdit; 就不会出错。
猜想问题所在是因为焦点落在 TLabeledEdit 对象里头,一直触发 CN_COMMAND
procedure CNCommand(var Message: TWMCommand); message CN_COMMAND;
procedure TCustomEdit.CNCommand(var Message: TWMCommand);
begin
if (Message.NotifyCode = EN_CHANGE) and not FCreating then Change;
end;
对象被 Free,消息可能还在循环,就出现访问对象地址错误。
[解决办法]
有点意思,继续关注一下。
估计所有可录入控件都存在此问题?