mylist中动态的创建的对象如何事先定义他的方法?(100分)

  • 主题发起人 主题发起人 aac
  • 开始时间 开始时间
A

aac

Unregistered / Unconfirmed
GUEST, unregistred user!
我做的是一个画图软件,画一个线条后存入mylist显示。但我要在运行时改变线条的形状
就象photoshop一样可以再改变长度等。但我在程序中写入相关处理时,编译时却说此对
象不存在(因为确定还没建立呀,动态创建的嘛),请问如何解决这个问题。
 

Type
Rline=Record
LineNo:Integer;
Long:Integer;
Color:Tcolor;
Width:Integer;
end;
TheLine:RLine;
先将画线条的情况记录下来
TheLine.Long:=18;
TheLine.Width:=1;
TheLine.Color:=clRed;
TheLine.LineNo:=你指定的任何数
存入MyList
MyList.Add(@Theline);
每次画的时候根据以上数据来创建线条对象
但一定要先创建,后引用
要更改线条时,根据LineNo来决定改那一根

 
对不起,我还是不明白如何更改呀。
-----------------------------------------
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls,

//加入extctrls单元(因为TShape被定义在此单元中
extctrls;

type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
Label1: TLabel;
LabelFormXY: TLabel;
Label2: TLabel;
LabelShapeXY: TLabel;
Label3: TLabel;
Label4: TLabel;
LabelWhich: TLabel;
LabelShapeCount: TLabel;
Button1: TButton;
Edit1: TEdit;
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
MyList : TList; //宣告一个TList物件,是用来装TShape物件的

Flag, //Form是否进入划图状态的变数
varX, //记录画图的第一点座标
varY,
varX2, //记录画图的第二点座标
varY2:Integer;

ShapeFlag, //TShape是否进入移动状态的变数
varShapeX, //记录移动TShape的第一点座标
varShapeY:Integer;
www:TShape;
//自行宣告MouseDown、MouseMove及MouseUp三个滑鼠事件
procedure MyMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure MyMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure MyMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}
procedure TForm1.MyMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
//1.显示目前所按下的MyShape是第几个
LabelWhich.Caption:=IntToStr(MyList.IndexOf(Sender)+1);

//2.将此座标加以显示给使用者看
LabelShapeXY.Caption:='X='+IntToStr(X)+',Y='+IntToStr(Y);

//3.设定此物件进入移动状态
ShapeFlag:=1;

//4.记录第一点座标
varShapeX:=X;
varShapeY:=Y;

//5.将此物件带到最前面
(Sender as TShape).BringToFront;
edit1.Text:=(Sender as TShape).Name ;
end;

procedure TForm1.MyMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
//假如此物件处于被移动的状态则改变其位置
if ShapeFlag = 1 then
begin
(Sender as TShape).Top := (Sender as TShape).Top + Y - varShapeY;
(Sender as TShape).Left:= (Sender as TShape).Left + X - varShapeX;
end;
end;

procedure TForm1.MyMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
//结束物件的移动状态
if ShapeFlag = 1 then ShapeFlag:=0;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
//设定Form进入划图状态的指标
Flag:=1;

//记录使用者所按下的第一点座标
varX:=X;
varY:=Y;

//将此座标加以显示给使用者看
LabelFormXY.Caption:='X='+IntToStr(X)+',Y='+IntToStr(Y);

//对用来记录使用者按下第二点的座标变数加以初值设定
varX2:=X;
varY2:=Y;
end;


procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
//假如Form进入划图状态,则划出虚框图样
if Flag = 1 then
begin
//1.先将原先的图样加以清除
//1.1将划笔颜色设为Form的Color
Canvas.Pen.Color := color;

//1.2划出一个方形,参数为第一点及第二点的座标
Canvas.Rectangle(varX, varY, varX2, varY2);

//2.再划出最新的图样,颜色为红色
canvas.Pen.Color := clRed;
Canvas.Rectangle(varX, varY, X, Y);

//3.更新第二点座标
varX2:=X;
varY2:=Y;

//4.将此座标加以显示给使用者看
LabelFormXY.Caption:='X='+IntToStr(X)+',Y='+IntToStr(Y);

end;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
MyShape : TShape;
begin
//假如Form进入划图状态,则Create真正的物件
if Flag = 1 then
begin
//1.将Form的划图状态设为False
Flag:=0;

//2.清除原先的图样
Canvas.Pen.Color := color;
Canvas.Rectangle(varX, varY, X, Y);

//3.当使用者指定的范围大于40*40
if (abs(varX - varX2) > 20) and (abs(varY - varY2) > 20) then
begin
//3.1建立一个TShape物件
MyShape := TShape.Create(self);

//3.2指定此物件的Parent为Form1,否则无法正确显示
MyShape.Parent:=Self;

//3.3指定此物件与滑鼠有关的事件
MyShape.onMouseDown:=MyMouseDown;
MyShape.onMouseMove:=MyMouseMove;
MyShape.onMouseUp:=MyMouseUp;

//3.4设定此物件的长、宽
MyShape.width := Abs(varX - varX2);
MyShape.Height:= Abs(varY - varY2);

//3.5决定此物件的位置,由于使用所划出的座标有多种状况,故需要加以判断
if (varX < varX2) and (varY < varY2) then
begin
MyShape.Top := varY;
MyShape.Left := varX;
end
else if (varX > varX2) and (varY > varY2) then
begin
MyShape.Top := varY2;
MyShape.Left := varX2;
end
else if (varX < varX2) and (varY > varY2) then
begin
MyShape.Top := varY2;
MyShape.Left := varX;
end
else if (varX > varX2) and (varY < varY2) then
begin
MyShape.Top := varY;
MyShape.Left := varX2;
end;
MyShape.Name:='www';
//3.6将此物件加入MyList中
MyList.Add(MyShape);

//3.7显示目前共有几个MyShape的讯息
LabelShapeCount.Caption:=IntToStr(MyList.Count);
end;

//4.将已经存在的MyShape物件加以重画(repaint)
Repaint;

end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
//设定划笔的颜色及样式
Canvas.Pen.Color := clRed;
Canvas.Pen.Style := psDashDot;

//建立TList物件
MyList:=TList.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
//将MyList物件加以Free
MyList.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);

begin

//if Assigned(www) then
//begin
www.name:='ssss1';
www.Width:=www.Width+50;
// end;


end;

end.
 
在程序中应把画的部分封装成一个部分
输入图的结构,通过画的对象就可以做画了
更改的只是图形的结构如Line 的Long属性,然后再传给画的部分画就可以了

多Design,少Coding
 
TList其中就是一個動態的鏈表,每次加入的元素都是一個動態分配的內存空間地址,所以
動態操作的時候,用指針是比較容易的:),例子(你的程序)
Type
TRline=Record
LineNo:Integer;
Long:Integer;
Color:Tcolor;
Width:Integer;
end;
PTRLine = TRline^;

{ 新增的時候 }
var pRline : PTRLine;
begin
{ 分配新的內存空間 }
new( pPline );

{ ===== 賦值 ======= }TheLine.Long:=18;
pPline^.Width:=1;
pPline^.Color:=clRed;
pPline^.LineNo:= 12445;

{ 存入鏈表 }
myList.Add( pPline );
end;

{ ==== 修改的時候 ============= }
var pPline : PTRLine;
i : integer;
begin
if ( myList = nli ) or ( myList.Count = ) then exit;

for i := 0 to myList.Count - 1 do begin
if ( PTRLine( myList.Items)^.LineNo = xxxx ) then begin
{ 修改代碼 , 然後退出 }
break;
end;
end;
end;

 
多人接受答案了。
 
后退
顶部