一个非常麻烦的问题

JiRen 2000-01-07 01:43:00
如何在程序运行时批量选中窗体上的控件,就象在设计时一样
能够实现所选中的控件同时改变大小,位置
注意:是选中不止一个控件...
希望大侠们指点...
email :jiren0202@sina.com


...全文
396 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
JiRen 2000-01-10
  • 打赏
  • 举报
回复
yhlong:
多谢大俠
那么实现在每个被选中的按钮上画四个小灰块有什么高招没有.


yhlong 2000-01-10
  • 打赏
  • 举报
回复
我有一个大概思路:1通过检测鼠标按下和释放的x/y坐标确定在form中拖动的范围;2通过form的control属性遍历form上的所有控件,由控件的top/left属性和鼠标拖动范围来确定所选定的一批控件;3监控键盘的方向键,对选定控件的高/宽按比例更改。

JiRen 2000-01-10
  • 打赏
  • 举报
回复
hubdog 大侠:
我的要求当然包括拉出一个框来选中一批控件,不然怎么像设计时一样呢..
请指点高招!!
Firing_Sky 2000-01-10
  • 打赏
  • 举报
回复
这里有一段在一个控件上画点并实现控件移动的代码,选择多个控件的方法可以此类推,鉴于代码过长,这儿就不给出了,但值得注意的一点是:不仅要搜索form的control,还要搜索Panel等控件的control

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Panel1: TPanel;
Image2: TImage;
Image1: TImage;
procedure Button1Click(Sender: TObject);
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
DragFlag: Boolean ;
OriginPt, EndPt: TPoint ;
procedure AttachControl(ImageList: TImage);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.AttachControl(ImageList: TImage);
var
ScreenDC: HDC ;
PtA, PtB: TPoint ;
begin
ScreenDC := GetDC(0) ;
PtA := ImageList.ClientToScreen(Point(0, 0)) ;
PtB := ImageList.ClientToScreen(Point(Image1.Width, Image1.Height)) ;
Rectangle(ScreenDC, PtA.X-2, PtA.Y-2, PtA.X+3, PtA.Y+3) ;
Rectangle(ScreenDC, (PtA.X+(PtB.X-PtA.X) div 2)-2, PtA.Y-2,
(PtA.X+(PtB.X-PtA.X) div 2)+3, PtA.Y+3) ;
Rectangle(ScreenDC, PtB.X-3, PtA.Y-3, PtB.X+2, PtA.Y+2) ;
Rectangle(ScreenDC, PtA.X-2, (PtA.Y+(PtB.Y-PtA.Y) div 2)-2,
PtA.X+3, (PtA.Y+(PtB.Y-PtA.Y) div 2)+3) ;
Rectangle(ScreenDC, PtB.X-3, (PtA.Y+(PtB.Y-PtA.Y) div 2)-2,
PtB.X+2, (PtA.Y+(PtB.Y-PtA.Y) div 2)+3) ;
Rectangle(ScreenDC, PtA.X-2, PtB.Y-2, PtA.X+3, PtB.Y+3) ;
Rectangle(ScreenDC, (PtA.X+(PtB.X-PtA.X) div 2)-2, PtB.Y-2,
(PtA.X+(PtB.X-PtA.X) div 2)+3, PtB.Y+3) ;
Rectangle(ScreenDC, PtB.X-3, PtB.Y-3, PtB.X+2, PtB.Y+2) ;
ReleaseDC(0, ScreenDC) ;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
AttachControl(Image1) ;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
ScreenDC: HDC ;
PtA, PtB: TPoint ;
begin
DragFlag := True ;
OriginPt.X := X ; OriginPt.Y := Y ;
EndPt := OriginPt ;
ScreenDC := GetDC(0) ;
PtA := Image1.ClientToScreen(Point(0, 0)) ;
PtB := Image1.ClientToScreen(Point(Image1.Width, Image1.Height)) ;
DrawFocusRect(ScreenDC, Rect(PtA.X, PtA.Y, PtB.X, PtB.Y)) ;
ReleaseDC(0, ScreenDC) ;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
ScreenDC: HDC;
PtA, PtB: TPoint ;
begin
if DragFlag then
begin
ScreenDC := GetDC(0) ;
PtA := Image1.ClientToScreen(Point((EndPt.X - OriginPt.X),
(EndPt.Y - OriginPt.Y))) ;
PtB := Image1.ClientToScreen(Point((EndPt.X - OriginPt.X + Image1.Width),
(EndPt.Y - OriginPt.Y + Image1.Height))) ;
DrawFocusRect(ScreenDC, Rect(PtA.X, PtA.Y, PtB.X, PtB.Y)) ;
EndPt.X := X ; EndPt.Y := Y ;
PtA := Image1.ClientToScreen(Point((EndPt.X - OriginPt.X),
(EndPt.Y - OriginPt.Y))) ;
PtB := Image1.ClientToScreen(Point((EndPt.X - OriginPt.X + Image1.Width),
(EndPt.Y - OriginPt.Y + Image1.Height))) ;
DrawFocusRect(ScreenDC, Rect(PtA.X, PtA.Y, PtB.X, PtB.Y)) ;
ReleaseDC(0, ScreenDC) ;
end ;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
ScreenDC: HDC ;
PtA,PtB:TPoint;
begin
ScreenDC := GetDC(0) ;
PtA := Image1.ClientToScreen(Point((EndPt.X - OriginPt.X),
(EndPt.Y - OriginPt.Y))) ;
PtB := Image1.ClientToScreen(Point((EndPt.X - OriginPt.X + Image1.Width),
(EndPt.Y - OriginPt.Y + Image1.Height))) ;
DrawFocusRect(ScreenDC, Rect(PtA.X, PtA.Y, PtB.X, PtB.Y)) ;
ReleaseDC(0, ScreenDC) ;
DragFlag := False ;
EndPt.X := X ; EndPt.Y := Y ;
Image1.Left := Image1.Left + (EndPt.X - OriginPt.X) ;
Image1.Top := Image1.Top + (EndPt.Y - OriginPt.Y) ;
if Image1.Left < 2 then Image1.Left :=2;
if Image1.Top < 2 then Image1.top:=2;
if Image1.Left + Image1.Width + 2 >= Image1.Parent.Width then Image1.Left :=Image1.Parent.Width -Image1.Width -3;
if Image1.Top + Image1.Height + 2 >= Image1.Parent.Height then Image1.Top :=Image1.Parent.Height -Image1.Height -3;
Image2.Refresh;
AttachControl(Image1) ;
end;

end.
kxy 2000-01-10
  • 打赏
  • 举报
回复
>>一个用delphi做的delphi俄罗斯人写的.
我试过,好像不能实现JiRen的要求
渤海海峡 2000-01-10
  • 打赏
  • 举报
回复
除了delphi高级开发指南(本地好象有他的例子程序下载),您还可以看看
delphi深度历险中的一个范例程序:一个用delphi做的delphi,名字是:handel.zip
下载地址:
http://vcl.vclxx.com/DELPHI/D32SAMPL/HANDEL.ZIP
darkness 2000-01-10
  • 打赏
  • 举报
回复
你给特定一批控件以相同的Tag号
然后按照上面所说即可
Tform.componentcount form 上控件个数
用个for循环即可
darkness 2000-01-10
  • 打赏
  • 举报
回复
使用Tform.components[i],i 即为componentindex,可在调试时知道其对应关系
Tformclick(sender:object) 可以动态响应只要
if sender is Tcomponent(你的控件) then
(sender as Tcomponent).visible:=false;
hubdog 2000-01-10
  • 打赏
  • 举报
回复
>>那么实现在每个被选中的按钮上画四个小灰块有什么高招没有.
关于这个问题,看delphi高级开发指南(marco Cantu写的),P277-285页(88元,物超所值)
太长了,我没法贴,我连这也太慢
hubdog 2000-01-09
  • 打赏
  • 举报
回复
>>清楚一点!是否要求拉出一个框来选中一批控件?我想如果你说清楚了的话我可以提供你一些帮助
如果是这样的话,很容易解决
Firing_Sky 2000-01-08
  • 打赏
  • 举报
回复
说清楚一点!是否要求拉出一个框来选中一批控件?我想如果你说清楚了的话我可以提供你一些帮助
GetWay 2000-01-08
  • 打赏
  • 举报
回复
关注!
zyb 2000-01-07
  • 打赏
  • 举报
回复
你是否要实现鼠标拖动选中的功能?
kxy 2000-01-07
  • 打赏
  • 举报
回复
去找找DreamContorl的控件包,它能实现.

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧