我该怎样定义?(0分)

  • 主题发起人 主题发起人 laolor
  • 开始时间 开始时间
L

laolor

Unregistered / Unconfirmed
GUEST, unregistred user!
我定义了一个类,
class Graph{
public:
TImage *Image1;
.....
}在mdi自窗口中调用
void __fastcall TMDIChild::FormCreate(TObject *Sender)
{
Graph *ThisGraph=new Graph;
Image1=ThisGraph->Image1;
size=5;
int i;
Image1->Canvas->Brush->Color=clWhite;//该行运行期间出错.
.....
}出错的那一行是在我新建一个mdi子窗口时出错的
错误窗口说:'Access violation at address 400732BC in molude 'VCL40.BPL'.Read of address FFFFFFFF'.
怎么办?
 
不太懂C++,不过可以试试:
TImage *Image1
改成
TImage Image1
 
请把完整的程序贴出来。
 
如果用c++的话,可能是指针的问题,
如没有初始化,
 
Image1=ThisGraph->Image1;这句的问题吧:-)
 
你试一下在Graph的构造函数中加上为Image1分配内存的语句。以下是我用Delphi编
的程序,没有抱错。
type
TGraph = class
public
Image1: TImage;
constructor Create;
overload;
end;
...
...
constructor TGraph.Create;
begin
inherited;
Image1 := TImage.Create(nil);
end;

procedure TForm2.FormCreate(Sender: TObject);
var
ThisGraph: TGraph;
begin
ThisGraph := TGraph.Create;
Image1 := ThisGraph.Image1;
Image1.Canvas.Brush.Color := clWhite;
end;
 
估计是Graph类创建的时候没有给Image1分配空间。
Graph *ThisGraph=new Graph;
ThisGraph->Image1 = new TImage(this);
Image1=ThisGraph->Image1;
这样就可以了。
只是,TImage上可以自己画吗?我以前是用PaintBox画的。
 
各位很快的手,
呵呵。
 
我不太懂C++,乘机学习学习 :-)
我总觉得下面语句
TImage *Image1;
定义了一个指向TImage的指针,那么后面
Image1->Canvas
这句话,有点想不通:指针有自己的Canvas吗?
帮我启蒙一下吧!
 
指针只要指向了一个实例,就可以用了。
Image1->Canvas 等价于(*Image1).Canvas
Image1是指针,*Image1就是指针指向的实例,
也就是一个TImage对象,TImage是有Canvas的。
laolor的问题就是它的Image1 = ThisGraph->Image1,
而ThisGraph->Image1没有分配空间,所以为NULL,
从而Image1也为NULL,这样,就没有Canvas可言了,
运行的时候调用Canvas,当然出错了。
 
这么说,C++里面的"."号和Delphi里面的是等价的了?
我还一直以为C++的"->"等价于Delphi的"."呢. :-)
 
呵呵,是啊。区别在于,Delphi的一些变量,你需要
Create才能用,而C++ 中,如果不是用指针,那么直
接就可以用。
比如这个例子:
C++:
Graph ThisGraph;
ThisGraph.Image1 = new TImage(this);
Delphi:
var
ThisGraph:Graph;
begin
ThisGraph := Graph.Create;
ThisGraph.Image := TImage.Create(Self);
...
end;

两者差别就在于C++ 中,如果不用指针,在定义的时候
就分配了内存,直接可以用了。Delphi必须要用Create
来创建。
 
o,多谢!
BTW:你收到我信了没有? 我把你要的文件上载到202.97.166.10/files/cgiexp5.zip了.
 
(打个响指)收到!
不过,这个地址不支持匿名登陆,呵呵。我已经给你回了一封信。
 
老兄!用http协议!这样写:
http://202.97.166.10/files/cgiexp5.zip
 
DreamTiger:下载完了写信告诉我.
 
下载结束,呵呵。多谢多谢。
 
各位大虾,为什么现在Image1不肯画网格了呢?本来可以的.
void __fastcall TMDIChild::FormCreate(TObject *Sender)
{
Graph *ThisGraph=new Graph;
ThisGraph->Image1 = new TImage(this);
Image1=ThisGraph->Image1;
size=5;
int i;
Image1->Canvas->Brush->Color=clWhite;
Image1->Canvas->Rectangle(0,0,Image1->Width,Image1->Height);
Image1->Canvas->Pen->Color=clBlack;
for(i=1;i<Image1->Height;i++){
Image1->Canvas->MoveTo(0,i*size);
Image1->Canvas->LineTo(Image1->Width,i*size);
Image1->Canvas->MoveTo(i*size,0);
Image1->Canvas->LineTo(i*size,Image1->Height);
}
}
 
TImage本身是会显示图象的,
你最初画的那些线条应该会被抹吧?
自己定义一个新类:
TMyImage=class(TImage)
然后重载Paint方法,
在Paint方法里写:
{
Inherited Paint;
//
你自己的画线代码
}
或者把你的画线代码放到Form的OnPaint事件中,
保证每次窗口重绘时都执行,试试看吧
 
蚯蚓,TMyImage=class(TImage)出错,
class TMyImage=class(TImage) 也出错.
 
后退
顶部