我的主界面有一个MDIFORM,一个TOOLBAR,一个OUTLOOKBAR,一个MDICHILDFORM问一: 当按下TOOLBAR上的一个按钮时来删除MDICHILDFORM中的一个控件?
我是不知道如何来写语句,我想在TOOLBAR的一个BUTTON的CLICK事件中写,但是在MDICHILDFORM中有很多控件,比如我用鼠标点了某个控件,在按一下TOOLBAR上的那个表示删除的BUTTON来删这个控件,我不知道这个语句应该怎么写?
问二,源代码如下:
unit MDIChildUnit;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,ExtCtrls,StdCtrls,USwitchO,USwitchTriangle,UResistant,UTransformerC,
DB, ADODB, MainUnit, Menus;type
TMDIChildFrm = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
procedure NewMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X,Y: Integer);
procedure NewMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
procedure NewMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X,Y: Integer);
public
procedure CreateComponent(var PName: String; PRealName: String); end;var
MDIChildFrm: TMDIChildFrm;
//移动中判鼠标是否落在边上
SideNumber: Integer;
//动态生成的控件
FResistant: TResistant;
FTransformerC: TTransformerC;
FSwitchTriangle: TSwitchTriangle;
FSwitchO: TSwitchO;
FMemo: TMemo;
//MOUSE事件中要用到的变量
StartPoint: TPoint;
OldLeft,OldTop: Integer;
OldWidth,OldHeight: Integer;
//判鼠标是否按下
IfMouseDown: Boolean;
implementation{$R *.dfm}//关闭MDICHILDFRM
procedure TMDIChildFrm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
end;//动态创建电阻符号
procedure TMDIChildFrm.CreateComponent(var PName: String; PRealName: String);
begin
if PName = 'TransformerC' then
begin
FTransformerC := TTransformerC.Create(Self);
with FTransformerC do begin
Parent := MainFrm.MDIChildren[0];
Left := 50;
Top := 50;
Width := 32;
Height := 32;
Name := PRealName;
Pen.Style := PublicPenStyle;
Pen.Color := PublicPenColor;
Pen.Width := PublicPenWidth;
OnMouseDown := NewMouseDown;
OnMouseMove := NewMouseMove;
OnMOuseUp := NewMouseUp;
end;
end;
end;
//动态创建的器件的MOUSEDOWN事件
procedure TMDIChildFrm.NewMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X,Y: Integer);
begin
if (Button = mbLeft) and (Sender is TGraphicControl) then
IfMouseDown := true
else
begin
IfMouseDown := False;
Exit;
end;
StartPoint.X := X;
StartPoint.Y := Y;
OldLeft := (Sender as TGraphicControl).Left;
OldTop := (Sender as TGraphicControl).Top ;
OldWidth := (Sender as TGraphicControl).Width;
OldHeight := (Sender as TGraphicControl).Height;
[red] 出错处。[/red]
Canvas.Pen.Style := psDash;
Canvas.MoveTo(OldLeft,OldTop);
Canvas.LineTo(OldLeft+OldWidth,OldTop);
Canvas.MoveTo(OldLeft+OldWidth,OldTop);
Canvas.LineTo(OldLeft+OldWidth,OldTop+OldHeight);
Canvas.MoveTo(OldLeft+OldWidth,OldTop+OldHeight);
Canvas.LineTo(OldLeft,OldTop+OldHeight);
Canvas.MoveTo(OldLeft,OldTop+OldHeight);
Canvas.LineTo(OldLeft,OldTop); //判点是不是在四条边上
if (X>=0) and (X<=OldWidth) and (Y=0) and (Y<=2) then //上
begin
SideNumber := 1;
(Sender as TGraphicControl).Cursor := crSizeNS;
end
else
begin
if (X=0) and (X<=2) and (Y>=0) and (Y<=OldHeight) then //左
begin
SideNumber := 2;
(Sender as TGraphicControl).Cursor := crSizeWE;
end
else
begin
if (X>=0) and (X<=OldWidth) and (Y>=OldHeight-2) and (Y<=OldHeight) then //下
begin
SideNumber := 3;
(Sender as TGraphicControl).Cursor := crSizeNS;
end
else
begin
if (X<=OldWidth) and (X>=OldWidth -2 ) and (Y>=0) and (Y<=OldHeight) then //右
begin
SideNumber := 4;
(Sender as TGraphicControl).Cursor := crSizeWE;
end
else
begin
SideNumber := 5;
(Sender as TGraphicControl).Cursor := crDrag;
end;
end;
end;
end;
end;
。。end.每次运行到CANVAS是就出现EACCESSVIOLATION错误,我想这应该跟是否全局变量没有什么关系吧,CANVAS是TFoRM的一个方法,我不知道怎么会出错?
还有一个今天新碰到的问题,我想在MDICHILDFORM中的动态生成的控件中点击右键时弹出一个POPUPMENU菜单,源代码如下:
unit MDIChildUnit;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,ExtCtrls,StdCtrls,USwitchO,USwitchTriangle,UResistant,UTransformerC,
DB, ADODB, MainUnit, Menus;type
TMDIChildFrm = class(TForm)
pop: TPopupMenu;
DeleteItem: TMenuItem;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure DeleteItemClick(Sender: TObject); private
procedure NewMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X,Y: Integer);
procedure NewMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
procedure NewMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X,Y: Integer);
public
procedure CreateComponent(var PName: String; PRealName: String); end;var
MDIChildFrm: TMDIChildFrm;
//移动中判鼠标是否落在边上
SideNumber: Integer;
//动态生成的控件
FResistant: TResistant;
FTransformerC: TTransformerC;
FSwitchTriangle: TSwitchTriangle;
FSwitchO: TSwitchO;
FMemo: TMemo;
//MOUSE事件中要用到的变量
StartPoint: TPoint;
OldLeft,OldTop: Integer;
OldWidth,OldHeight: Integer;
//判鼠标是否按下
IfMouseDown: Boolean;
implementation{$R *.dfm}//关闭MDICHILDFRM
procedure TMDIChildFrm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
end;//动态创建电阻符号
procedure TMDIChildFrm.CreateComponent(var PName: String; PRealName: String);
begin
if PName = 'TransformerC' then
begin
FTransformerC := TTransformerC.Create(Self);
with FTransformerC do begin
Parent := MainFrm.MDIChildren[0];
Left := 50;
Top := 50;
Width := 32;
Height := 32;
Name := PRealName;
Pen.Style := PublicPenStyle;
Pen.Color := PublicPenColor;
Pen.Width := PublicPenWidth;
OnMouseDown := NewMouseDown;
OnMouseMove := NewMouseMove;
OnMOuseUp := NewMouseUp;
end;
end;
end;
//动态创建的器件的MOUSEDOWN事件
procedure TMDIChildFrm.NewMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X,Y: Integer);
begin
if (Button = mbRight) then
pop.Popup(x,y) ;
if (Button = mbLeft) and (Sender is TGraphicControl) then
IfMouseDown := true
else
begin
IfMouseDown := False;
Exit;
end;
。。end.每次运行到POP。POPUP(X,Y);就出错,错误的原因跟上面的一样,也是eaccessviolation,但是我在另外的新建的MDIFORM和MDICHILDFORM里试了一下,却没有什么问题,我觉得很奇怪,为什么会这样?
我是不知道如何来写语句,我想在TOOLBAR的一个BUTTON的CLICK事件中写,但是在MDICHILDFORM中有很多控件,比如我用鼠标点了某个控件,在按一下TOOLBAR上的那个表示删除的BUTTON来删这个控件,我不知道这个语句应该怎么写?
问二,源代码如下:
unit MDIChildUnit;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,ExtCtrls,StdCtrls,USwitchO,USwitchTriangle,UResistant,UTransformerC,
DB, ADODB, MainUnit, Menus;type
TMDIChildFrm = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
procedure NewMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X,Y: Integer);
procedure NewMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
procedure NewMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X,Y: Integer);
public
procedure CreateComponent(var PName: String; PRealName: String); end;var
MDIChildFrm: TMDIChildFrm;
//移动中判鼠标是否落在边上
SideNumber: Integer;
//动态生成的控件
FResistant: TResistant;
FTransformerC: TTransformerC;
FSwitchTriangle: TSwitchTriangle;
FSwitchO: TSwitchO;
FMemo: TMemo;
//MOUSE事件中要用到的变量
StartPoint: TPoint;
OldLeft,OldTop: Integer;
OldWidth,OldHeight: Integer;
//判鼠标是否按下
IfMouseDown: Boolean;
implementation{$R *.dfm}//关闭MDICHILDFRM
procedure TMDIChildFrm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
end;//动态创建电阻符号
procedure TMDIChildFrm.CreateComponent(var PName: String; PRealName: String);
begin
if PName = 'TransformerC' then
begin
FTransformerC := TTransformerC.Create(Self);
with FTransformerC do begin
Parent := MainFrm.MDIChildren[0];
Left := 50;
Top := 50;
Width := 32;
Height := 32;
Name := PRealName;
Pen.Style := PublicPenStyle;
Pen.Color := PublicPenColor;
Pen.Width := PublicPenWidth;
OnMouseDown := NewMouseDown;
OnMouseMove := NewMouseMove;
OnMOuseUp := NewMouseUp;
end;
end;
end;
//动态创建的器件的MOUSEDOWN事件
procedure TMDIChildFrm.NewMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X,Y: Integer);
begin
if (Button = mbLeft) and (Sender is TGraphicControl) then
IfMouseDown := true
else
begin
IfMouseDown := False;
Exit;
end;
StartPoint.X := X;
StartPoint.Y := Y;
OldLeft := (Sender as TGraphicControl).Left;
OldTop := (Sender as TGraphicControl).Top ;
OldWidth := (Sender as TGraphicControl).Width;
OldHeight := (Sender as TGraphicControl).Height;
[red] 出错处。[/red]
Canvas.Pen.Style := psDash;
Canvas.MoveTo(OldLeft,OldTop);
Canvas.LineTo(OldLeft+OldWidth,OldTop);
Canvas.MoveTo(OldLeft+OldWidth,OldTop);
Canvas.LineTo(OldLeft+OldWidth,OldTop+OldHeight);
Canvas.MoveTo(OldLeft+OldWidth,OldTop+OldHeight);
Canvas.LineTo(OldLeft,OldTop+OldHeight);
Canvas.MoveTo(OldLeft,OldTop+OldHeight);
Canvas.LineTo(OldLeft,OldTop); //判点是不是在四条边上
if (X>=0) and (X<=OldWidth) and (Y=0) and (Y<=2) then //上
begin
SideNumber := 1;
(Sender as TGraphicControl).Cursor := crSizeNS;
end
else
begin
if (X=0) and (X<=2) and (Y>=0) and (Y<=OldHeight) then //左
begin
SideNumber := 2;
(Sender as TGraphicControl).Cursor := crSizeWE;
end
else
begin
if (X>=0) and (X<=OldWidth) and (Y>=OldHeight-2) and (Y<=OldHeight) then //下
begin
SideNumber := 3;
(Sender as TGraphicControl).Cursor := crSizeNS;
end
else
begin
if (X<=OldWidth) and (X>=OldWidth -2 ) and (Y>=0) and (Y<=OldHeight) then //右
begin
SideNumber := 4;
(Sender as TGraphicControl).Cursor := crSizeWE;
end
else
begin
SideNumber := 5;
(Sender as TGraphicControl).Cursor := crDrag;
end;
end;
end;
end;
end;
。。end.每次运行到CANVAS是就出现EACCESSVIOLATION错误,我想这应该跟是否全局变量没有什么关系吧,CANVAS是TFoRM的一个方法,我不知道怎么会出错?
还有一个今天新碰到的问题,我想在MDICHILDFORM中的动态生成的控件中点击右键时弹出一个POPUPMENU菜单,源代码如下:
unit MDIChildUnit;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,ExtCtrls,StdCtrls,USwitchO,USwitchTriangle,UResistant,UTransformerC,
DB, ADODB, MainUnit, Menus;type
TMDIChildFrm = class(TForm)
pop: TPopupMenu;
DeleteItem: TMenuItem;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure DeleteItemClick(Sender: TObject); private
procedure NewMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X,Y: Integer);
procedure NewMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
procedure NewMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X,Y: Integer);
public
procedure CreateComponent(var PName: String; PRealName: String); end;var
MDIChildFrm: TMDIChildFrm;
//移动中判鼠标是否落在边上
SideNumber: Integer;
//动态生成的控件
FResistant: TResistant;
FTransformerC: TTransformerC;
FSwitchTriangle: TSwitchTriangle;
FSwitchO: TSwitchO;
FMemo: TMemo;
//MOUSE事件中要用到的变量
StartPoint: TPoint;
OldLeft,OldTop: Integer;
OldWidth,OldHeight: Integer;
//判鼠标是否按下
IfMouseDown: Boolean;
implementation{$R *.dfm}//关闭MDICHILDFRM
procedure TMDIChildFrm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
end;//动态创建电阻符号
procedure TMDIChildFrm.CreateComponent(var PName: String; PRealName: String);
begin
if PName = 'TransformerC' then
begin
FTransformerC := TTransformerC.Create(Self);
with FTransformerC do begin
Parent := MainFrm.MDIChildren[0];
Left := 50;
Top := 50;
Width := 32;
Height := 32;
Name := PRealName;
Pen.Style := PublicPenStyle;
Pen.Color := PublicPenColor;
Pen.Width := PublicPenWidth;
OnMouseDown := NewMouseDown;
OnMouseMove := NewMouseMove;
OnMOuseUp := NewMouseUp;
end;
end;
end;
//动态创建的器件的MOUSEDOWN事件
procedure TMDIChildFrm.NewMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X,Y: Integer);
begin
if (Button = mbRight) then
pop.Popup(x,y) ;
if (Button = mbLeft) and (Sender is TGraphicControl) then
IfMouseDown := true
else
begin
IfMouseDown := False;
Exit;
end;
。。end.每次运行到POP。POPUP(X,Y);就出错,错误的原因跟上面的一样,也是eaccessviolation,但是我在另外的新建的MDIFORM和MDICHILDFORM里试了一下,却没有什么问题,我觉得很奇怪,为什么会这样?
解决方案 »
- 请教一个问题:定义为pchar类型的变量是不是一定要释放内存
- 谁帮我看一下是什么错误?
- 截取最小化消息
- 如何用delphi制作象打开word时出现的几秒的logo?
- 在TStringGrid想使用指定的Color来填充Cell,为什么用Canvas.Rectangle或Canvas.FillRect都不行
- 哪有关于工资管理系统方面的东东?
- Delphi有这样的函数吗?
- 帮忙http://www.csdn.net/Expert/topic/438/438171.shtm
- SQL Server7 的问题...
- 如何检测鼠标的箭头由缺省状态变成了一个手的形状(我的程序在后台运行)?
- fastreport如何控制类似最后一条记录的某个字段不显示?
- 数据同步问题!!!
问题2:太长了没有时间看!!!
Canvas.MoveTo(OldLeft,OldTop);
Canvas.LineTo(OldLeft+OldWidth,OldTop);
Canvas.MoveTo(OldLeft+OldWidth,OldTop);
Canvas.LineTo(OldLeft+OldWidth,OldTop+OldHeight);
Canvas.MoveTo(OldLeft+OldWidth,OldTop+OldHeight);
Canvas.LineTo(OldLeft,OldTop+OldHeight);
Canvas.MoveTo(OldLeft,OldTop+OldHeight);
Canvas.LineTo(OldLeft,OldTop);
但是运行时提示eaccessviolation错误,我设了断点,发现mdichildfrm为nil,我就用
if mdichildfrm = nil then
mdichildfrm := TMdichildfrm.create(Self);
但是这样一来就有两个窗口,这样不行,我只要一个窗口,我用active也不行,有没有什么别的好办法?
------问题1:定义一个全局的变量removeComponent:TComponent在你的所有要删除的控件的OnMouseDown事件中记录下该控件,然后在需要时删除就可以了!这样好象不行吧,因为窗口上有很多动态生成的控件,都用同一个MOUSEDOWN事件的.