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

访问用PageControl封装的窗体变量报内存异常,请问高人

2012-09-15 
访问用PageControl封装的窗体变量报内存错误,请教高人我用PageControl封装窗体,当窗体创建后,再读取已创建

访问用PageControl封装的窗体变量报内存错误,请教高人
我用PageControl封装窗体,当窗体创建后,再读取已创建的窗体变量时报内存错误,下面是所有代码:

program ShowFormDemo;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2}

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1); //注意,这里只创建Form1,其它窗体动态创建,如果都先创建就不报错
  Application.Run;
end.


//下面是主窗体
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
  Button1: TButton;
  PageControl1: TPageControl;
  procedure Button1Click(Sender: TObject);
  private
  { Private declarations }
  public
  procedure ShowForm(AClass:TComponentClass;AForm:TForm);
  { Public declarations }
  end;

var
  Form1: TForm1;

implementation
uses Unit2,Unit3;
{$R *.dfm}
procedure TForm1.ShowForm(AClass:TComponentClass;AForm:TForm);//封装窗体的函数
var Tabsht: TTabSheet;
begin
  Tabsht := TTabSheet.Create(Application);
  Tabsht.PageControl:=PageControl1;
  application.CreateForm(AClass,AForm);
  AForm.Parent:=Tabsht;
  Tabsht.Tag:=Integer(AForm);
  AForm.BorderStyle:=bsNone;
  AForm.Align:=alClient;
  AForm.show;
  Tabsht.Caption:=AForm.Caption;
  PageControl1.ActivePage := Tabsht;
  Tabsht.Show;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowForm(TForm2,Form2);
  Form2.FVal:=100;//这里报错
end;
end.

//下面是Form2窗体
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm2 = class(TForm)
  private
  { Private declarations }
  public
  FVal:Integer;//只定义一个变量
  { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

end.
 
如果2个窗体在工程文件中都先创建好了,就不会报错,我怀疑在ShowForm(TForm2,Form2)后,Form2是局部变量,导致访问出错,可是我创建时用的application.CreateForm(AClass,AForm);它的owner应该是Application这个全局对象啊,怎么回出错呢,请高人指点,谢谢。

[解决办法]
请按下面代码修改:

Delphi(Pascal) code
......  public    { Public declarations }    procedure ShowForm(AClass:TComponentClass;var AForm:TForm);  end;var  Form1: TForm1;implementationuses Unit2,Unit3;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);var Fm2:TForm;begin  ShowForm(TForm2,Fm2);  TForm2(Fm2).FVal:=100;end;procedure TForm1.ShowForm(AClass: TComponentClass;var AForm: TForm);var Tabsht: TTabSheet;begin......end;......
[解决办法]
又或者这样改(但很明显,不符合你的用途):
Delphi(Pascal) code
......uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, ComCtrls, StdCtrls, Unit2, Unit3;......  public    { Public declarations }    procedure ShowForm(AClass:TComponentClass; var AForm:TForm2);  end;var  Form1: TForm1;implementation//uses Unit2,Unit3;{$R *.dfm}......procedure TForm1.ShowForm(AClass: TComponentClass; var AForm: TForm2);var Tabsht: TTabSheet;begin......end;...... 

热点排行