我的目的是动态创建PageControl的TabSheet,和放在TabSheet上的ListView
一个TabSheet一个ListView
然后在动态创建ListView.Items.Add;
我写了两个函数
一个是创建TabSheet和ListView的CreateRoomType
一个是创建ListView下的Item的CreateRoom
问题出来了
当在CreateRoomType中调用CreateRoom的话程序没有问题,(如下面程序)。。
在分开调用的时候程序出错,编译通过,但运行不起来。。(注释掉部分)
请高手指点。。
放两天结贴,谢谢。
-------------源程序如下----------------
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, SnPageControl, Menus, SnPopupMenu, ImgList, ComCtrls,
SnListView;type
TForm1 = class(TForm)
PageCon1: TSnPageControl;
ImageList1: TImageList;
PopupMenu1: TSnPopupMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
N10: TMenuItem;
procedure CreateRoomType(objTab:TsnTabSheet;objLv:TListView;sName,sCaption,lName:string;RoomNum:Integer);
procedure CreateRoom(RoomName:String;ParentObj:TListView);
procedure FormCreate(Sender: TObject);
//procedure CreateGuestMenu(Name,SFZH:String);
//procedure CreateSubMenu(Sender:TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
STabSheet:array of TSnTabSheet;
SListView:array of TListView;
sMenuItem:array of TMenuItem;
xMenuItem:array of TMenuItem;implementation{$R *.dfm}procedure TForm1.CreateRoomType(objTab:TsnTabSheet;objLv:TListView;sName,sCaption,lName:string;RoomNum:Integer);
var i:integer;
begin
objTab:=TSnTabSheet.Create(self);
objTab.Name:=sName;
objTab.Caption:=sCaption;
objTab.Width:=PageCon1.Width;
objTab.Height:=PageCon1.Height;
objTab.PageControl:=PageCon1;
objLv:=TListView.Create(self);
objLv.Name:=lName;
objLv.LargeImages:=ImageList1;
objLv.PopupMenu:=PopupMenu1;
objLv.Width:=objTab.Width;
objLv.Height:=objTab.Height;
objLv.BorderStyle:=bsnone;
objLv.Parent:=ObjTab;
for i:=0 to (RoomNum-1) do begin
CreateRoom(InttoStr(i),objLv);
end;
end;procedure TForm1.CreateRoom(RoomName:string;ParentObj:TListView);
begin
ParentObj.Items.Add;
end;procedure TForm1.FormCreate(Sender: TObject);
var i,s:integer;
begin
SetLength(STabSheet,5);
SetLength(SListView,5);
for i:=1 to 5 do begin
CreateRoomType(STabSheet[i],SListView[i],'TabSheet'+InttoStr(i),InttoStr(i)+'楼','ListView'+InttoStr(i),20);
//for s:=0 to 19 do begin
// CreateRoom(InttoStr(s),SListView[i]);
//end;
end;
PageCon1.ActivePage:=StabSheet[1];
//STabSheet[1].Show;
end;end.
一个TabSheet一个ListView
然后在动态创建ListView.Items.Add;
我写了两个函数
一个是创建TabSheet和ListView的CreateRoomType
一个是创建ListView下的Item的CreateRoom
问题出来了
当在CreateRoomType中调用CreateRoom的话程序没有问题,(如下面程序)。。
在分开调用的时候程序出错,编译通过,但运行不起来。。(注释掉部分)
请高手指点。。
放两天结贴,谢谢。
-------------源程序如下----------------
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, SnPageControl, Menus, SnPopupMenu, ImgList, ComCtrls,
SnListView;type
TForm1 = class(TForm)
PageCon1: TSnPageControl;
ImageList1: TImageList;
PopupMenu1: TSnPopupMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
N10: TMenuItem;
procedure CreateRoomType(objTab:TsnTabSheet;objLv:TListView;sName,sCaption,lName:string;RoomNum:Integer);
procedure CreateRoom(RoomName:String;ParentObj:TListView);
procedure FormCreate(Sender: TObject);
//procedure CreateGuestMenu(Name,SFZH:String);
//procedure CreateSubMenu(Sender:TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
STabSheet:array of TSnTabSheet;
SListView:array of TListView;
sMenuItem:array of TMenuItem;
xMenuItem:array of TMenuItem;implementation{$R *.dfm}procedure TForm1.CreateRoomType(objTab:TsnTabSheet;objLv:TListView;sName,sCaption,lName:string;RoomNum:Integer);
var i:integer;
begin
objTab:=TSnTabSheet.Create(self);
objTab.Name:=sName;
objTab.Caption:=sCaption;
objTab.Width:=PageCon1.Width;
objTab.Height:=PageCon1.Height;
objTab.PageControl:=PageCon1;
objLv:=TListView.Create(self);
objLv.Name:=lName;
objLv.LargeImages:=ImageList1;
objLv.PopupMenu:=PopupMenu1;
objLv.Width:=objTab.Width;
objLv.Height:=objTab.Height;
objLv.BorderStyle:=bsnone;
objLv.Parent:=ObjTab;
for i:=0 to (RoomNum-1) do begin
CreateRoom(InttoStr(i),objLv);
end;
end;procedure TForm1.CreateRoom(RoomName:string;ParentObj:TListView);
begin
ParentObj.Items.Add;
end;procedure TForm1.FormCreate(Sender: TObject);
var i,s:integer;
begin
SetLength(STabSheet,5);
SetLength(SListView,5);
for i:=1 to 5 do begin
CreateRoomType(STabSheet[i],SListView[i],'TabSheet'+InttoStr(i),InttoStr(i)+'楼','ListView'+InttoStr(i),20);
//for s:=0 to 19 do begin
// CreateRoom(InttoStr(s),SListView[i]);
//end;
end;
PageCon1.ActivePage:=StabSheet[1];
//STabSheet[1].Show;
end;end.
procedure TForm1.CreateRoomType(var objTab:TsnTabSheet;
var objLv:TListView;
sName,sCaption,lName:string;RoomNum:Integer);即可。
书:郑启华老师的《Pascal 程序设计语言》
for i:=Low(STabSheet) to High(STabSheet) do begin
何必这样....
你的
STabSheet:array of TSnTabSheet;
SListView:array of TListView;都已经是全局变量了, 传个i过去就行了啊 ....
了,呵呵,其实,这个函数完全可以从 TForm1 中拿出来作为一个独立的函数,对吧?
以后程序正确,给分。