关于动态生成控件的问题1

futureyre 2003-10-15 07:44:19
听大侠的话,问题一个一个问,呵呵

问题1:动态生成几个控件,如何判断哪个控件被选中进行拖放/缩放?(动态生成的控件的唯一标识是什么?)
比如,在RichEdit上动态产生2个控件,产生第1个时可以对1进行拖放,然后再产生
第2个时可以对2进行拖放,但是这时就不能对1进行拖放了,这时对1进行拖放还是2在拖放,而1没有反应,请教是什么原因?
注:动态产生的控件是一个链表结构,每动态生成一个控件就加入链表中
相关代码如下:
TDataFieldList=^DFL;
DFL=Record
DataField:TRichEdit;
Name:string;
XPos:integer;
YPos:integer;
Next:TDataFieldList;
end;

var DataFieldList:TDataFieldList;
AEdt:TRichEdit;

procedure TFormDataField.EdtOnDragOver(Sender,Source:TObject;X,Y:Integer;
State:TDragState;var Accept:Boolean);
var p:TDataFieldList;
begin
p:=DataFieldList;
while Source<>p.DataField do//判断是哪个控件被拖放
p:=p.Next;
// if Source=AEdt then
Accept:=True;
FormNew.isDragFormNew:=True;
end;

...全文
93 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzh54zzh 2003-10-21
  • 打赏
  • 举报
回复
用我的方法吧~
这样只要你建的Image都可以进行移动和拖放。
不存在你的:
---在RichEdit上动态产生2个控件,产生第1个时可以对1进行拖放,然后再产生
第2个时可以对2进行拖放,但是这时就不能对1进行拖放了,这时对1进行拖放还是2在拖放,而1没有反应---这种问题!
^_^
zzh54zzh 2003-10-21
  • 打赏
  • 举报
回复
这里又开了一个贴子???


我把那个问题绕着解决了^_^
你肯定是TLabel不能拖动,TEdit控件没有问题。
我认为和它们的祖先类有关。从TWinControl继承的进行拖动与缩放都没有问题。TLabel和TImage都没有从TWinControl继承来,无法缩放。而TEdit和TButton都是从TWinControl继承的,它们的拖动和缩放没有问题。
我的实现方法是:
把TImage或TLabel没有从TWinControl分支下来的类控件放到一个Panel上,也就是让Panel来承当它们的载体(TPanel是由TWinControl继承下来的)。那个拖动过程对Panel进行控制。测试成功。你试试吧^_^

……
procedure ManipulateControl(WinControl: TControl; Shift: TShiftState;
X, Y, Precision: integer);
//Precision:精度,该方法可以在onmousemove中调用
var
SC_MANIPULATE: Word;
begin
//光标在控件的最左侧
if (X<=Precision) and (Y>Precision) and (Y<WinControl.Height-Precision) then
begin
SC_MANIPULATE := $F001;
WinControl.Cursor := crSizeWE;

end
else
//光标在控件的最右侧
if (X>=WinControl.Width-Precision) and (Y>Precision) and (Y<WinControl.Height-Precision) then
begin
SC_MANIPULATE := $F002;
WinControl.Cursor := crSizeWE;
end
else
//光标在控件的最上侧
if (X>Precision) and (X<WinControl.Width-Precision) and (Y<=Precision) then
begin
SC_MANIPULATE := $F003;
WinControl.Cursor := crSizeNS;
end
else
//光标在控件的最下侧
if (X>Precision) and (X<WinControl.Width-Precision) and (Y>=WinControl.Height-Precision) then
begin
SC_MANIPULATE := $F006;
WinControl.Cursor := crSizeNS;
end
else
//光标在控件的左上角
if (X<=Precision) and (Y<=Precision) then
begin
SC_MANIPULATE := $F004;
WinControl.Cursor := crSizeNWSE;
end
else
//光标在控件的右上角
if (X>=WinControl.Width-Precision) and (Y<=Precision) then
begin
SC_MANIPULATE := $F005;
WinControl.Cursor := crSizeNESW ;
end
else
//光标在控件的左下角
if (X<=Precision) and (Y>=WinControl.Height-Precision) then
begin
SC_MANIPULATE := $F007;
WinControl.Cursor := crSizeNESW;
end
else
//光标在控件的右下角
if (X>=WinControl.Width-Precision) and (Y>=WinControl.Height-Precision) then
begin
SC_MANIPULATE := $F008;
WinControl.Cursor := crSizeNWSE;
end
else
//光标在控件的客户区(移动整个控件)
if (X>5) and (Y>5) and (X<WinControl.Width-5) and
(Y<WinControl.Height-5) then
begin
SC_MANIPULATE := $F009;
WinControl.Cursor := crSizeAll;
end
else
begin
SC_MANIPULATE := $F000;
WinControl.Cursor := crDefault;
end;
if Shift=[ssLeft] then
begin
ReleaseCapture;
WinControl.Perform(WM_SYSCOMMAND, SC_MANIPULATE, 0);
end;
end;

//建立Timage及TPanel,用Panel作为image的载体。且对Image赋予OnMouseMove过程。
procedure TForm1.Button1Click(Sender: TObject);
var
AJpg: TImage;
APanel: TPanel;
begin
if Form1.OpenPictureDialog1.Execute then
begin
APanel := TPanel.Create(Form1.RichEditNew);
APanel.Align := alnone;
APanel.BevelOuter := bvNone;
APanel.Width := Trunc(Form1.RichEditNew.Width/2);
APanel.Height := Trunc(Form1.RichEditNew.Height/2);
APanel.Parent := Form1.RichEditNew;

AJpg := TImage.Create(APanel);
AJpg.OnMouseMove := FMouseMove;
AJpg.Parent := APanel;
AJpg.Stretch := True;
AJpg.Align := alclient;
AJpg.Picture.LoadFromFile(Form1.OpenPictureDialog1.FileName);
end;
end;

//建立Image的OnMouseMove调用过程
procedure TForm1.FMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Caption := IntToStr(X) + '/' + IntToStr(Y);
ManipulateControl((TControl(Sender).Parent as TwinControl), Shift, X, Y, 10);
end;
……
futureyre 2003-10-21
  • 打赏
  • 举报
回复
呵呵,问题解决了
我把TEdit的dragkind,dragmode属性设置错了,现在可以了
至于TImage,就用我也要补钙大侠的方法了,呵呵
nyf1220 2003-10-21
  • 打赏
  • 举报
回复
呵呵,都是高手~~
futureyre 2003-10-20
  • 打赏
  • 举报
回复
谢谢先!那TImage怎么放大和缩小呢?请教。。。
pankun 2003-10-20
  • 打赏
  • 举报
回复
TImage和TLabel不是从TWinControl继承下来的,所以没有句柄,当然要出错.
TLabel你可以用TStaticText代替.

我的TEdit放大缩小正常啊?
futureyre 2003-10-20
  • 打赏
  • 举报
回复
楼上的大哥:
我是在TImage和TLabel控件的OnMouseMove事件中调用ManipulateControl过程,提示出错啊!
另外在TEdit中使用时还是只能拖动,不能放大和缩小,为什么啊?(我的TEdit是在TRichEdit上动态产生的)
向剑神一笑大侠和各位高手请教?
iLvXX1981 2003-10-18
  • 打赏
  • 举报
回复
真的不行吗?我怎么可以啊,我就是用上面的代码来着,多试几次。punkun Thank you!!
futureyre 2003-10-17
  • 打赏
  • 举报
回复
To:punkun(剑神一笑)
大侠,我按你的方法做,鼠标在控件上时变成可拖动/缩放状,但是并没有实际缩放啊,
(也就是光标形状变了,但控件本身还是不能被拖动/缩放)是不是还需要重新生成控件?谢啦!^_^
2312 2003-10-16
  • 打赏
  • 举报
回复
学习
vargent77 2003-10-16
  • 打赏
  • 举报
回复
学习
IORILI 2003-10-16
  • 打赏
  • 举报
回复
学习
helodd 2003-10-16
  • 打赏
  • 举报
回复
学习...
futureyre 2003-10-16
  • 打赏
  • 举报
回复
学习先。。。(搞定了马上给分)
pankun 2003-10-15
  • 打赏
  • 举报
回复
//==============================================================================

//任意摆布一个控件(拖动、放大、缩小)******************************************

//==============================================================================

procedure ManipulateControl(WinControl: TWinControl; Shift: TShiftState; X, Y, Precision: integer);//Precision:精度,该方法可以在onmousemove中调用

var SC_MANIPULATE: Word;

begin

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//光标在控件的最左侧**********************************************************

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

if (X<=Precision) and (Y>Precision) and (Y<WinControl.Height-Precision)

then begin

SC_MANIPULATE := $F001;

WinControl.Cursor := crSizeWE;

end

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//光标在控件的最右侧**********************************************************

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

else if (X>=WinControl.Width-Precision) and (Y>Precision) and (Y<WinControl.Height-Precision)

then begin

SC_MANIPULATE := $F002;

WinControl.Cursor := crSizeWE;

end

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//光标在控件的最上侧**********************************************************

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

else if (X>Precision) and (X<WinControl.Width-Precision) and (Y<=Precision)

then begin

SC_MANIPULATE := $F003;

WinControl.Cursor := crSizeNS;

end

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//光标在控件的左上角**********************************************************

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

else if (X<=Precision) and (Y<=Precision)

then begin

SC_MANIPULATE := $F004;

WinControl.Cursor := crSizeNWSE;

end

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//光标在控件的右上角**********************************************************

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

else if (X>=WinControl.Width-Precision) and (Y<=Precision)

then begin

SC_MANIPULATE := $F005;

WinControl.Cursor := crSizeNESW ;

end

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//光标在控件的最下侧**********************************************************

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

else if (X>Precision) and (X<WinControl.Width-Precision) and (Y>=WinControl.Height-Precision)

then begin

SC_MANIPULATE := $F006;

WinControl.Cursor := crSizeNS;

end

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//光标在控件的左下角**********************************************************

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

else if (X<=Precision) and (Y>=WinControl.Height-Precision)

then begin

SC_MANIPULATE := $F007;

WinControl.Cursor := crSizeNESW;

end

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//光标在控件的右下角**********************************************************

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

else if (X>=WinControl.Width-Precision) and (Y>=WinControl.Height-Precision)

then begin

SC_MANIPULATE := $F008;

WinControl.Cursor := crSizeNWSE;

end

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//光标在控件的客户区(移动整个控件)******************************************

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

else if (X>5) and (Y>5) and (X<WinControl.Width-5) and (Y<WinControl.Height-5)

then begin

SC_MANIPULATE := $F009;

WinControl.Cursor := crSizeAll;

end

else begin

SC_MANIPULATE := $F000;

WinControl.Cursor := crDefault;

end;

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

if Shift=[ssLeft] then

begin

ReleaseCapture;

WinControl.Perform(WM_SYSCOMMAND, SC_MANIPULATE, 0);

end;

end;


调用例子:
procedure TForm_Main.Button1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);

begin

Caption := IntToStr(X) + '/' + IntToStr(Y);

ManipulateControl((Sender as TWinControl), Shift, X, Y, 10);

end;
tanqth 2003-10-15
  • 打赏
  • 举报
回复
up

5,379

社区成员

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

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