我的目的是动态创建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.

解决方案 »

  1.   

    改函数的参数定义为:
    procedure TForm1.CreateRoomType(var objTab:TsnTabSheet;
                                    var objLv:TListView;
                                    sName,sCaption,lName:string;RoomNum:Integer);即可。
      

  2.   

    楼主可现学一学 Pascal 里关于“实参”与“形参”的内容。
    书:郑启华老师的《Pascal 程序设计语言》
      

  3.   

    //同上,补充:动态数组下标是从0开始的,不是1~~
      for i:=Low(STabSheet) to High(STabSheet) do begin
      

  4.   

    好像不是这个问题. 对象作为常量参数传过去,仍然可以改变它的属性.
    何必这样....
    你的
    STabSheet:array of TSnTabSheet;
      SListView:array of TListView;都已经是全局变量了, 传个i过去就行了啊 ....
      

  5.   

    呵呵,楼上说的不太对。如果该成只传 i,CreateRoomType 函数的“封装”性就变弱
    了,呵呵,其实,这个函数完全可以从 TForm1 中拿出来作为一个独立的函数,对吧?
      

  6.   

    wilowind(无风雪亦飘) 兄似乎没注意到 CreateRoomType 其实是在向外传出对象?
      

  7.   

    zhengji(看雨飞) ( ) + zswang(伴水清清)(专家门诊清洁工) 
    以后程序正确,给分。