首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

动态创建编辑控件和释放的有关问题,代码如下

2012-02-07 
动态创建编辑控件和释放的问题,代码如下.unit Unit1interfaceusesWindows, Messages, SysUtils, Variants

动态创建编辑控件和释放的问题,代码如下.
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,消息可能还在循环,就出现访问对象地址错误。
[解决办法]
有点意思,继续关注一下。
估计所有可录入控件都存在此问题?

热点排行