编译程序时,在下短代码出错了,还没完成主窗体创建.错误如下 
Project GIS.exe raised exception class EAccessViolation with message´Access violation at address 00478ac9 in module ´GIS.EXE´.Read address FFFFFFF´.     
先说明主要是显示了子窗体中Map的信息,头痛呀 unit addlayerinfo; interface uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, StdCtrls,MapXLib_TLB, ComObj; type 
  Tlayerform = class(TForm) 
    layerListBox: TListBox; 
    Label1: TLabel; 
    addinfo: TButton; 
    Button1: TButton; 
    procedure FormCreate(Sender: TObject); 
    procedure addinfoClick(Sender: TObject); 
    procedure Button1Click(Sender: TObject); 
  private 
    { Private declarations } 
  public 
    { Public declarations } 
  end; var 
  layerform: Tlayerform;   currentmap:TMap; 
implementation uses GisGroup, layerstruce, MdiChild; {$R *.dfm} procedure Tlayerform.FormCreate(Sender: TObject); 
var 
  lyr:mapxlib_tlb.layer; 
  i:integer; 
begin 
  currentmap := (ActiveMdiChild as TMapwin).Map1; //运行到这报错 
  layerListBox.Clear; 
  for i:=1 to currentmap.Layers.Count do 
  begin 
    lyr:=currentmap.layers.item(i); 
    layerListBox.items.Add(lyr.Name); 
  end; 
end; procedure Tlayerform.addinfoClick(Sender: TObject); 
begin 
  addinfolayer.show; 
end; procedure Tlayerform.Button1Click(Sender: TObject); 
begin 
  close; 
end; end. 

解决方案 »

  1.   

    procedure Tlayerform.FormCreate(Sender: TObject); 
    var 
      lyr:mapxlib_tlb.layer; 
      i:integer; 
    begin 
      currentmap := (ActiveMdiChild as TMapwin).Map1; //运行到这报错 
      layerListBox.Clear; 
      for i:=1 to currentmap.Layers.Count do 
      begin 
        lyr:=currentmap.layers.item(i); 
        layerListBox.items.Add(lyr.Name); 
      end; 
    end; 
    你把上这段代码写在FORM的ONSHOW事件中看一看?
      

  2.   

    楼主也在做mapx开发?我们可以交流一下啊我建了一个普通工程试了一下你这个问题,没有错误。可能是你那个子窗体还没有创建,map1也没有创建,所以引用时就报错了。----------------------------------------------
                       riff ur life
      

  3.   

    把这段代码转到主窗体,问题OK,(当然我在主窗体中加多了一个listbox,加了一个命令按钮)但是这段代码在另一窗体中(不是子窗体,而这一窗体,我想让它显示子窗体中Map的信息),通过父窗体调用就出错了,
      

  4.   

    tweety,我的子窗体和map1都是创建了的,并且是加了一个GeoSet,但是一运行就报错,错误提示如上.难得在这里碰上你,以前我用vb,现在刚转用Delphi,很多问题需要解决呀.
      

  5.   

    你还要确保你的这个layerform创建了。我按你的说法测试了一下,map1放在主窗体form1,form2定义一个tmap的变量,在form2的oncreate事件中将map1赋给这个变量,没有任何错误。
    ----------------------------------------------
                       riff ur life
      

  6.   

    其实这段代码实在编译时就出错了,自然子窗体及Map都没建立,但是可通过.
      

  7.   

    问题出在这一句上(ActiveMdiChild as TMapwin),改为
    currentmap:=(form1.activeMDIChild as Tmapwin).map1
    就可以了。form1是你的主窗体
    ----------------------------------------------
                       riff ur life
      

  8.   

    layerform是在运行中调用的,本身调用没问题,我的Map是放置于子窗体上的,我是在想layerform 与子窗体之间是不是产生了什么问题.你试着把Map放与子窗体上,在form2种添加以上代码试试.
      

  9.   

    你有QQ吗?看来我的Delphi还要恶补才行了,我在试试看
      

  10.   

    我就是按你的说法测试的,因为你的layerform本身并不是MDI窗体,你直接写(ActiveMdiChild as TMapwin),那么程序就直接找layerform的MDIchild了,可是并不存在,自然就报错了。如果这段代码放在主窗体单元里,当然就不会出错。所以应该写成(form1.activeMDIChild as Tmapwin)
    ----------------------------------------------
                       riff ur life
      

  11.   

    我一般不开QQ的,我们可以通过MSN或者邮件交流一下。MSN:[email protected]邮件:[email protected]声明一下,我可是菜鸟一只,可能会反过来问你很多问题哦:)
    ----------------------------------------------
                       riff ur life
      

  12.   

    delphi中不同于C++,声明一个对象只是声明了一个对象的引用。对象并不存在,如果要访问这个对象先要Create他。否则会报非法访问错误。
      

  13.   

    我开始的想法也同楼上,认为应该先创建currentmap,但是经过我实际的测试,确实不需要,可以正确的访问。
    有谁能解释一下为什么这里不需要写Currentmap:=Tmap.create么?
    ----------------------------------------------
                       riff ur life
      

  14.   

    又做了一个小测试,我发现如果不创建Currentmap而直接赋值的话,Currentmap得到的实际是一个指向map1的指针,对currentmap的操作实际上就是对map1的操作。
    ----------------------------------------------
                       riff ur life
      

  15.   

    不能在create中写这样的代码。
      

  16.   

    楼上说话最好负责一点
    ----------------------------------------------
                       riff ur life
      

  17.   

    要是那样的话,直接赋植和map:=tmapcreate;后者是不是要占用更多的资源