如何复制界面上的控件 (50分)

  • 主题发起人 主题发起人 godelphi2004
  • 开始时间 开始时间
G

godelphi2004

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在做了一个界面,是在界面画图的,这张图是由一些图元组成的,每一个图元就是一个动态生成的控件,由于相同的图元很多,所以我想实现可以复制的功能,一个图元的复制容易实现,但是我想连选多个同时复制,不知道这息样实现?
 
按住Shift再选取控件[:)]
 
直接用鼠标拉可以选定一个范围内的控件,控件在panel之类的上面时,按住ctrl键再拉。
 
先处理鼠标消息,记录下选定的控件,再复制即可。
 
我对处理消息懂得很少的,不知道怎么来做?

看来有些朋友误解我的意思的,我是想在运行的界面上操作的时候复制。
 
var
B:TButton;
Begin
B:=TButton.create(self);
b.assing(YourOldButton);
b.left:=12;//新位置
b.top:=12;//新位置
b.....//新属性如果需要
end;
 
那么如何来处理多选的问题?还有顺便问一下,当选中一个图元的时候,生成8个小黑点,这几个小黑点是画在图元上还是在界面上的?
 
图元上画方便点,不过你的图元外外围先不画(给图元留空间)
 
:((((((((((((((((((((((((((((((
 
这个问题真的这么难吗?为什么没有人回答?
 
其实这个问题并不难:
方法1:按住shift键,再逐一选取对象,然后按下ctrl+c就OK啦。
方法2:拖动鼠标选定对象范围,然后按下ctrl+c就OK啦。
如果还有问题,EmailTO:nathanxiao@163.com
 
你的动态创建的对象中加一个属性,是否选择,当复制时只要遍历对象,若IsSelected
得到他的类,对应类Create 一个对象,将刚创建的对象assign 原来的对象就可以了,当然你也可以将他的left top 分别加 4 让他有个错位
 
我做过和你一样要求的程序,是在界面上绘制公文,构成公文的所有元素都是自己开发的
控件,也实现了复制和粘贴的功能,给一段程序给你做参考。
下面的过程是用来拷贝控件,原理就是把选中的所有控件,重新创建到一个不可见的Panel
上(这里是panClipBoard,把它比作剪贴板),对于下面程序中Case语句中的每一个选择是
一种类型的控件,而比如:ulabel.Assign,是在编写每一个控件时定义好的一个函数,用来存储控件的位置以及所有属性等信息,以便实现粘贴。
procedure TfrmSetFormat.bCopyLabelClick(Sender: TObject);
var
i :Integer;
begin
// delete old object
for i:=panClipBoard.ControlCount-1 downto 0 do
panClipBoard.Controls.Free;
// Copy new object
for i:=panLabel.ControlCount-1 downto 0 do
if ComIsSelected(panLabel.Controls) then
case panLabel.Controls.Tag of
UicLabel: begin
ulabel := TUicExLabel.Create(panClipBoard);
ulabel.Parent := panClipBoard;
ulabel.Assign(panLabel.Controls);
end;
UicEdit: begin
uEdit := TUicExEdit.Create(panClipBoard);
uEdit.Parent := panClipBoard;
uEdit.Assign(panLabel.Controls);
end;
UicCombox: begin
uCombox := TUicExCombox.Create(panClipBoard);
uCombox.Parent := panClipBoard;
uCombox.Assign(panLabel.Controls);
end;
UicBtnEdit: begin
uBtnEdit := TUicExBtnEdit.Create(panClipBoard);
uBtnEdit.Parent := panClipBoard;
uBtnEdit.Assign(panLabel.Controls);
end;
UicRichEdit:begin
uRichEdit := TUicExRichEdit.Create(panClipBoard);
uRichEdit.Parent := panClipBoard;
uRichEdit.Assign(panLabel.Controls);
end;
UicMaskEdit:begin
uMaskEdit := TUicExMaskEdit.Create(panClipBoard);
uMaskEdit.Parent := panClipBoard;
uMaskEdit.Assign(panLabel.Controls);
end;
UicImage: begin
uimage := TUicExImage.Create(panClipBoard);
uimage.Parent := panClipBoard;
uimage.Assign(panLabel.Controls);
end;
UicPanLine: begin
uline := TUicExPanLine.Create(panClipBoard);
uline.Parent := panClipBoard;
uline.Assign(panLabel.Controls);
end;
UicShape: begin
ushape := TUicExShape.Create(panClipBoard);
ushape.Parent := panClipBoard;
ushape.Assign(panLabel.Controls);
end;
UicPanTable:begin
uTable := TUicExPanTable.Create(panClipBoard);
uTable.Parent := panClipBoard;
uTable.Assign(panLabel.Controls);
end;
end;
end;

以下是粘贴过程: panLabel是粘贴控件所处的容器
procedure TfrmSetFormat.bPasteLabelClick(Sender: TObject);
var
i :Integer;
begin
// Copy new object
for i:=panClipBoard.ControlCount-1 downto 0 do
case panClipBoard.Controls.Tag of
UicLabel: begin
ulabel := TUicExLabel.Create(panLabel);
ulabel.Parent := PanLabel;
ulabel.Design := true;
ulabel.Assign(panClipBoard.Controls);
end;
UicEdit: begin
uEdit := TUicExEdit.Create(panLabel);
uEdit.Parent := PanLabel;
uEdit.Design := true;
uEdit.Assign(panClipBoard.Controls);
end;
UicBtnEdit: begin
uBtnEdit := TUicExBtnEdit.Create(panLabel);
uBtnEdit.Parent := PanLabel;
uBtnEdit.Design := true;
uBtnEdit.Assign(panClipBoard.Controls);
end;
UicCombox: begin
uCombox := TUicExCombox.Create(panLabel);
uCombox.Parent := PanLabel;
uCombox.Design := true;
uCombox.Assign(panClipBoard.Controls);
(uCombox.Controls[0] as TUicCombobox).Left := 5;
(uCombox.Controls[0] as TUicCombobox).Top := 5;
(uCombox.Controls[0] as TUicCombobox).Width := uCombox.Width-10;
(uCombox.Controls[0] as TUicCombobox).Height := 20;
end;
UicRichEdit:begin
uRichEdit := TUicExRichEdit.Create(panLabel);
uRichEdit.Parent := PanLabel;
uRichEdit.Design := true;
uRichEdit.Assign(panClipBoard.Controls);
uRichEdit.Images := ToolbarImages;
end;
UicMaskEdit:begin
uMaskEdit := TUicExMaskEdit.Create(panLabel);
uMaskEdit.Parent := PanLabel;
uMaskEdit.Design := true;
uMaskEdit.Assign(panClipBoard.Controls);
end;
UicImage: begin
uimage := TUicExImage.Create(panLabel);
uimage.Parent := PanLabel;
uimage.Design := true;
uimage.Assign(panClipBoard.Controls);
end;
UicPanLine: begin
uline := TUicExPanLine.Create(panLabel);
uline.Parent := PanLabel;
uline.Design := true;
uline.Assign(panClipBoard.Controls);
end;
UicShape: begin
ushape := TUicExShape.Create(panLabel);
ushape.Parent := PanLabel;
ushape.Design := true;
ushape.Assign(panClipBoard.Controls);
end;
UicPanTable:begin
uTable := TUicExPanTable.Create(panLabel);
uTable.Parent := PanLabel;
uTable.Design := true;
uTable.Assign(panClipBoard.Controls);
end;
end;
end;
 
TO 传呼机

我的控件除了TMEMO外都是继承自TGRAPHICCONTROL的,我找不到方法来画选中时出现的8个黑点,能否告之?谢谢!

TO:jdsky
谢谢你的源码,我会研究一下的。
 
画选中的黑点
procedure WmNcHitTest(var Msg: TWmNcHitTest); message wm_NcHitTest;

procedure TCustomUicExControl.WmNcHitTest(var Msg: TWmNcHitTest);
var
Pt: TPoint;
i: Integer;
begin
if FSelected then
begin
Pt := Point (Msg.XPos, Msg.YPos);
Pt := ScreenToClient (Pt);
Msg.Result := 0;
for i := 1 to 8 do
if PtInRect (FRectList , Pt) then
Msg.Result := FPosList ;
if Msg.Result = 0 then
inherited;
end
else
inherited;
end;
 
To: jdSky

你写的这个画黑点的代码是写在控件里还是在和程序里的?我的时间有点紧,后天老板就要了,但是这个问题还没有解决,你的这二段源码我看了,但是有些地方我还是不太明白,你什么时候有空,能不能跟你请教请教。
 
从GraphControl下来的话也可以,不过麻烦,将控件的空间划分几个区域, 用TCanvas,
封装一个方法得到mouse地位置在那个区域,对应作相应的操作,放大拖拽
不过网上有专门处理动态移动,resize对象的空间,你可以搜一下,我以前见过
 
谢谢传呼机,其实放大移动我都已经解决了,只是没有黑点,我找到了一种方法,但是调试的过程中发现有问题,一下子又找不到问题出在那里:((
 
黑点的问题我已经差不多解决了,但是复制的问题还没有,我想在自定义的控件里加个assign属性,但是我不知道如何来在控件中写这个函数,我看是看了一些源码,但是有点懂又不全懂,有人写过吗?
 
可以,随时可以探讨
画黑点的程序是现在控件里面,即TCustomUicExControl类里面
 
后退
顶部