请卷起千堆雪回答,到现在为止还没人能解决(50分)

  • 主题发起人 主题发起人 涛子
  • 开始时间 开始时间

涛子

Unregistered / Unconfirmed
GUEST, unregistred user!
有一个软件可以画图,并且可以在图形上添加数据编辑区
然后存储,在调用这个图象的时候,数据编辑区显示的是一个编辑控件
他是如何实现的?
 
放一个image,上面再放个edit
有什么好说的?
 
>>>>>>>到现在为止还没人能解决
你说的不会是Windows的画笔程序吧?你别告诉我那不是编辑控件.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Image1: TImage;
procedure FormCreate(Sender: TObject);
procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
Uses JPEG;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Ctl3D:=False;
Image1.Picture.LoadFromFile('F:/Documents/JPG/Jpeg/322332.jpg');
Edit1.SetBounds(Image1.Left,Image1.Top,Edit1.Width,Edit1.Height);
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
Var P:TPoint;
begin
P:=Image1.ClientToParent(Point(x,y));
Edit1.SetBounds(P.x,P.Y,Edit1.Width,Edit1.Height);
end;

end.

 
to aizb
你说的并不是我所求的
但是我还是想把分给你了
我的问题是关于矢量图的绘制 和编辑
现在的问题是 :如何实现矢量图的 整体复制
你能回答
另一半分就是你的了
(或担供一部分代码也可以的)
 
接受答案了.
 
来听课。
 
to aizb
算了分己经全给了
你就再说一点吧?
或是提供一点代码
好吗?
 
所谓矢量图整体复制是想在自己的软件内存复制单个或多个矢量对象呢还是希望在不同的进程间复制?
如果是在自己的软件单个进程间复制,当然就简单了,就是新增相应个数的内存对象,并把你所选中的单
个或多个对象的矢量数据(比如说属性)复制一份至新增的对象上.
在多个对象进程间复制对象,可能就麻烦多了.具体的代码我不记得了,帮你找找!
 
为什么回复不了?
 
我现在不能回复了,贴几次都没贴上.
 
to aizb
我的email:zhouzhouhaitao@sina.com.cn
发我邮箱里
非常感激
我的是单个进程间复制
你能给我找一些这方面的资料吗?
最好是有源码的
举个例子: 现有一段线
----------
有一个参数框
我输入5(举例) 后面会依次出现4段
------------------------------------------------------------------(5段线相连)
请指点
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Spin;

type
TAPoint=Array of TPoint;
TLine=Class//线对象.
PointList:TAPoint;//线对象的点列表.
end;

TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
SpinEdit1: TSpinEdit;
Button3: TButton;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormPaint(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Button3Click(Sender: TObject);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
FStartLine:Boolean;
LineList:TList;
FPointList:TAPoint;
procedure ClearLine;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
LineList:=TList.Create; //创建列表保存对象.
FStartLine:=False; //是否在画线.
end;

procedure TForm1.ClearLine;//清除线对象.
Var i:Integer;
Line:TLine;
begin
For i:=LineList.Count-1 downto 0 do//释放每一个对象.
begin
Line:=LineList;
Line.Free;
LineList.Delete(i);
end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ClearLine;//先清除线对象.
LineList.Free;//释放列表.
end;

procedure TForm1.FormPaint(Sender: TObject);
Var i:Integer;
Line:TLine;
begin
For i:=0 to LineList.Count-1 do
begin
Line:=LineList;
Canvas.Polyline(Line.PointList);//画每一条线对象.
end;
if FStartLine then
begin
if High(FPointList)>=1 then
Canvas.Polyline(FPointList);//如果正在画线,则把未完成的线也画出来.
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
FStartLine:=True;
SetLength(FPointList,0); //开始画线清除临时线的点列表.
end;

procedure TForm1.Button2Click(Sender: TObject);
Var Line:TLine;
begin
FStartLine:=False;
if High(FPointList)>=1 then//如果已经有两个以上的点
begin
Line:=TLine.Create;//创建一个线对象.
SetLength(Line.PointList,0);//初始化线对象的点列表.
Line.PointList:=Copy(FPointList,0,Sizeof(TPoint)*(High(FPointList)+1));
//复制当前画好的临时点列表.
LineList.Add(Line);//把对象加入到列表.
Invalidate;//重画Form
end;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
Var Count:Integer;
begin
if FStartLine then//如果正在画线.
begin
Count:=High(FPointList)+1;
SetLength(FPointList,Count+1);
FPointList[Count]:=Point(x,y);//增加一个点.
Invalidate;
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
Var OldLine,NewLine:TLine;
i,j:Integer;
begin
if (SpinEdit1.Value>0) and (LineList.Count>0) then//如果需要复制数大于0并且已经存在一个以上的线条.
begin
OldLine:=LineList[LineList.Count-1];//取出旧线条.
For i:=0 to SpinEdit1.Value-1 do//复制需要的份数.
begin
NewLine:=TLine.Create;//创建新线条.
SetLength(NewLine.PointList,0);//初始化点列表.
NewLine.PointList:=Copy(OldLine.PointList,0,Sizeof(TPoint)*(High(OldLine.PointList)+1));
//复制点列表.
For j:=0 to High(NewLine.PointList) do//对点进行移位.
begin
NewLine.PointList[j].X:=NewLine.PointList[j].X+10;
NewLine.PointList[j].y:=NewLine.PointList[j].y+10;
end;
LineList.Add(NewLine);//加和到列表.
end;
Invalidate;//重画.
end;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if FStartLine and (High(FPointList)>=0) then//这种方法简单不过鼠标移动时会造成闪动.
begin
Invalidate;
Canvas.MoveTo(FPointList[High(FPointList)].x,FPointList[High(FPointList)].y);
Canvas.LineTo(x,y);
end;
end;

end.
 
后退
顶部