听大侠的话,问题一个一个问,呵呵问题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;
比如,在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;
调用例子:
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;
大侠,我按你的方法做,鼠标在控件上时变成可拖动/缩放状,但是并没有实际缩放啊,
(也就是光标形状变了,但控件本身还是不能被拖动/缩放)是不是还需要重新生成控件?谢啦!^_^
我是在TImage和TLabel控件的OnMouseMove事件中调用ManipulateControl过程,提示出错啊!
另外在TEdit中使用时还是只能拖动,不能放大和缩小,为什么啊?(我的TEdit是在TRichEdit上动态产生的)
向剑神一笑大侠和各位高手请教?
TLabel你可以用TStaticText代替.我的TEdit放大缩小正常啊?
我把那个问题绕着解决了^_^
你肯定是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;
……
这样只要你建的Image都可以进行移动和拖放。
不存在你的:
---在RichEdit上动态产生2个控件,产生第1个时可以对1进行拖放,然后再产生
第2个时可以对2进行拖放,但是这时就不能对1进行拖放了,这时对1进行拖放还是2在拖放,而1没有反应---这种问题!
^_^
我把TEdit的dragkind,dragmode属性设置错了,现在可以了
至于TImage,就用我也要补钙大侠的方法了,呵呵